Эмуляция > Эмуляторы консолей 1-4 поколений
Делаю кроссплатформенный эмулятор Atari 2600
(1/2) > >>
erobson:
Недавно я решил сделать эмулятор 2600-ой атари. Тему здесь создаю, чтобы писать дневники разработчика + скрины. Я постараюсь полностью описать устройство и эмуляцию этой платформы, затем собрать в одну цельную статью. Сейчас работаю над тиа. Вообще, тема довольно интересная, хочется попробовать её портировать на максимум платформ и в приоритете PS1/PSX. Я надеюсь, железа хватит для эмуляции TIA и 6502.
Пока же делюсь скрином нерабочей графики  :neznayu:

Sharpnull:

--- Цитата: EgorInventor от 19 Октябрь 2022, 18:59:55 ---в приоритете PS1/PSX. Я надеюсь, железа хватит для эмуляции TIA и 6502.
--- Конец цитаты ---
Для 6502 хватит, если будете писать на ассемблере (есть ImbNES), а простой код на языке C, где читается один байт и интерпретируется будет слишком медленно. Я пробовал писать один эмулятор для PSX с 8-битным процем на C, у меня было медленнее раза в 4 и это без звука и с низкой точностью. Исходный код ImbNES есть, разбирайте.
erobson:
Sharpnull, да, знаю про imbnes, читал его.  Код я сделал максимально простым. Критические инструкции, или сам switch по возможности перепишу на asm. Благо, mips ассемблер хорошо описан на просторах нета. Вот у меня такой switch:
Skay:
EgorInventor, кросплатформа и писать куски на asm?)
почему за место свича не делать сразу таблицу переходов? Свитч же в случае пропусков индексов, повторений - будет генерировать лишние вспомогательные таблицы и тд.
Sharpnull:

--- Цитата: Skay от 20 Октябрь 2022, 01:09:15 ---почему за место свича не делать сразу таблицу переходов?
--- Конец цитаты ---
Массив указателей на функции? Это вроде не поможет всё равно со скоростью.
--- Цитата: Skay от 20 Октябрь 2022, 01:09:15 ---кросплатформа и писать куски на asm?)
--- Конец цитаты ---
Хорошее замечание, там мало что может остаться от общего кода после всех оптимизаций.
erobson:
Sharpnull,  Но кроссплатформа-то липовая!  :D Как обычно в cmake ручками под каждую платформу свои исходники.
Skay:

--- Цитата: EgorInventor от 20 Октябрь 2022, 17:29:50 ---Но кроссплатформа-то липовая!
--- Конец цитаты ---
ну вооот(


--- Цитата: Sharpnull от 20 Октябрь 2022, 03:40:23 ---Массив указателей на функции? Это вроде не поможет всё равно со скоростью.
--- Конец цитаты ---
из правильно подготовленного switch/case обычно и делается таблица переходов, а не куча ифов) но если появляются пропуски, неравномерности и тдд - там получается хренпойми что. Так что если самим организовать сразу таблицу - просто гарантированно не будет лишнего.

П.С.: мне что то казалось, что в блоге у Dolphin были статьи про архитектурные решения, еще всякие всячины, а сейчас ищу - поиск в лучшем случае выдает только статью про их шейдер, в остальных случаях "что нового". Или я с кем то путаю и это не они рассказывали про интересные реализации и правильные подходы?) вдруг кто помнит и подкинет ссылки на статьи..
erobson:
Skay, Основное, что удерживает меня от создания таблицы переходов вместо switch - это то, что для инструкций, работающих с памятью, функции режимов арресации возвращают адрес в массиве internalMemory. А если инструкция кушает не адрес, а данные, тогда я вызываю её обработчик так:

p.s. как-то странно объяснил  o_0
SPOT:
EgorInventor, Вы сначала делаете эмулятор для ПК, а потом будитет портировать его на PSX или же сразу пишите для PS?
erobson:
SPOT, Сначала делаю графику на SDL2 для пк, потом по ходу буду переделывать её на psx(PSYQ SDK). Пока цель получить нормальную статичную картинку с fps-ом 60
erobson:
Ура, товарищи! Картинка!
erobson:
А следом за ней ещё более правильная картинка! На фото видно, что есть расхождения по палитре, которые предстоит вычислить и исправить.
SPOT:
Не эксперт в Atari 2600, но может расхождения в палитре и нет. Может там не RGB, а как в NES.
erobson:
SPOT, Я взял цвета с сайта про atari. Затем с помощью python скрипта преобразовал в массив rgb:

Загвоздка в SDL, она не ест ничего кроме rgb)
SPOT:
Есть какой-то прогресс?
erobson:
Пока я загружен учёбой, прогресса нет. Однако я в свободные минутки изучаю информацию по PSX
erobson:
Потерпел фиаско. Почти все опкоды, кроме прерывания и TAX, TAY, T(XX) реализованы. Тут оказалось, что разные опкоды занимают разное кол-во машинных ТАКТОВ! Но в том руководстве которое я читал, такты обозвали ЦИКЛАМИ  :ohmy:  Из-за этого в моей реализации каждый опкод - 1 цикл, а такты попросту опущены((  Буду переделывать на днях.

P. S. А ещё я забыл делать комиты, поэтому изменения в 700 строк висят все в одном комите.
SPOT:
Главное что работа идёт, а то я боялся, что забросил))
erobson:
SPOT, Не, по крайней мере, до полноценного запуска pac-man я не остановлюсь). И не ожидал, что эта тема окажется так интересна.
erobson:
Чтобы не мудрить со всеми свичами, циклами и режимами адресации, я делаю очень просто - двумерный массив структур:

--- Код: ---struct OpCode{
void* handler; //Указатель на обработчик
int cycles; //Сколько циклов занимает
AddrType addressing; //Режим адресации
};
--- Конец кода ---
Потом беру из массива internalMemory 1 байт, и по этой таблице его обрабатываю. Я думаю, это будет быстрее и надёжнее всяких switch'ей, к тому же, всё в одном месте. Так как массивы хранятся в памяти  просто подряд, и поля структур тоже, то проблем с оптимизацией не будет. Плюс, можно сделать фиксированное кол-во бит для каждого поля структуры, не допуская лишних ноликов(такое бывает).
Навигация
Главная страница сообщений
Следующая страница

Перейти к полной версии