Вчерашней ночью решил же писать эмулятор денди! О ДААА! 😀
Создал пустой проект, написал создание окошка, копирование 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.
Ок, хватит тут графоманствовать – ушёл обратно в мир ассемблера..