| Эмуляция > Эмуляторы консолей 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'ей, к тому же, всё в одном месте. Так как массивы хранятся в памяти просто подряд, и поля структур тоже, то проблем с оптимизацией не будет. Плюс, можно сделать фиксированное кол-во бит для каждого поля структуры, не допуская лишних ноликов(такое бывает). |
| Навигация |
| Главная страница сообщений |
| Следующая страница |