пятница, 16 сентября 2011 г.

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

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

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

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

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

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

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

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

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

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

Ок, хватит тут графоманствовать - ушёл обратно в мир ассемблера..

5 комментариев:

  1. Хм, насколько я помню, если во время выполнения обработчика прерывания выполняется какое-либо (например, то же) прерывание, имеет место точно такой же прыжок в обработчик с сохранением адреса для последующего возврата в стеке -- т.е. nesting обработчиков нормальное дело. Чтобы прочистить мозги на весь этот счет, можно также почитать книжку Зубкова и особенно Рэнди Хайда ("The Art of Assembly Language" -- на английском, лучшая во всех отношениях книга из мне известных, главное только не спутать ее с книгой по High-level asm), а также (м.б.) DosRef (есть такая штука). Успехов, короче ;)

    ОтветитьУдалить
  2. Спасибо! Интересно, обязательно почитаю книгу : ) Но уже после того, как допишу эмулятор! CPU полностью работает, работа с памятью и стеком тоже. Но есть 1 баг (о котором я недавно отписался в блоге на gamedev.ru) надо сначала его отловить - тогда и рендеринг картинки прикручу : )

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Вот, кстати, если еще не было:

    http://nesdev.parodius.com/
    http://www.nemulator.com/files/nes_emu.txt

    )

    ОтветитьУдалить
  5. А, да у меня over 50 вкладок постоянно открыто в Опере ) Похоже есть всё что нужно : ) Но надо "тот самый" баг поправить! Но я хоть нашёл место, где он начинается : ) Что-то идёт не так и бранчинг происходить на неверную локацию

    ОтветитьУдалить