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