Волшебный мир ассемблера :D

Вчерашней ночью решил же писать эмулятор денди! О ДААА! 😀

Создал пустой проект, написал создание окошка, копирование ROM-а в память. Cool!! What next?? o_O Эм… ээм.. вырубил всё нафиг и пошёл спать ; ) «Верное решение»(с)

Сегодня решил таки вернуться к вопросу, начал с гугления архитектуры Famicom. Этой системе уже куча лет, она жутко старая, но в инете так и нет нормальной полной скомпонованной инфы о ней. Приходится гуглить по кусочкам.

Окей, базовая инфа есть, почитал про CPU, PPU, APU, memory mapped IO и т.п. Ну это всё конечно весьма увлекательно, только представления о том, как это всё реально работает и как собсно это эмулировать досихпор нет! : Что-то типа «смотрим в книгу — видим фигу» Но.. останавливаться же не в моих правилах )

Пошёл потроллил в Skype чатике товарищей Utechenko V. O. и DDS, которые таки выдали чуток полезной мне инфы, в частности направили «на путь истинный» — посоветовали книги Владислава Пирогова, которые оказались весьма занимательными : )

Так я пришёл к мысли, что «блин, ведь давно пора выучить ассемблер» ! Используя книги, туториалы по программированию AVR микроконтроллеров, туториалы по ассемблеру, википедию, параллельно распивая зелёный чай, поедая сгущёнку и печатая очередной рендер из VRay матеря принтер за баги в печати начал постигать азы микроэлектроники, ассемблерного программирования.

Чёрт! Это чувство просто офигенно! Чувство, когда начинаешь понимать нечто ранее недосягаемое.. как звёзды ) Ещё вчера сидел тупил, не понимал _совершенно ничего_ в архитектуре и уже сегодня я знаю назначение северного, южного мостов, чипа CMOS, что такое защищённый режим процессора и как в него переходить ) Назначение APIC (контроллера прерываний) да и саму суть прерываний! Я раньше вообще не представлял что же это такое и нафига оно нужно! Я вообще думал что это какаято хардварная фича проца, которая вызывается через строго отведённый интервал и что-то шлёт в этот момент девайсам. Оказалось всё немного по-другому. APIC контроллер физически приаттачен к выводам девайсов на материнской плате. Девайсы могут слать сигналы прерываний, контроллер ставит соответствующий флаг, который ожидает обработки процессором. Если в процессоре глобально и локально прерывания не запрещены, то обрабатываются они по очереди следуя приоритету. Для каждого прерывания есть свой собственный обработчик! Т.е. — процессор проверяет, стоит ли флаг прерывания и если его можно выполнить — сохраняет состояние регистров (заливает значения в стек), переходит к обработчику прерывания и обрабатывает его, восстанавливает состояние регистров и продолжает выполнение программы.

Не понятен только один момент — ведь во время обработки прерывания могут ещё несколько раз прийти сигналы о необходимости выполнить одно и тоже прерывание! Ну то есть девайс запросит его несколько раз. Что тогда? Насколько я понял — все прерывания кроме последнего тупо пропускаются. Странно это всё. Понятно, что такое может произойти с минимальной вероятностью, но может же : )

Сделал загрузку ROM-а игры NES (выбрал SuperMarioBros как тестовую игру, ибо в нём самая простая архитектура картриджа — нету MemoryMapper-а и т.п.), набросал пока Dummy классы железа NES, обработчики нескольких опкодов процессора, разобрался с обработкой прерываний, обработал Reset.

Ушёл обратно в мир ассемблера..

0
0