Русский
Русский
English
Статистика
Реклама

Ps2

Эмулятор PS2 на Android вторая серия

08.03.2021 10:09:17 | Автор: admin

Привет всем читателям!

Я продолжаю публикацию по своему проекту портирования кода PCSX2 эмулятора PS2 на Android платформу.

Поспешу предупредить, что скачать и запустить не получиться проект только на начальной стадии развития. Однако, для тех читателей, кто не лишён профессионального любопытства добро пожаловать под кат. Что найдёт любопытствующий:

  1. компилируемый код для AARM64 - да, ядро PCSX2 эмулятора компилируется в нативный ARM код;

  2. исполняемое приложение для загрузки файлов БИСОа и образа игровых дисков;

  3. шок контент.

Что же, прогресс портирования зашёл достаточно далеко и получилось скомпилировать исполняемый нативный С++ код на AARM64. Средой разработки является Android Studio и при портировании кода с x86 на AARM64 я столкнулся с очевидной проблемой - различный набор инструкций процессоров. Многие удивятся - что за чушь, пиши на С++ и компилятор сам всё сделает. И здесь заключается сама суть проблемы портирования, с которой я столкнулся: PCSX2 создаёт исполняемый двоичный код процессора "на лету". Да, в коде эмулятора есть класс x86Emitter для записи в массив байтов байтовый код x86 процессора.

Так что же получилось?

Java frontend код для загрузки БИОСа и файлового образа игр. Пользовательский интерфейс прост и включает следующие окна:

Идея следующая - первоначально требуется выбрать файл БИОСа и файл образа диска для начала отладки кода. Полные пути к выбранным файлам сохраняются как параметры программы:

    public void save()    {        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(GlobalApplication.getAppContext());        SharedPreferences.Editor editor = preferences.edit();        try {            String l_value = serialize();            editor.putString(BIOS_INFO_COLLECTION, l_value);        } catch (ParserConfigurationException e) {            e.printStackTrace();        } catch (TransformerException e) {            e.printStackTrace();        }        editor.commit();    }

И после первоначального выбора, следующий запуск приложения будет автоматически запускать ядро эмулятора с ранее заданными БИОСом и образом диска.

    private void autoLaunch()    {        BIOSAdapter.getInstance();        ISOAdapter.getInstance();        if(PCSX2Controller.getInstance().getBiosInfo() != null &&           PCSX2Controller.getInstance().getIsoInfo() != null)            GameController.getInstance().PlayPause();    }

Портирование компилятора кода эмулятора с x86 на AARM64 представляет серьёзную проблему. Архитектура Интелл относиться к CISC с переменной длинной кода и смешанной последовательностью данных и кода, в то время как AARM64 относиться RISC с фиксированной длинной кода в 32 бита. Но проблема в том, что на синтаксисе Интелловской архитектуре завязаны десятки и десятки файлов и сотни тысяч строк кода. Не говоря о том, что возникнет проблема в совместимости кода с оригинальным PCSX2 эмулятором. Что же, решение очевидное - написать оболочку x86 синтаксиса в исполнении AARM64 кода. Да, в моём проекте нет ничего оригинального - просто попытка эмуляции х86 кода через AARM64 код.

Конечно, я не ставлю целью закрыть всё множество х86 кодов - я поставил целью закрыть коды только используемых PCSX2 эмулятором. С этой целью в добавлен вызов нативного кода в момент создания приложения- PCSX2LibNative.getInstance().CPU_test()

       @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        checkPermission();        setContentView(R.layout.activity_main);        Button l_controlBtn = findViewById(R.id.controlBtn);        if(l_controlBtn != null)        {           l_controlBtn.setOnClickListener(                       new View.OnClickListener(){                                                      @Override                                                      public void onClick(View v) {                                                          showControl();                                                      }                                                  }           );        }        PCSX2LibNative.getInstance().CPU_test();        autoLaunch();    }

Что делает данная функция? Генерирует AARM64 исполняемый бинарный код для множества x86 кодов и проверяет результат исполнения с значением, известным из спецификации Интелл. Пример теста AARM64 кода для SUB комманды x86:

    void execute()    {        // Установка права доступа чтение/запись для области памяти        HostSys::MemProtectStatic(eeRecDispatchers, PageAccess_ReadWrite());        // Очистка области памяти        memset(eeRecDispatchers, 0xcc, __pagesize);        // Установка аргумента теста команды        s_stateTest = 0x10;        // Передача указателя на начало области памяти в генератор AARM64 кода        xSetPtr(eeRecDispatchers);        // Создание исполняемого кода в области памяти данных        auto DynGen_CodeSUB = _DynGen_CodeSUB();        // Установка права доступа в статус исполняемой области памяти        HostSys::MemProtectStatic(eeRecDispatchers, PageAccess_ExecOnly());        // Исполнение только что созданного AARM64 кода        auto l_result = CallPtr((void *)DynGen_CodeSUB);        // Проверка с ожидаемым результатом исполнения кода для x86!!!        if(l_result != 2147483664)        {            throw L"Unimplemented!!!";        }    }    DynGenFunc *_DynGen_CodeSUB()    {        // Указатель на начало исполняемой области памяти        u8 *retval = xGetAlignedCallTarget();        { // Properly scope the frame prologue/epilogue#ifdef ENABLE_VTUNE            xScopedStackFrame frame(true);#else            xScopedStackFrame frame(IsDevBuild);#endif            // Загрузка в регистр eax значения аргумента теста s_stateTest             // по эффективному адресу &s_stateTest             xMOV( eax, ptr[&s_stateTest] );            // Исполнение команды x86 SUB с аргументом из регистра eax            // и прямо заданного аргумента 0x80000000            xSUB( eax, 0x80000000 );        }        // Выход из сгенерированной функции в вызывающую нативную функцию        xRET();        return (DynGenFunc *)retval;    }

Да, таких тестов исполнения эмуляции х86 кода в проекте множество - это и есть процесс разработки: исследование х86 команды и написание теста эмуляции на AARM64.

Шок контент!!!

При исследовании работы PCSX2 эмулятора я обратил внимание код компиляции исполнения команд процессор PS2 - R3000A:

static DynGenFunc* _DynGen_DispatcherReg(){u8* retval = xGetPtr();  // Загрузка значения счётчика команд в регистр eax.xMOV( eax, ptr[&psxRegs.pc] );    // Копирование значения счётчика команд из регистра eax в регистр ebx.xMOV( ebx, eax );    // Получение относительного адреса из значения счётчика команд в регистре eax  xSHR( eax, 16 );    // Получение адреса указателя массив указателей на начало блоков эмуляции команд R3000AxMOV( rcx, ptrNative[xComplexAddress(rcx, psxRecLUT, rax*wordsize)] );    // Переход по указателю на начало блока эмуляции команд R3000AxJMP( ptrNative[rbx*(wordsize/4) + rcx] );return (DynGenFunc*)retval;}

Где psxRegs.pc - переменная для хранения значения счётчика команд процессора R3000A, psxRecLUT - указатель на массив указателей на скомпилированные R3000A команды. Схема работы кода имеет следующий вид:

И тут меня "ударило"!!!

Область памяти, указанная как исполняемая, включает в себя буквально несколько байт кода, но сгенерированная эмуляция команд R3000A сохраняется в обычной области данных и исполняется от туда! А контроль права исполнения операционной системы и процессора куда смотрит?

Для любителей повозиться с кодом - проект для среды разработки Android Studio доступен на GitHub: AndroidStudio

.

Подробнее..

Видео гид по эмулятору Omega Red

13.07.2020 10:06:40 | Автор: admin
Привет всем читателям!

Я продолжаю тему программного эмулятора для PlayStation 1, PlayStation 2 и PlayStation Portable Omega Red. Более подробно:


Данную публикацию я написал в связи с включением поддержки 7z архивов для коллекций БИОСов и изменения частоты обновления картинки рендеринга эмулятора. Дополнительно, после ряда вопросов, я записал видео гид по настройке и запуску игр с нуля.

Добро пожаловать под кат.





Данный проект использует WPF C# фреймворк как промежуточный уровень между рендером эмулятора и графическим контекстом дисплея: рендерер прорисовывает кадр в текстуру и WPF фреймворк встраивает эту текстуру в пользовательский интерфейс программы. Именно встраивание DirectX текстуры в пользовательский интерфейс является бутылочным горлышком WPF графического драйвера WPF происходит от Windows XP SP2 и имеет в основе DirectX9 layer, и встраивание DirectX9 текстуры задействует процессорное время. Как результат, загрузка процессора увеличивается что может идти в ущерб работы самого эмулятора в аудио потоке возникают паузы в воспроизведения синтезированного результата.
Разгрузить процессор можно через установки паттерна пропуска встраивания DirectX9 текстуры. Текущую частоту обновления текстуры можно мониторить через опцию Показать число кадров в секунду:
image
Уменьшить загрузку процессора можно через пропуск кадров по опции Режим пропуска кадров::

image

В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed.

Поддержать проект и задать вопросы можно по ссылкам:
www.facebook.com/Omega-Red-269237843996260
Buy Me A Coffee
Подробнее..

4К (2160р) разрешение для игр PS1, PS2, PSP в эмуляторе Omega Red

01.08.2020 10:15:58 | Автор: admin
Привет всем читателям!

Я продолжаю тему программного эмулятора для PlayStation 1, PlayStation 2 и PlayStation Portable Omega Red. Более подробно:


Данную публикацию я написал в связи с включением поддержки 4К разрешения рендеринга при эмуляции игр PS1, PS2, PSP.

Добро пожаловать под кат.



Особенностью программной архитектуры эмуляторов является рендерин полигонов игровых сцен через нативный графический API как результат, эмуляторы имеют в своём составе графический движок различной степени функционала. И один из функционалов это рендеринг в разрешение окна экрана. В эмуляторе OmegaRed рендеринг происходит в отдельную видео текстуру, и размер этой текстуры определяет размер виртуальной камеры рендерера.

Установка текущего разрешения производится из панели настройки конфигурации:

image

Сравнить качество рендеринга при разрешениях 720р / 2160р можно на следующих видео:


В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed.
Подробнее..

Редизайн пользовательского интерфейса эмулятора Omega Red

09.08.2020 14:18:19 | Автор: admin
Привет всем читателям!

Я продолжаю тему программного эмулятора для PlayStation 1, PlayStation 2 и PlayStation Portable Omega Red. Более подробно:


Данную новость я написал в связи решением изменить дизайн пользовательского интерфейса моего проекта.



Добро пожаловать под кат.

С момента начала публикации моего проекта я регулярно принимал сообщения от комментаторов о плохом дизайне интерфейса программы. Особенно в одном из последних сообщений:



Особенно доставило удовольствие: avoid switching between North American English and British English.

Но, как говорится Vox populi глас народа. И я принял решение сделать редизайн интерфейса программы. Программа написана на C# в WPF с использованием паттерна MVVM как результат, сделать набросок нового дизайна это дело пары свободных часов.






Какое мнение у читателей по новому редизайну?

По вопросам схожести интерфейса с Deus Ex: Human Revolution и Нинтендо Свитч отвечу не спи л, а позаимствовал.

В настоящий момент программа доступна по ссылке: Omega Red и представлена на GitHub: OmegaRed.
Подробнее..

Редизайн пользовательского интерфейса эмулятора Omega Red (Финал)

25.01.2021 10:05:20 | Автор: admin

Привет всем читателям!

Я продолжаю тему программного эмулятора для PlayStation 1, PlayStation 2 и PlayStation Portable Omega Red. Более подробно:

Данную новость я написал в связи редизайном разрабатываемого эмулятора (а заодно и ребридингом ребрендингом).

Добро пожаловать под кат.

Данная версия проекта, под названием Golden Phi, представляет переработанный пользовательский интерфейс. По странной причине первоначальный интерфейс не понравился некоторым пользователям. Что же, редизайн интерфейса интересная задача и хорошая причина попрактиковаться в MVVM проектировании.

Первоначально идея обновления интерфейса ограничевалась только изменением визуального стиля. Но в дальнейшем пришлось значительно переработать структуру и пользовательского интерфейса, и большую часть кода.

Приложение открывается списком трёх последних запущенных игр:

Ограничение списка только тремя играми связано с рекомендациями читателей по исключению скролинга списка. Это и логично - три игры для трёх эмуляторов (PS1, PS2, PSP). Для большей презентабельности списка игр каждый образ диска отображается скрином игрового экрана с автоматического сохранения. Таким образом, "обои" образов дисков постоянно обновляются в течении игрового процесса.

Каждая панель игры в дополнение к "обоям" имеет кнопку сохранений для отображения панели текущих сохранений для данной игры. Данная панель позволяет загрузить одно из сохранений или удалить одно из них.

Выбор образа игры из списка всех игр, добавление нового образа или удаление существующего можно сделать из отдельного меню по нажатию на панель с иконкой диска. Список имеет полоску скролинга и позволяет легко управлять большим списком образов игр.

Для игр на PS1 и PS2 потребуется загрузить и выбрать образ соответствующего БИОСа.

Конфигурацию эмулятора можно изменять из опции по кнопке. Панель конфигурации включает настройки графики, геймпада, языка интерфейса.

Панель скриншотов позволяет просмотреть сделанные скриншоты из игр и в случае необходимости удалить скриншоты.

Выход из программы осуществляется через панель пользователя.

А теперь к игровому процессу. Запуск игры осуществляется двойным нажатием на плитку желаемого образа игры. Экран игры в режиме точпада имеет следующий вид:

При переводе эмулятора в паузу программа переходит на главный экран, перемещая текущую игру в левую крайнею позицию с отображением анимированной иконкой активного состояния игры. Нажатие на иконку активного состояния останавливает текущую игру с сохранением текущего игрового процесса.

При подключении геймпада программа автоматически находит первый геймпад и подключает его автоматически - подключил и играй. Для управления эмулятором с геймпада определены три команды:

Быстрое сохранение

Быстрая загрузка

Быстрое возобновление игры (аналог Quick Resume Xbox Series X)

При переходе к панели быстрого возобновление игры список образов игр для возобновления представлен в форме вертикальной очереди текущих обложек образов игр:

В настоящий момент Windows OS версия программы доступна по ссылке: Omega Red и представлена на GitHub: Golden .

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru