Anoche hice pública la primera versión de mi nuevo emulador de PSP. Últimamente no tengo mucho tiempo y no he podido dedicarle el tiempo que me gustaría, pero como llevaba ya tiempo pudiendo ofrecer algo interesante, he apañado la interfaz y el repositorio y me he decidido a publicar la primera versión.

El post oficial es el siguiente:
http://pspemu.soywiz.com/2012/02/new-version-soywizs-psp-emulator-2012.html

Este emulador es el sucesor espiritual de mi anterior emulador de PSP que hice en D.
Dejé D de lado porque tardaba tanto en refactorizar código y en compilar, que no me merecía la pena. D es un buen lenguaje, y desde luego mucho mejor que C/C++, pero carece o al menos carecía de un buen IDE y en proyectos grandes el tiempo de compilación era excesivo (especialmente en mi caso que hacía un uso intensivo de los mixings y la metaprogramación que es o era interpretada y cuyos resultados no se podían cachear).

Unos meses después de abandonar el emulador de D, me reintroduje en el mundillo de .NET y actualmente lo que más uso es C# y PHP. Y C# ha pasado a ser mi lenguaje preferido desde entonces.

Creo que ya he hablado de las bondades de .NET y de C# concretamente, así que voy a obviar ese punto y me voy a centrar en las características del emulador.

Repositorio:

Sub-módulos utilizados hechos por mí: 

Proyectos externos utilizados:

  • http://www.opentk.com/ - Librería portable que incluye entre otras cosas soporte OpenGL y OpenAL
  • Definiciones COM - Video.DirectShow del proyecto aforge - Para poder convertir Atrac3+ en WAV

Características:

100% Administrado:

El emulador está hecho 100% en C#. No usa librerías externas hechas en otro lenguaje. Así que es portable.

Recompilación dinámica

La ejecución de la CPU se hace mediante recompilación dinámica. Muchas instrucciones de MIPS se convierten en una única instrucción de x86 al ejecutarse.

Acceso mega-rápido a memoria

Usando VirtualAlloc/mmap se generan zonas de memoria que equiparan la disposición de la VRAM/RAM de la PSP, y como en una emulación HLE no hay DMA, se pueden obtener punteros nativos haciendo una mera suma (desplazamiento)

Caché de funciones y switching de threads optimizados

Implementación del Sistema Operativo y emulación HLE limpia y eficiente

Usando LINQ, Custom Attributes, documentación XML, generación dinámica de wrappers de funciones y declaraciones nativas de funciones con porte para punteros, ref/out, etc.

Más rápido que la PSP original, que DPspemu y que JPCSP

KISS y DRY
Con los principios “Keep It Simple Stupid” y “Don’t Repeat Yourself” siempre en mente, la calidad del código es siempre una prioridad por encima de características nuevas.

La decodificación de las instrucciones de la CPU/GPU, el ensamblador y desensamblador con las descripciones comparten una única tabla y generan código de decodificación al vuelo:

// Arithmetic operations.
ID("add",    VM("000000:rs:rt:rd:00000:100000"), "%d, %s, %t", ADDR_TYPE_NONE, 0),
ID("addu",   VM("000000:rs:rt:rd:00000:100001"), "%d, %s, %t", ADDR_TYPE_NONE, 0),
ID("addi",   VM("001000:rs:rt:imm16"          ), "%t, %s, %i", ADDR_TYPE_NONE, 0),

Unittesting y Tests de integración
La idea es crear un set completo de tests, que prueben la interfaz del emulador, la generación de código y las APIs HLE.
Los tests unitarios están integrados en el código, mientras que las pruebas de las APIs HLE son tests de integración en forma de ejecutables de PSP que se pueden ejecutar en cualquier emulador y que emiten una salida que posteriormente se puede comprobar.

Completamente OpenSource
El proyecto está en github así que cualquiera puede ramificar el proyecto y hacer un Pull Request para ayudar a mejorar el código.

Creado tras 4 intentos
Soy el creador de “D PSP Emulator”. Dicho emulador tuvo 4 versiones, y cada versión la creé prácticamente de cero con diferentes aproximaciones y tratando de mejorar la calidad del código en cada iteración.
La ausencia de un buen IDE, la estructura complicada del lenguaje D y los tiempos nefastos de compilación hacían que le llevase demasiado tiempo hacer cualquier cosa y hacían que la refactorización que en C# puedo hacer en minutos me llevase días o semanas.
En este tiempo he aprendido un montón de cosas y ya que la plataforma .NET es suficientemente rápida,  está “mono” y soluciona los problemas de D, ésta será mi última decisión.

Algo más que comentar
El primer emulador lo hizo Noxa y era también un emulador hecho en C#. Lo hizo en la épica de .NET 2.0 .NET y C# han evolucionado un montón desde la versión 2.0 y ahora es posiblemente la/el mejor plataforma/lenguaje que hay. Tiene el equilibrio justo entre facilidad, potencia y velocidad. Por supuesto le faltan muchas cosas, pero es el lenguaje en el que he echado menos cosas en falta.
No he usado el código del pspplayer como base porque quería hacer un replanteamiento completamente diferente y hacer uso de todas las cosas que he aprendido en este tiempo.
La primera versión de mi emulador estaba basado en el emulador de Noxa. No fui capaz de compilar su código debido a que tenía una mezcla extraña de DLLs que daban problemas en x86/x64.
Y me gustaría dar el debido crédito al gran trabajo de Noxa.</div>