А.А. Шубин
Использование специальных прерываний БК 0010
Рассмотрим два, довольно интересных, вектора прерываний: по адресу 10 и по адресу 14.
Хорошо известно, что в систему команд процессора БК входят далеко не все коды, в диапазоне 0...177777. "Запрещённые" коды используются другими, более мощными процессорами с расширенной системой команд и совместимыми с процессором БК сверху вниз, например, К1801ВМЗ, установленный на ДВК-4.
Так что же делает ЦП БК 0010, когда встречает "несуществующую" команду? ЦП, в таком случае, передаёт управление по вектору 10. Можно установить этот вектор на нужный нам адрес, а там разместить подпрограмму, имитирующую расширенную систему команд, или делающую что-нибудь иное. По существу, мы получим ещё одно командное прерывание наряду с TRAP, EMT, IOT и BPT. Можно по этому вектору разместить свой диспетчер "запретных" кодов (список нестандартных команд довольно большой).
Диапазоны резервных кодов: 7-77, 210-237, 6500-6677, 6700-7777, 167100-177777.
Из этого списка видно, что резервные команды в диапазоне 0-177777 расположены неравномерно. И если их задействовать как командные прерывания по типу ЕМТ и TRAP, то имеет смысл использовать три последних интервала. Младший байт команды будет се аргументом.
Диспетчер для последнего интервала резервных кодов.
Аргумент начинается со ста.
MOV R5,-(SP) MOV 2(SP),R5 MOV -(R5),R5 BIC #177400,R5 ; выделяем младший байт CMP #100,R5 BGT RE JSR PC,@адр(Р5) ; адр - начало списка адресов подпрограмм обработки прерывания RE: MOV (SP)+, R5 RTI
ВНИМАНИЕ! КОДЫ 10-17 ПО ВЕКТОРУ 10 УПРАВЛЕНИЯ НЕ ПЕРЕДАЮТ. В ДАННОМ СЛУЧАЕ ПРОЦЕССОР ПЕРЕХОДИТ ПО ВЕКТОРУ 4, ИМИТИРУЯ HALT.
Эти коды нельзя рассматривать как резервные. Они, очевидно, не предусмотрены таковыми быть, даже в проекте.
Здесь мы умолчали о некоторых командах, коды которых расположены между 241 и 277. Это тридцать команд работы с признаками. Десять из них всем известны, они описаны в руководстве БК и используются во всех ассемблерных системах. Но почему-то остальные двадцать нигде не фигурируют. Эти команды устанавливают и снимают признаки парами и тройками, в отличие от "стандартных", работающих с одним или четырьмя признаками (см. таблицу).
Далее рассмотрим вектор 14 - прерывание для пошагового режима.
Данный режим в БК поддержан процессором и включается при наличии 1 в пятом разряде регистра признаков (так называемый Т-разряд, то же, почему- то, не описанный в руководстве системного программиста).
При установке признака Т в единицу, процессор начинает выполнять команду по адресу, содержащемуся в PC - счётчике команд. Затем, как бы "отчитавшись" о проделанной работе, он переходит по вектору 14. Программа-отладчик, получившая управление, может просто закончить работу, в случае режима исполнения одной команды. При этом необходимо вершину стека сместить на исходное место, дабы не возникло, в определённый момент, его переполнение.
Если нужно продолжить исполнение отлаживаемой программы, в пошаговом режиме, то получив управление по вектору 14, необходимо сбросить Т-признак. В этот момент на текущей вершине стека находится адрес следующей команды, идущей после той, которую ЦП только что выполнил пошагово. Этот адрес нужно где-нибудь сохранить, лучше положить в ячейку ОЗУ, отведённую под собственный буфер программы-отладчика. После этих операций можно делать что угодно: например, распечатать содержимое регистров, адрес исполненной команды, её мнемоническое представление и т.д. Затем нужно остановить отладчик до нажатия клавиши. Далее необходимо вновь установить Т-признак и в счётчик команд PC положить адрес следующей трассируемой команды и всё это одновременно с выходом из прерывания по вектору 14 командой RTT (выход из спецпрерываний).
Делается это следующим образом.
Как известно, при возникновении любого прерывания, ЦП уменьшает указатель стека на 2, записывает в эту вершину своё слово состояния ССП из PS, затем стек смещается ещё на 2 и записывается адрес возврата из прерывания (адрес следующей команды). При выходе из прерывания командой RTT или RTI, извлекает из стека ССП и переписывает его в PS, потом в PC записывает из стека адрес возврата и продолжает выполнение программы.
Этим мы и воспользуемся.
Запишем из буфера адрес следующей трассируемой команды в текущую вершину стека, т.е. подменим адрес возврата для команды RTT, так как до того содержимое и указатель стека мы могли как угодно менять. Затем, увеличив указатель стека на 2, установить пятый бит в ССП, который то же в стеке, и выполнить RTT.
MOV BUF,@SP BIS #20,2(SP) RTT BUF: .#NNNN ; адрес следующей команды.
Команда RTT, при подобном способе, решает все проблемы: выходит из прерывания, что самое главное; устанавливает заново пошаговый режим, сохраняя логические признаки NZVC и передаёт управление на следующую команду отлаживаемой программы.
После её исполнения процессор вновь переходит по вектору 14 и цикл повторяется.
Здесь дано лишь схематическое описание механизма отладки, так сказать "для повышения квалификации" начинающего программиста. На деле же отладчики - довольно сложные программные средства, требующие от разработчика хороших знаний в программировании на ассемблере.
Таблица дополнительных команд (введена новая мнемоника)
Команда |
Код |
Признаки NZVC |
---|---|---|
Очистка VC |
000243 |
--00 |
Очистка VC |
000245 |
-0-0 |
Очистка ZV |
000246 |
-00- |
Очистка NC |
000251 |
0--0 |
Очистка NV |
000252 |
0-0- |
Очистка NZ |
000254 |
00-- |
Очистка ZVC |
000247 |
-000 |
Очистка NVC |
000253 |
0-00 |
Очистка NZC |
000255 |
00-0 |
Очистка NZV |
000256 |
000- |
Установка VC |
000263 |
--11 |
Установка ZC |
000265 |
-1-1 |
Установка ZV |
000266 |
-11- |
Установка NC |
000271 |
1--1 |
Установка MV |
000272 |
1-1- |
Установка NZ |
000274 |
11-- |
Установка ZVC |
000267 |
-111 |
Установка NVC |
000273 |
1-11 |
Установка NZC |
000275 |
11-1 |
Установка NZV |
000276 |
111- |