А.А. Шубин

Использование специальных прерываний БК 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-

 

Performed by © gid, 2012-2022.