Hacía mucho tiempo que no tocaba el emulador de PSP que empecé.
Hace relativamente poco (y después de mucho tiempo) me agregó una persona al messenger por el emulador de PSP.
A raíz de eso me enteré que habían un par de emuladores muy prometedores en progreso:

http://www.pcsp-emu.com/
http://www.jpcsp.org/

Uno hecho en C++ y el otro en Java. Los dos parece que avanzan bastante bien.
El caso es que hacía bastante tiempo que quería volverle a meter mano. Últimamente he estado leyendo cosas de TDD. Salió también la versión 2.0 de D. Y tenía en mente varias ideas que quería implementar a la hora de empezarlo de cero de nuevo.

Así que hará cosa de un mes, moví el código viejo a una branch, y creé un repositorio nuevo en trunk.
Ahí empecé los primeros trasteos.
En D 2.0 han trabajado bastante el tema de funciones “pure nothrow”, que permiten ejecutarse en tiempo de compilación (CTFE). Básicamente consiste en metaprogramación. Usando las propias funciones de D generar código D. (Si son “pure nothrow” en tiempo de compilación además de en tiempo de ejecución).
En la primera versión, para hacer el megaswitch/tablas de decodifiación de instrucciones, hice un script en php que con la tabla del prxtool, generaba el switch de ejecución de instrucción. Era un poco molesto depender de una utilidad externa.
Pues he hecho una serie de funciones pure nothrow, que permiten generar switchs recursivos para la decodificación (igual que se hacía en php, pero sin necesidad de herramientas externas).
También he empezado a utilizar mixins y template mixins.
Cada módulo tiene su unittesting que he intentado programar antes, o al menos mientras desarrollo.
Otra de las cosas que he utilizado es el módulo de phobos 2.0 bitmanip que me permite decodificar una instrucción muy fácilmente.
Y lo último que he hecho ha sido empezar la programación de un módulo de ensamblado de mips.
Esto además de permitir en un futuro añadir/modificar bloques de código desde el emulador sin necesidad de herramientras externas, me permite generar instrucciones para el unittesting de la cpu.

unittest {  
    writefln("Unittesting: core.cpu.cpu...");  
    scope cpu = new CPU(); foreach (n; 0..32) cpu.registers[n] = 0;  

    scope assembler = new AllegrexAssembler(cpu.memory);  

    // (v0 = (7 + 11 - 5)) == 13  
    writefln("  (v0 = (7 + 11 - 5)) == 13");  
    {  
        assembler.startSegment("code", Memory.mainMemoryAddress);  

        assembler.assemble("addi a0, zero, 7");  
        assembler.assemble("addi a1, zero, 11");  
        assembler.assemble("add v0, a0, a1  ");  
        assembler.assemble("addi v0, v0, -5 ");  

        cpu.registers.set_pc(Memory.mainMemoryAddress);  
        cpu.execute(4);  
        assert(cpu.registers["v0"] == 13);  
    }  
}  

La página del proyecto en google code:
http://code.google.com/p/pspemu