Что именно является прерыванием? - PullRequest
5 голосов
/ 21 марта 2019

Я хочу понять, что именно является прерыванием для моего проекта аналогичного процессора 6502 в Logisim.Я знаю, что прерывание выполняет следующие шаги:

  1. Останавливает обработку текущей программы
  2. Сохраняет все незаконченные данные в стек
  3. Делает "ЧТО-ТО"
  4. Загружает незаконченные данные и позволяет программе продолжать нормально работать.

    Мой вопрос: что происходит во время этого " ЧТО-ТО " шага?Перенаправляется ли счетчик программ на специальную программу, которая будет выполняться?Что-то вроде чтения ASCII-кода нажатой кнопки и сохранения его в регистр или какую-то ячейку памяти?Если да, то где эта специальная программа обычно хранится в памяти?И можете ли вы сделать такой процессор, который будет обрабатывать различные виды прерываний?Может быть, если вы нажмете кнопку «а», то его ASCII будет сохранен в регистре А, но если вы нажмете кнопку «б», то он будет сохранен в регистре Х?

ЛюбойПомощь очень ценится.

Редактировать: Спасибо всем за ответы.Я многому научился и теперь могу приступить к своему проекту.

Ответы [ 3 ]

11 голосов
/ 21 марта 2019

Мой вопрос: что происходит во время этого шага "ЧТО-ТО"? Перенаправляется ли счетчик программ на специальную программу, которая будет выполняться?

Что происходит с маскируемым прерыванием 6502, так это:

  • прерывание повышено (под этим я подразумеваю, что вывод прерывания на чипе принудительно установлен на низкое значение.
  • когда пришло время выполнить новую инструкцию, 6502 проверяет, низкий ли вывод прерывания и не установлена ​​ли маска прерывания в регистре состояния. Если это не тот случай, т. Е. Если вывод прерывания высокий или маска прерывания высока, то ЦП просто продолжает работу.
  • Предполагая, что требуется прерывание, ЦПУ сохраняет ПК в стеке
  • Затем CPU сохраняет регистр состояния в стеке, но с битом B, установленным в 0. Бит B - это бит "break". Для команды BRK оно будет установлено равным 1, и это единственный способ определить разницу между аппаратным прерыванием и командой BRK.
  • Затем центральный процессор выбирает адрес в местоположениях $FFFE и $FFFF и вставляет его в ПК, поэтому выполнение начинается снова с этого адреса.

Это все, что он делает. Все остальное остается за программистом, пока программист не выполнит RTI, затем слово состояния и адрес возврата извлекаются из стека и восстанавливаются в их соответствующие регистры. Программист несет ответственность за сохранение любых регистров и других данных.

Перенаправляется ли счетчик программ в специальную программу для выполнения? Что-то вроде чтения ASCII-кода нажатой кнопки и сохранения его в регистр или какую-либо ячейку памяти?

Это правильно. В компьютерных системах на основе 6502 в верхней части памяти находятся три вектора:

$FFFA - $FFFB: немаскируемое прерывание (как указано выше, за исключением того, что бит I в регистре состояния игнорируется).

$FFFC - $FFFD: вектор сброса, используемый, когда ЦП обнаруживает сброс

$FFFE - $FFFF: нормальный вектор прерывания.

Выше приведено в ПЗУ, потому что вектор сброса (как минимум) должен присутствовать при включении процессора. Каждый адрес будет указывать на подпрограмму в операционной системе машины для обработки прерываний.

Обычно процедура прерывания сначала выполняет косвенный переход по вектору, хранящемуся в ОЗУ. Это позволяет изменять процедуру прерывания во время работы машины.

Тогда процедура прерывания должна определить источник прерывания. Например, на Commodore PET прерывание может происходить от микросхемы VIA или любой микросхемы PIA, и каждая из них может вызывать прерывание по разным причинам, например. одна из микросхем PIA вызывает прерывание, когда монитор выполняет вертикальную заглушку, то есть когда он заканчивает сканирование экрана и возвращается к верхней строке. Во время этого прерывания PET выполняет подпрограмму для сканирования клавиатуры и другую подпрограмму для инвертирования курсора. Другое прерывание может произойти, когда таймер VIA достигнет нуля, и программист может вставить подпрограмму прерывания, например, для переключения выходной линии для генерации прямоугольной волны для звука.


Некоторые ответы на вопросы в комментариях.

программный счетчик переходит на адрес $ FFFE, чтобы переместиться на адрес

Нет, счетчик программы установлен на то, что находится по этому адресу. Если у вас есть:

FFFE: 00 
FFFF: 10

счетчик программы будет установлен на $1000 (6502 - младший порядок), и именно здесь должна начинаться процедура прерывания. Кроме того, вектор для NMI находится на $FFFA. Обычное прерывание делится $FFFE с инструкцией BRK, а не с NMI.

Что именно делает вектор сброса? Сбрасывает ли он процессор?

Вектор сброса содержит местоположение кода, который запускается после , когда процессор был включен или когда происходит сброс.

В чем разница между NMI и IRQ?Тогда я также хотел бы знать, что случилось с маскировкой?Это способ установить флажок «I» в регистре состояния процессора на высокий или низкий уровень?

Регистр состояния 6502 содержит семь флагов.В основном они связаны с результатами арифметических инструкций, например, Z устанавливается, если результат операции равен нулю, C устанавливается, когда операция переполняет восемь битов и для сдвигов.Флаг I включает и отключает нормальное прерывание (IRQ).Если он равен нулю, прерывания по IRQ будут учитываться.Если это 1, прерывания отключены.Вы можете установить и отключить его вручную с помощью инструкций SEI и CLI, и оно устанавливается автоматически при возникновении прерывания (это предотвращает прерывание прерывания прерыванием).

NMI не являетсямаскируемое прерывание.Разница в том, что он игнорирует состояние флага I и использует другой вектор.

И, наконец, что такое векторы?Являются ли они синонимами для косвенных адресов?

Да.

О, и если вы знаете, как адреса прерываний, начинающиеся с $ FFFA, хранятся в ПЗУ вместо ОЗУ внастоящий 6502?

Вы должны принять меры к тому, чтобы логика декодирования адресов указывала эти адреса в ПЗУ, а не в ОЗУ.Фактически, в системах Commodore весь блок из $F000 является ПЗУ, содержащим часть операционной системы.То же самое, вероятно, относится к большинству других систем на основе 6502.

3 голосов
/ 21 марта 2019

Существует четыре типа прерываний на 6502: RESET, NMI, IRQ и BRK. Первые три являются аппаратными прерываниями, а последний - программным прерыванием. Аппаратные прерывания имеют физические входные напряжения на контактах самого микропроцессора. Программное прерывание вызвано инструкцией BRK.

Все прерывания являются «векторными». Это означает, что когда они происходят, программный счетчик (ПК) немедленно загружается с адреса, сохраненного в памяти, и выполнение инструкции продолжается с этого адреса.

Адреса хранятся в виде двухбайтового формата с прямым порядком байтов в конце 64 КБ памяти. Они (в шестнадцатеричном формате):

NMI     $FFFA/$FFFB 
RESET   $FFFC/$FFFD
IRQ     $FFFE/$FFFF 
BRK     $FFFE/$FFFF

В случае NMI, IRQ и BRK текущий адрес ПК помещается в стек перед загрузкой адреса прерывания. Регистр состояния процессора также помещается в стек.

Передача регистров в стек, достаточно информации для возобновления выполнения после обработки прерывания (обработки). Однако регистры A, X и Y не помещаются в стек автоматически. Вместо этого подпрограмма обслуживания прерываний должна делать это при необходимости - и извлекать их обратно из стека в конце службы.

Обратите внимание, что векторы IRQ и BRK имеют одинаковый адрес. Чтобы отличить то, что произошло в вашем сервисном коде, вам нужно проверить бит разрыва регистра состояния обработанного процессора. Бит прерывания устанавливается, если прерывание пришло из инструкции BRK.

Выполняемая в данный момент инструкция всегда будет выполнена до обслуживания прерывания.

Есть много тонкостей для обработки прерываний. Одним из которых является то, какой тип прерывания выигрывает в том случае, если они происходят (утверждаются) одновременно. Еще одна точка, в которой происходит прерывание во время цикла инструкций. Если прерывание происходит до предпоследнего цикла инструкции, то оно будет обслуживаться при следующей инструкции. Если на или после предпоследнего цикла, то он будет отложен до одной инструкции после.

Прерывания IRQ можно «отключить» или игнорировать, установив бит в регистре состояния процессора с помощью инструкции SEI.

Обычно процедура обслуживания прерываний должна определить причину прерывания (дисковод, клавиатура и т. Д.) И убедиться, что условие прерывания очищено, и выполнить любую обработку (например, помещение нажатий клавиш в буфер). Обычно это можно сделать путем чтения / записи определенных областей памяти, которые сопоставлены с аппаратными средствами.

Более подробная информация по этой ссылке: https://www.pagetable.com/?p=410

Еще немного информации о том, как работают прерывания на реальном 8-битном компьютере (стр. 59, 86, 295): Расширенное руководство пользователя микрокомпьютера BBC

И дополнительная информация о физическом чип-пакете, где вы можете видеть выводы NMI, RES (ET) и IRQ на самом чип-пакете (стр. 2,3): 6502 Лист данных

1 голос
/ 21 марта 2019

Я полагаю, вы запрашиваете аппаратное прерывание (IRQ или NMI). На вашем шаге 2 в стеке (не в регистре стека) хранятся счетчик программ и регистр флагов. Позже вы звоните RTI, чтобы возобновить выполнение программы. В счетчик программ загружается начальный адрес «чего-то», который является подпрограммой прерывания или программой для обработки прерывания. Он должен хранить регистры A, X, Y, если необходимо изменить их значения и восстановить их до RTI. Прерывание IRQ может быть замаскировано (задержано) с флагом I, а NMI немаскируемый, то есть он всегда обрабатывается. У них разные адреса для подпрограммы.

...