Автор Тема: Делаю кроссплатформенный эмулятор Atari 2600  (Прочитано 1925 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Недавно я решил сделать эмулятор 2600-ой атари. Тему здесь создаю, чтобы писать дневники разработчика + скрины. Я постараюсь полностью описать устройство и эмуляцию этой платформы, затем собрать в одну цельную статью. Сейчас работаю над тиа. Вообще, тема довольно интересная, хочется попробовать её портировать на максимум платформ и в приоритете PS1/PSX. Я надеюсь, железа хватит для эмуляции TIA и 6502.
Пока же делюсь скрином нерабочей графики  :neznayu:
« Последнее редактирование: 19 Октябрь 2022, 19:10:39 от EgorInventor »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4942
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #1 : 19 Октябрь 2022, 20:31:57 »
в приоритете PS1/PSX. Я надеюсь, железа хватит для эмуляции TIA и 6502.
Для 6502 хватит, если будете писать на ассемблере (есть ImbNES), а простой код на языке C, где читается один байт и интерпретируется будет слишком медленно. Я пробовал писать один эмулятор для PSX с 8-битным процем на C, у меня было медленнее раза в 4 и это без звука и с низкой точностью. Исходный код ImbNES есть, разбирайте.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #2 : 19 Октябрь 2022, 20:47:32 »
Sharpnull, да, знаю про imbnes, читал его.  Код я сделал максимально простым. Критические инструкции, или сам switch по возможности перепишу на asm. Благо, mips ассемблер хорошо описан на просторах нета. Вот у меня такой switch:

Оффлайн Skay

  • Пользователь
  • Сообщений: 4114
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #3 : 20 Октябрь 2022, 01:09:15 »
EgorInventor, кросплатформа и писать куски на asm?)
почему за место свича не делать сразу таблицу переходов? Свитч же в случае пропусков индексов, повторений - будет генерировать лишние вспомогательные таблицы и тд.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4942
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #4 : 20 Октябрь 2022, 03:40:23 »
почему за место свича не делать сразу таблицу переходов?
Массив указателей на функции? Это вроде не поможет всё равно со скоростью.
кросплатформа и писать куски на asm?)
Хорошее замечание, там мало что может остаться от общего кода после всех оптимизаций.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #5 : 20 Октябрь 2022, 17:29:50 »
Sharpnull,  Но кроссплатформа-то липовая!  :D Как обычно в cmake ручками под каждую платформу свои исходники.

Оффлайн Skay

  • Пользователь
  • Сообщений: 4114
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #6 : 20 Октябрь 2022, 18:17:36 »
Но кроссплатформа-то липовая!
ну вооот(

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

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

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #7 : 20 Октябрь 2022, 18:32:52 »
Skay, Основное, что удерживает меня от создания таблицы переходов вместо switch - это то, что для инструкций, работающих с памятью, функции режимов арресации возвращают адрес в массиве internalMemory. А если инструкция кушает не адрес, а данные, тогда я вызываю её обработчик так:

p.s. как-то странно объяснил  o_0

Оффлайн SPOT

  • Пользователь
  • Сообщений: 573
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #8 : 20 Октябрь 2022, 21:39:20 »
EgorInventor, Вы сначала делаете эмулятор для ПК, а потом будитет портировать его на PSX или же сразу пишите для PS?

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #9 : 20 Октябрь 2022, 21:47:53 »
SPOT, Сначала делаю графику на SDL2 для пк, потом по ходу буду переделывать её на psx(PSYQ SDK). Пока цель получить нормальную статичную картинку с fps-ом 60

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #10 : 21 Октябрь 2022, 23:14:10 »
Ура, товарищи! Картинка!

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #11 : 21 Октябрь 2022, 23:22:06 »
А следом за ней ещё более правильная картинка! На фото видно, что есть расхождения по палитре, которые предстоит вычислить и исправить.
252662-0

Оффлайн SPOT

  • Пользователь
  • Сообщений: 573
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #12 : 22 Октябрь 2022, 08:13:58 »
Не эксперт в Atari 2600, но может расхождения в палитре и нет. Может там не RGB, а как в NES.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #13 : 22 Октябрь 2022, 10:08:48 »
SPOT, Я взял цвета с сайта про atari. Затем с помощью python скрипта преобразовал в массив rgb:
252727-0
Загвоздка в SDL, она не ест ничего кроме rgb)

Оффлайн SPOT

  • Пользователь
  • Сообщений: 573
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #14 : 25 Октябрь 2022, 17:07:51 »
Есть какой-то прогресс?

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #15 : 25 Октябрь 2022, 19:00:48 »
Пока я загружен учёбой, прогресса нет. Однако я в свободные минутки изучаю информацию по PSX
« Последнее редактирование: 25 Октябрь 2022, 19:08:24 от EgorInventor »

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #16 : 04 Ноябрь 2022, 21:55:22 »
Потерпел фиаско. Почти все опкоды, кроме прерывания и TAX, TAY, T(XX) реализованы. Тут оказалось, что разные опкоды занимают разное кол-во машинных ТАКТОВ! Но в том руководстве которое я читал, такты обозвали ЦИКЛАМИ  :ohmy:  Из-за этого в моей реализации каждый опкод - 1 цикл, а такты попросту опущены((  Буду переделывать на днях.

P. S. А ещё я забыл делать комиты, поэтому изменения в 700 строк висят все в одном комите.

Оффлайн SPOT

  • Пользователь
  • Сообщений: 573
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #17 : 04 Ноябрь 2022, 22:21:18 »
Главное что работа идёт, а то я боялся, что забросил))

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #18 : 04 Ноябрь 2022, 22:56:03 »
SPOT, Не, по крайней мере, до полноценного запуска pac-man я не остановлюсь). И не ожидал, что эта тема окажется так интересна.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #19 : 05 Ноябрь 2022, 22:44:25 »
Чтобы не мудрить со всеми свичами, циклами и режимами адресации, я делаю очень просто - двумерный массив структур:
struct OpCode{
void* handler; //Указатель на обработчик
int cycles; //Сколько циклов занимает
AddrType addressing; //Режим адресации
};
Потом беру из массива internalMemory 1 байт, и по этой таблице его обрабатываю. Я думаю, это будет быстрее и надёжнее всяких switch'ей, к тому же, всё в одном месте. Так как массивы хранятся в памяти  просто подряд, и поля структур тоже, то проблем с оптимизацией не будет. Плюс, можно сделать фиксированное кол-во бит для каждого поля структуры, не допуская лишних ноликов(такое бывает).
« Последнее редактирование: 05 Ноябрь 2022, 23:34:36 от EgorInventor »

Оффлайн Skay

  • Пользователь
  • Сообщений: 4114
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #20 : 05 Ноябрь 2022, 22:57:22 »
P. S. А ещё я забыл делать комиты, поэтому изменения в 700 строк висят все в одном комите.
только так и учатся пользоваться гитом)) просто читать про то как надо - мало.
И не ожидал, что эта тема окажется так интересна.
Там много еще интересного) JIT, сначала однородный, потом с промежуточным представлением и т.д. Оптимизации наборов инструкций под целевую платформу)

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #21 : 05 Ноябрь 2022, 23:03:21 »
Skay, Если я ничего не путаю, то jit нужен только для оптимизации языков с байт-кодом, каковым родной СИ не является. А по поводу гита - да, наболевшая тема. Я с ним давно, но постоянно про него забываю.

Оффлайн Skay

  • Пользователь
  • Сообщений: 4114
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #22 : 06 Ноябрь 2022, 00:06:48 »
EgorInventor, в эмуляции это тоже применимо.
Очень грубо говоря и косноязычно: Ты независимо от потока в котором исполняешь, читаешь инструкции, перемалываешь их (в т.ч. с оптимизациями) и выстраиваешь очередь с инструкциями понятными для твоей платформы. И вот эту очередь команд, уже выполняешь.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #23 : 06 Ноябрь 2022, 00:38:04 »
Таак, читал статьи по эмуляции, но про использование JIT не слышал. Спасибо за наводку, посмотрю, нужна ли реализация

Оффлайн Skay

  • Пользователь
  • Сообщений: 4114
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #24 : 06 Ноябрь 2022, 01:09:55 »
EgorInventor, jit это если только в следующую итерацию, для начала надо это заставить работать.

https://bheisler.github.io/post/experiments-in-nes-jit-compilation/

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #25 : 23 Ноябрь 2022, 17:26:55 »
Я вернулся. Последние комиты - таблица переходов, исправление багов, палитру по прежнему не переделал, да и не особо надо пока.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #26 : 18 Декабрь 2022, 21:46:48 »
Наконец придумал способ реализовать tia, и скоро приступлю! Идея заключается в том, чтобы при записи по соответствующим адресам в некий стек складывать указатели на обработчики того или иного события, затем в цикле тиа обрабатывать это самое событие. Если при портировании будет замечена потеря в производительности, можно будет сделать систему приоритетов.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #27 : 28 Февраль 2023, 20:55:04 »
Начал работать с ассемблером Mips, чтобы сразу начать переносить на нужную платформу. Пока ничего нового по функционалу нет, кроме исправления багов с счётчиком кадров.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #28 : 11 Март 2023, 12:54:03 »
Offtop: Решил использовать Psn00bSDK, т. к. он поразительно удобный и быстрый.
P.S. А ещё все эмуляторы, кроме no$psx - бяка.

Оффлайн erobson

  • Пользователь
  • Сообщений: 21
  • Пол: Мужской
    • Просмотр профиля
Делаю кроссплатформенный эмулятор Atari 2600
« Ответ #29 : 23 Апрель 2023, 14:28:58 »
Делаю собственную графическую библиотеку специально под windows, так как слишком много лишнего winapi-кода просачивается в логику эмулятора. От использования SDL окончательно отказался, он слишком медленный.
Пишу в свободное время, а его катастрофически не хватает :cry: