Memory-Mapped I/O: Гениальный обман процессора

Как заставить процессор считывать нажатия кнопок на джойстике или рисовать пиксели на экране, если он умеет только читать и писать данные в оперативную память? Инженеры придумали гениальный хак, который называется Memory-Mapped I/O (ввод-вывод, отображаемый в память).

Суть в том, что мы берем несколько адресов, которые процессор считает обычной памятью, и тайком подключаем вместо них реальные физические устройства. Например, мы договариваемся, что адрес 254 (или 0xFE) — это не ячейка ОЗУ, а наш геймпад.

Процессор выполняет обычную команду «прочитать данные из адреса 254». Он уверен, что обращается к памяти, но на самом деле наш Адресный дешифратор перенаправляет этот запрос в контроллер геймпада. В ответ геймпад отправляет по шине байт, где каждый бит означает нажатую кнопку (Вверх, Вниз, Влево, Вправо). Точно так же работает и экран: процессор отправляет байт цвета по адресу 255, думая, что сохраняет переменную, а вместо этого на мониторе вспыхивает пиксель. Это настоящая иллюзия матрицы на аппаратном уровне!

Практический пример. В симуляторе, чтобы прочитать нажатие кнопки «Вверх» на геймпаде, процессор выполняет обычную инструкцию LDA 254. Он понятия не имеет, что общается с геймпадом — для него это просто чтение из памяти. Но адресный дешифратор перехватывает запрос и активирует контроллер геймпада. Тот выдаёт байт, где, скажем, бит 0=Вверх, бит 1=Вниз, бит 2=Влево, бит 3=Вправо. Процессор получил байт — и теперь программа знает, куда двигать персонажа.