Монитор-0 — различия между версиями

Материал из MK90.ORG wiki
Перейти к:навигация, поиск
Строка 5: Строка 5:
 
В [[UT88minimum|минимальной конфигурации]] [[Монитор-0]] получает управление после сброса (включение питания или нажатие кнопки "Уст"), после чего на крайних справа индикаторах выводится две единицы и [[Монитор-0]] ожидает ввод номера директивы (клавиши "0".."C"), а затем - параметров, которые набираются и отображаются в виде шестнадцатеричных цифр. Все параметры вводятся с ведущими нулями: если надо ввести адрес или слово, требуется четыре нажатия, если байт - два.
 
В [[UT88minimum|минимальной конфигурации]] [[Монитор-0]] получает управление после сброса (включение питания или нажатие кнопки "Уст"), после чего на крайних справа индикаторах выводится две единицы и [[Монитор-0]] ожидает ввод номера директивы (клавиши "0".."C"), а затем - параметров, которые набираются и отображаются в виде шестнадцатеричных цифр. Все параметры вводятся с ведущими нулями: если надо ввести адрес или слово, требуется четыре нажатия, если байт - два.
  
[[TapeFormat|Формат записи на магнитную ленту]] соответствует принятому в "МК-80".
+
[[TapeFormatRK86|Формат записи на магнитную ленту]] соответствует принятому в "МК-80".
  
 
=== Директивы ===
 
=== Директивы ===

Версия 06:48, 24 мая 2016

Монитор-0

Резидентная интерактивная программа, записанная в две микросхемы ПЗУ КР556РТ5, занимает 1 Кбайт и располагается по адресам 0000H..03FFH. Взаимодействие с пользователем ведется посредством шестнадцатеричной клавиатуры (16 клавиш "0".."F" и "Шаг назад") и шести семисегментных индикаторов (позволяет вывести три байта в шестнадцатеричном представлении).

В минимальной конфигурации Монитор-0 получает управление после сброса (включение питания или нажатие кнопки "Уст"), после чего на крайних справа индикаторах выводится две единицы и Монитор-0 ожидает ввод номера директивы (клавиши "0".."C"), а затем - параметров, которые набираются и отображаются в виде шестнадцатеричных цифр. Все параметры вводятся с ведущими нулями: если надо ввести адрес или слово, требуется четыре нажатия, если байт - два.

Формат записи на магнитную ленту соответствует принятому в "МК-80".

Директивы

Кнопка Аргументы Описание
0 АДР Побайтный ввод с клавиатуры в память, начиная с адреса АДР.
После нажатия "0" необходимо ввести параметр АДР - адрес, начиная с которого будет производиться запись. После ввода четвертой цифры, АДР отобразится на индикаторах HL, на индикаторе A высветится "00", после чего ожидается ввод последовательности байтов. После ввода каждого байта он секунду отображается на индикаторе A, затем HL инкрементируется и на A снова высвечивается "00".
1 - Побайтный ввод с клавиатуры в память, начиная с адреса C000.
После нажатия "1" на индикаторах HL высвечивается "C000", на индикаторе A - "00", далее ожидается ввод аналогично директиве "0".
2 - Просмотр содержимого памяти, начиная с адреса C000.
После нажатия "2" на индикаторах HL высвечивается "C000", на индикаторе A - содержимое памяти. Переход к следующей ячейке (листание) происходит нажатием любой клавиши.
3 - Тест светодиодных индикаторов.
После нажатия кнопки "3" на всех индикаторах последовательно отображаются шестнадцатеричные цифры от 0 до F.
4 - Тест ОЗУ
После нажатия "4" происходит последовательное тестирование ячеек ОЗУ, начиная с адреса C000. Тестирование заключается в последовательной записи и считывании - сначала 00, затем FF. Если прочитанное отличается от записанного, тест останавливается и выводит на экран проблемный адрес и прочитанное содержимое. Если тест успешно дошел до последней ячейки C3FF, то он тоже останавливается - при этом в разряды HL будет выведено "C400", а в A будет содержимое, которое читается из этого адреса (в классической минимальной конфигурации оно совпадает с C000). Помните, что содержимое ячеек ОЗУ (включая стек) будет уничтожено. Логично после завершения этой директивы нажать "Уст".
5 АДР Просмотр содержимого памяти, начиная с адреса АДР.
После нажатия кнопки "5" необходимо ввести параметр АДР - адрес, начиная с которого будет производиться чтение. Переход к следующей ячейке (листание) происходит по нажатию на любую клавишу.
6 - Пуск программы с адреса C000.
7 АДР Пуск программы с адреса АДР.
После ввода последней цифры АДР он отобразится на индикторах HL, после чего по нему будет передано управление.
8 АДР1 АДР2 Вычисление контрольной суммы для диапазона адресов памяти АДР1..АДР2.
После нажатия "8" нужно последовательно ввести АДР1 и АДР2, после чего вычисленная контрольная сумма отобразится на индикаторах HL.
9 АДР1 АДР2 Запись на магнитофон диапазона адресов памяти АДР1..АДР2.
После нажатия "9" нужно ввести четыре цифры АДР1 (начальный адрес), затем четыре цифры АДР2 (конечный адрес), при этом вывод в магнитофон начинается сразу после ввода последней цифры АДР2. Практическая рекомендация - вводить три цифры АДР2, затем включать запись на магнитофоне, после чего нажать на клавишу, соответствующую последней (четвертой) цифре АДР2. После завершения директивы на индикаторах HL высвечивается контрольная сумма выведенного фрагмента.
A АДР Считывание блока данных с магнитофона по смещению АДР
B - Индикация времени. После нажатия на клавишу B на индикаторы непрерывно выводится содержимое ячеек ОЗУ, хранящих текущее время. Поскольку инкрементирование происходит в двоично-десятичном режиме, то отображение читается как обычные бытовые часы, в формате ЧЧММСС.
C АДР Установка времени. Аналогична директиве "0", но перед вводом АДР запрещаются прерывания. Задумана как установка ячеек, хранящих текущее время, поэтому в качестве АДР надо ввести C3FD. Далее надо ввести секунды (C3FDH, обычно 00), минуты (C3FEH) и часы (C3FFH). Далее, дождавшись сигналов точного времени, нажать УСТ (прерывания будут разрешены и начат отсчет времени).

Распределение адресов

Физически и логически разделена на две части:

  1. 0000H..01FFH - все директивы
  2. 0200H..03FFH - вспомогательные программы, вызываются директивой 7

Описание подпрограмм

Адрес Описание Параметры
0000 RST0, холодный старт -
0008 RST1, вывод байта в магнитофон A = выводимый байт
000B Директива "5" Чтение байта из памяти по адресу
0010 RST2, ввод байта с клавиатуры A = введенный байт
0018 RST3, задержка 1 секунда
0020 RST4, проверка активности клавиатуры
0025 Директива "6" Пуск программы с адреса C000H
0028 RST5, вывод на индикаторы Выводятся H,L,A
0030 RST6, ввод слова с клавиатуры DE = введенное слово
0038 RST7, прерывание часов Вызывается аппаратно каждую секунду
003B Ожидание ввода директивы
0047 Вывести на индикатор содержимое А
0056 Задержка HL = число циклов задержки (для 1сек HL=0x6650, единица ~ 38 мкс)
005F Ожидание нажатия клавиши A = код нажатой клавиши
0071 Ввод байтовой последовательности с клавиатуры в память HL = начальный адрес ввода
007A Директива "2" Просмотр памяти с адреса C000H
007D Побайтовый вывод на индикатор содержимого памяти HL = начальный адрес вывода
0084 Директива "7"
008A Директива "1"
0090 Директива "C"
0091 Директива "0"
0096 Директива "3"
00A3 Директива "4"
00C1 Установка времени 0xC3FD - секунды, 0xC3FE - минуты, 0xC3FF - часы
00E7 Директива "9"
00EA Директива "A"
00ED Директива "8"
00F0 Директива "B"
0100 Запись байта А на магнитофон
0128 Чтение битовой последовательности в А с магнитофона вх. А=0xFF - поиск байта синхронизации и чтение старшего байта адреса загрузки, А=0x08 - чтение байта
0175 Вычисление контрольной суммы с ADDR1 по ADDR2 с выводом на индикатор
017D Вычисление контрольной суммы диапазона заданного BC и DE с выводом на индикатор
0194 Сравнение BC и DE (С=1 если DE>BC, Z=0 если DE=BC)
019A Запись на магнитофон диапазона с ADDR1 по ADDR2
01C2 Чтение с магнитофона в ОЗУ с ADDR1
01EE Чтение байта в А с магнитофона
01F5 Режим индикации текущего времени
0200 Копирование блока с ADDR1 по ADDR2 в ADDR3
0259 Сравнение HL и DE (С=1 если DE>HL, Z=0 если DE=HL)
025F Корректировка программы с ADDR1 по ADDR2 под новый адрес запуска ADDR3
02E5 Суперкорректор программы с ADDR1 по ADDR2 под новый адрес запуска ADDR3 для другого компьютера
0309 Замена в диапазоне с ADDR1 по ADDR2 адреса ADDR3 на ADDR4
035E Перемещение блока с ADDR1 по ADDR2 на ADDR1+1 (вставка байта) ADDR - место, куда надо вставить байт, ADDR2 - последний байт исходной программы.
Необходимо ввести подряд четыре байта, после этого на HL высветится ADDR1 и надо набрать вставляемый байт.
0388 Перемещение блока с ADDR1 по ADDR2 на ADDR1-1 (удаление байта)
03B2 Сравнение блока c ADDR1 по ADDR2 c блоком по ADDR3
03DD Вывод содержимого регистров на индикатор

Особенности

Располагаясь в младших адресах памяти, Монитор-0 активно использует однобайтовые инструкции RST N (вызов подпрограммы обработки прерывания по фиксированным адресам). Это уменьшает объем программы и увеличивает скорость выполнения.

Единственное используемое аппаратное прерывание - RST7 (секундное прерывание от часов).

Известные ошибки

  1. Обработка клавиши "Шаг назад" вызывается из подпрограммы чтения клавиатуры (RST4) таким образом, что фактически передает управление директиве записи байта в память. Получается, что из директивы вызывается RST4, откуда управление передается обратно в ту же директиву, но уже простым переходом (JMP, а не CALL!) - но только если нажата ШН. Это требует коррекции стека на одно слово, во избежании переполнения при слишком частых нажатиях на ШН. Однако вместо инкремента SP выполняется декремент, что соответствует не удалению, а добавлению в стек. К счастью, работа любой директивы Монитор-0 завершается сбросом (нажатием "Уст"), переустанавливающим SP в C3EE, поэтому вероятность проявления этой ошибки мала и зависит от общего количества нажатий на "ШН" в процессе ввода данных с клавиатуры в директивах "0" и "1".
  2. В обработчике прерываний RST7 происходит инкремент ячеек секунд/минут/часов с последующей десятичной коррекцией результата командой DAA. Однако результат работы DAA неверен, если перед входом в прерывание был установлен флаг переноса C. Эта ошибка приводит к практической невозможности использования аппаратных часов ЮТ-88 в пользовательских программах. Интересно, что в та же самая ошибка "перекочевала" в Монитор-F, в процедуру обработки прерывания, расположенную по адресу FFC1.

Дальнейший отказ от использования

После подключения дисплейного модуля, в составе которого есть свой Монитор-F, надобность в дублирующих функциях Монитор-0 отпадает.

В дальнейшем регулярно предлагается "выключить" Монитор-0 из адресного пространство, подключив вместо него дополнительное ОЗУ. Однако из-за того, что при включении питания компьютера управление передается по адресу 0000H, совсем отказаться от его использования в оригинальной конструкции нельзя. Также в Монитор-0 расположен обработчик прерывания RST7 (часы), поэтому его также требуется отключить (или запретить обработку командой DI).

Источники