
Я создал эмулятор Game Boy на F#
maybe_elf 19 минут назад Я создал эмулятор Game Boy на F# Уровень сложности Средний Время на прочтение 19 мин Охват и читатели 589 Игры и игровые консоли F# * Программирование * Разработка игр * Тестирование игр *...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. maybe_elf 19 минут назад Я создал эмулятор Game Boy на F# Уровень сложности Средний Время на прочтение 19 мин Охват и читатели 589 Игры и игровые консоли F# * Программирование * Разработка игр * Тестирование игр * Перевод Автор оригинала: Nick Kossolapov Я работаю программистом уже более 8 лет, и, признаюсь, никогда не понимал, как на самом деле устроены компьютеры. Поэтому я решил попробовать изучить их работу путём эмуляции. Извините, Бен Итер, я пока не собираюсь ничего создавать.
В детстве я провёл сотни часов, ловя покемонов, поэтому Game Boy был идеальным кандидатом: реальное оборудование, относительно простая архитектура и что-то, с чем у меня была сильная личная связь. Вместо того чтобы сразу же приступить к эмуляции, я сначала прошёл курс «От NAND до Тетриса». Это был отличный курс, и он помог мне по-настоящему понять основы компьютеров, такие как регистры, память и АЛУ.
Технические детали
Затем, чтобы втянуться, я создал эмулятор CHIP-8 на F#: Fip-8. Спустя несколько месяцев, после многих ночей, когда я ложился спать в 2 часа ночи, хотя и говорил себе, что буду работать над этим всего час-два, у меня появился работающий эмулятор Game Boy: Fame Boy. Он работает со звуком и запускается как на компьютере, так и в веб-браузере .
Как это работает Я хотел, чтобы эмулятор работал как на компьютере, так и в веб-браузере, поэтому сосредоточился на создании простого интерфейса между ядром эмулятора и любым фронтендом, который его запускает. Интерфейс между фронтендом и ядром по сути состоит всего из двух массивов и двух функций: framebuffer — массив оттенков 160x144 (белый, светлый, тёмный, чёрный); audiobuffer — кольцевой аудиобуфер с частотой дискретизации 32768 Гц с головками чтения и записи; stepEmulator() — функция, которая выполняет одну инструкцию ЦП и возвращает количество циклов; getJoypadState(state) — это функция обратного вызова для фронтенда, которая передает эмулятору состояние геймпада, обычно один раз за кадр. Я попытался смоделировать Game Boy аналогично реальному аппаратному обеспечению.
Процессор, как и настоящий Sharp LR35902 в Game Boy, ничего не знает об аппаратном обеспечении, кроме карты памяти (и IoController только для сигналов прерывания). Это также самая «F#-подобная» часть моего кода, сильно опирающаяся на функциональное моделирование. fs содержит большую часть оперативной памяти, используемой в Game Boy, и выступает в качестве карты памяти и шины между процессором, контроллером ввода-вывода и картриджем.
Отраслевые последствия
Он использует ту же ссылку на массивы VRAM и OAM RAM, что и PPU, для повышения производительности. fs появился, когда я обнаружил, что добавляю слишком много логики в Memory. Хотя в аппаратном обеспечении Game Boy нет единого контроллера ввода-вывода, обработка всех аппаратных регистров через него упростила и повысила безопасность интерфейсов для отдельных компонентов.
Функция stepper в файле Emulator.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





