PlayStation 2 Arquitectura y Programación Rafael García Moreno <bladecoder@gmx.net> 9 de mayo de 2003 Índice general 1. Introducción 2 2. Arquitectura de la PS2 2.1. Emotion Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. IO Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6 8 2.3. Sintetizador Gráfico (GS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3. Protección anticopia de la PS2 y modchips 10 3.1. Protección anticopia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2. La partición de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3. Método CogSwap para evitar la protección anticopia . . . . . . . . . . . . . . . 13 3.4. Nosolder chips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.5. Modchips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.6. Backups de juegos bajo linux y creación de CDs para la PS2 . . . . . . . . . . . 15 4. Métodos de programación de la PS2 18 4.1. Kit de desarrollo de Sony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.2. Kit de linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.3. Programación RAW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5. Instalación del entorno de programación RAW 22 5.1. Preparando el entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.2. Emotion Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.3. Unidades Vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.4. IOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.5. Newlib y ps2lib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.6. Compilando una demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1 Capítulo 1 Introducción La PlayStation 2 (PS2) de Sony, fué uno de los productos más esperados del 2001. Las características técnicas de la consola son impresionantes. Esta consola ha sido diseñada desde el pricipio con un claro objetivo: Juegos 3D. Es por eso que todo el harware está orientado a que se puedean realizar juegos que lleven al usuario a una inmersión en un mundo audiovisual en tres dimensiones. La PS2 es la evolución de la primera consola desarrollada por Sony, la Playstation (PSX), que fué puesta en el mercado en el año 1995. La PSX fué de las primeras consolas cuyos juegos se distribuian en soporte CDROM. Los juegos de la PS2 se distribuyen en DVD aunque también es capaz de reproducir los juegos de la PSX en CDROM. Gracias a la gran capacidad de los DVDs (4.7 GB), los juegos de la PS2 están repletos de videos, música y sonido en 3D. Además de juegos, la PS2 puede reproducir CDs de audio y películas en DVD por tanto es una completa plataforma de entretenimiento. El panel frontal contiene, además de la bandeja para los DVDs/CDs: 2 slots para las tarjetas de memoria que son de 8 MB normalmente, aunque el formato es el mismo que las de la PSX por lo que se pueden intercambiar. 2 slots para los nuevos controles, también funcionan los controles antiguos de la PSX. 2 puertos USB que pueden ser usados con cualquier dispositivo USB compatible como teclados, ratones, impresoras, etc. 1 puerto Firewire de alta velocidad La parte trasera contiene conectores para la salida de televisión, para televisión de alta definición y salidas de sonido surround, DTS y Dolby Digital 5.1. 2 CAPÍTULO 1. INTRODUCCIÓN 3 Figura 1.1: Playstation 2 Los mandos estándar, Dual Shock 2, tienen 15 botones; todos son analógicos, excepto Analog, Start y Select. Figura 1.2: Dual Shock 2 El mando consta de: 4 botones ordenados como cursores direccionales (arriba-izquierda) Botones Analog, Start y Select (medio) 4 botones de acción de distintos colores (arriba derecha) CAPÍTULO 1. INTRODUCCIÓN 4 4 botones de accion, L1 , L2 (frente-izquierda) y R1, R2 (frente-derecha) 2 joysticks analógicos con force-feedback (arriba-izquierda y arriba-derecha) La siguiente tabla comparativa muestra algunas consolas disponibles en el mercado en el año de presentación de la PS2 y las consolas más recientes. Los datos proporcionados por Sony y Microsoft no son realistas, son los datos máximos, mientras que los de Nintendo y Sega están medidos en un juego real: Consola Polígonos/seg Frecuencia Memoria Principal Playstation 2 75 millones 300 Mhz 32 Mb RAMBUS + 4 Mb DRAM de video XBox 150 millones 733 Mhz 64 Mb RAM unificada Gamecube 6-12 millones 485 Mhz 24Mb SRAM+16Mb DRAM+3Mb SRAM de video Playstation 360,000 33.86 Mhz 2 Mb + 1 Mb de video Dreamcast 3 millones 200 Mhz 16 Mb + 8 Mb de video Nintendo 64 150,000 93.75 Mhz 4 Mb Direct RAMBUS El alto grado de paralelismo de la arquitectura de la PS2 permite obtener un rendimiento superior a las últimas consolas funcionando a una velocidad de reloj menor. Capítulo 2 Arquitectura de la PS2 La arquitectura de la PS2 se compone de 4 partes principales: Procesador de Entrada/Salida (IOP): El IOP maneja el USB, el FireWire, y todo el tráfico de los mandos de control del juego. El IOP envía la entrada de los mandos de control al Emotion Engine para que este pueda actualizar el estado del juego apropiadamente. Emotion Engine (EE): El Emotion Engine es el corazón de la PS2, y la parte que la hace única. El Emotion Engine realiza las siguientes funciones: • Cálculos geométricos: transformaciones, translaciones, etc. • Comportamiento del mundo 3D: IA de los enemigos, colisiones y en general la física del mundo que se está simulando. • Funciones generales: Control del programa y en general la dirección del juego. El resultado del trabajo del Emotion Engine son display lists, esto es, secuencias de comandos de rendering que son enviados al sintetizador gráfico (GS). Sintetizador Gráfico (GS): El sintetizador gráfico recoge los display list que le envía el EE y los representa en la pantalla. Es lo que sería la “tarjeta gráfica” de la PS2. Procesador de sonido (SP): El SP es lo que sería la “tarjeta de sonido” de la PS2. Es capaz de reproducir sonido digital 3D. 5 CAPÍTULO 2. ARQUITECTURA DE LA PS2 6 Figura 2.1: Arquitectura de la PS2 2.1. Emotion Engine El Emotion Engine es el corazón de la Playstation, una CPU RISC de 128-bits desarrollada por Sony y por Toshiba. Implementa un subconjunto de instrucciones del procesador MIPS-IV. La CPU funciona con una velocidad de reloj de 300 MHz. Para el proceso masivo de información multimedia a altas velocidades, tanto el bus de datos, como la memoria caché y los registros son de 128-bits. Todo está integrado en un solo chip LSI a 0.18 micras. El Emotion Engine ha sido la primera CPU desarrollada completamente de 128-bits. La capacidad de cálculo en punto flotante es muy superior a la de los ordenadores personales corrientes. La CPU incorpora dos unidades de enteros (IU) de 64-bits, una unidad SIMD de 128 bits con 107 instrucciones para el procesamiento multimedia, dos unidades independientes de calculo de vectores en punto flotante (VU0, VU1), un circuito decodificador de MPEG-2 y controladores DMA de alto rendimiento. Son tres los componentes que pueden realizar operaciones en punto flotante en paralelo: Coprocesador 1 FPU con 1 FMAC1 y 1 FDIV 1 Unidad de multiplicación y acumulación en punto flotante CAPÍTULO 2. ARQUITECTURA DE LA PS2 7 Figura 2.2: Arquitectura del Emotion Engine Coprocesador 2 VU0 con 4 FMAC y 1 FDIV Unidad de proceso vectorial con 5 FMAC y 2 FDIV El rendimiento combinado de todos estos elementos permite calculos físicos complicados, generación de superficies NURBS y transformaciones geométricas 3D. Además de procesar los datos a 128-bits, es posible procesar y transferir volúmenes masivos de datos multimedia. Los 32 MB de RAM de memoria principal que soportan la velocidad de la CPU son Direct Rambus DRAM de dos canales para conseguir un ancho de banda de 3.2 GB/seg. Unas cuatro veces el rendimiento de las memorias PC-100 que se montaban en los ultimos PCs cuando salió al mercado la PS2. Con la incorporación del decodificador MPEG-2 en un chip, es posible procesar en paralelo datos gráficos 3D de alta resolución y imágenes DVD de alta calidad. Con una capacidad de calculo en punto flotante de 6.2 GFLOPS/seg, el rendimiento de esta CPU alcanza el de algunos supercomputadores. Cuando es aplicado al procesamiento de transformaciones de perspectiva y geométricas, que son las que se usan normalmente para el cálculo de gráficos en 3D, el rendimiento llega a 66 millones de polígonos por segundo. Este rendimiento es comparable con las estaciones gráficas usadas en la producción de películas de animación. CAPÍTULO 2. ARQUITECTURA DE LA PS2 8 2.2. IO Processor El IOP es el procesador que tenía la ’antigua’ PSX. Con la inclusión de este procesador dentro de la PS2 se ha conseguido la compatibilidad al 100 % con la PSX. Además, se le ha añadido al procesador soporte para IEEE 1394, también conocido como Firewire y para USB ya que estos son los nuevos estándares de interocnectividad. El nuevo IOP también incorpora las siguientes novedades sobre la CPU de la PSX: memoria cache mejorada, una nueva arquitectura DMA de alto rendimiento que permite un incremento de hasta 4 veces en la transferencia de datos. La interface serie también ha sido actualizada y es unas 20 veces más rápida que la de la PSX. La interfaz USB es compatible con OHCI (Open Host Controller Interface) y puede manejar transferencias de datos desde 1.5 Mbps hasta 12 Mbps. IEEE 1394 puede manejar tasas de transferencia desde 100 Mbps hasta 400 Mbps. El uso de estas interfaces permiten la futura conectividad de la PS2 a un gran variedad de otros sistemas como los VCR, Camaras digitales, Impresoras, Joysticks, Teclados, Ratones, etc. 2.3. Sintetizador Gráfico (GS) El sintetizador gráfico desarrollado por Sony incorpora un motor de rendering paralelo que contiene un bus de datos de 2560 bits de ancho el cual es unas 20 veces el tamaño de las tarjetas aceleradoras de los PCs. Tasas de relleno de pixeles muy altas y rendimiento en el dibujado es alcanzado a través de DRAM embebida. La PS2 introduce el concento de Sintetizador Gráfico a través del cálculo en tiempo real y dibujado de objetos 3D. La función de rendering ha sido especialmente optimizada para generar imágenes que soportan televisiones NTSC/PAL, televisión digital de alta resolución (HDTV) y el estándar VESA. La calidad de la imagen resultante en pantalla es comparable a la calidad de las peliculas de animación 3D en tiempo real. En el diseño de systemas gráficos, la capacidad de rendering es definida por el ancho de banda de la memoria entre el motor de pixels y la memoria de video. Los sistemas convencionales usan memoria externa VRAM alcanzada a traves de un bus externo al chip que limita el rendimiento total del sistema. Sin embargo, en el caso del nuevo GS, hay un ancho de banda de 48 Gigabytes que se ha alcanzado gracias a la integración de la memoria y el motor de render en el mismo chip. Cuando se dibujan pequeños polígonos, el rendimiento pico es de 75 millones de polígo- CAPÍTULO 2. ARQUITECTURA DE LA PS2 9 nos por segundo y el sistema puede dibujar 150 millones de partículas por segundo. Con esta capacidad, es posible generar imágenes con calidad de cine. Se pueden llegar a 20 millones de poligonos dibujados de forma sostenida usando Z-buffering, texturas, luces y transparencias. Esta nueva arquitectura puede ejecutar procesamiento en pasadas múltiples de forma recursiva y operaciones de filtrado a alta velocidad sin la asistencia de la CPU principal o el acceso al bus principal. Capítulo 3 Protección anticopia de la PS2 y modchips 3.1. Protección anticopia Los detalles de la protección anticopia que Sony utiliza para su PS2 no han sido publicados nunca, los datos que se conocen han sido realizados a través de ingeniería inversa por los creadores de los sistemas anticopia. Debido a problemas legales y/o intereses comerciales es difícil encontrar publicada la información obtenida por ingeniería inversa por lo que puede que la descripción que sigue no sea del todo exacta. La PS2 admite los formatos CDR de audio, CDROM modo XA2, DVD-Video y DVD-ROM. La PS2 no proporciona ningún esquema de protección contra los backups CDR de audio y utiliza la protección estándar para los DVD-video. Protección de los formatos DVD-video El DVD-video es el estándar para manejar video en MPEG 2 con su correspondiente stream de audio asociado y que puede ser leido por los reproductores DVD. La especificación del DVDvideo contempla la protección anticopia para proteger los productos de los grandes estudios cinematográficos. La protección del DVD-video se ve reforzada por un contrato que debe ser firmado por todos los fabricantes de reproductores DVD tanto hardware como software y que les obliga a implementar una serie de protecciones, entre ellas proteger las salidas digitales, implementar la separación por regiones, implementar tecnicas de ofuscación para hacer dificil la ingeniería inversa, etc. La protección del DVD-video es parte del la Content Protection System Arquitecture. Aun10 CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 11 que el formato DVD es anterior a la CPSA y por lo tanto no la implementa completamente. La especificación de la CPSA puede ser encontrada en [8]. Actualmente todas las protecciones de los DVDs han sido rotas. Protección de juegos En principio, el sistema de protección de la PS2 para los juegos en CDROM y en DVD es igual al de la PSX y consiste en la generación incorrecta de los códigos ECC y EDC de ciertos sectores del CD o del DVD. La especificación de la estructura del CDROM/XA se encuentra en el libro amarillo[9], en este documento se divide la estructura del cd en sectores de 2352 bytes cada uno. Al final de cada sector se encuentran los bytes de los códigos ECC (Error Correction Codes) y EDC (Error Detection Codes) que emplean información redundante sobre el sector para poder detectar y corregir los fallos de lectura. Tanto los códigos ECC y EDC son calculados por la grabadora a la hora de escribir los sectores. La protección se basa en emplear unas grabadoras especiales que permitan modificar estos códigos ECC y EDC, en el caso de la Playstation, los códigos de los 16 primeros sectores del disco han sido manipulados. Estos sectores contienen ceros en la información correspondiente al EDC y al ECC. Las grabadoras normales al intentar copiar estos discos, corrigen los códigos EDC y ECC automáticamente. La Playstation al no encontrar los ceros en estos sectores, supone que hemos introducido un CD de música y muestra el menú de audio o nos dice que el CD no es válido. Por otro lado, las pistas de datos están almacenadas en el sistema de ficheros ISO9660[10]. Cuando cualquier pista de datos esté seguida por una pista de audio, tiene que haber una separación a continuación de la de datos de al menos 150 sectores (2 segundos aprox.). Aplicado al disco de Playstation tenemos que siempre van 150 sectores llenos de ceros (0s) detrás de la pista del juego. El propósito de esta separación ’fisica’ es el de tener un buffer para ’ayudar’ a los lectores de CD que no siempre son capaces de pasar directamente de datos a audio o viceversa sin una separación mínima. Además, cuando una pista de audio sigue a una de datos tiene que empezar con otra separación de al menos 150 sectores que sirve para lo mismo que el postgap: separar pistas de datos y audio. En la PlayStation, los pregaps que normalmente encontramos son de 150 sectores (2 segundos) o 300 sectores (4 segundos). Cuando los pregaps separan dos pistas de audio pueden ser de 0 o 150 sectores según el disco. Por último, el leadout se escribe directamente por la grabadora (excepto en algunos modelos) CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 12 y su contenido no es modificable por el usuario. Tampoco es posible leer el leadout de un CD desde un lector ’doméstico’ de CD-ROMs. Bloqueo regional Además de la protección contra copias ilegales, la consola utiliza un sistema de ’bloqueo regional’. Esto se hace porque Sony tiene acuerdos distintos en los mercados Asiáticos, Americano y Europeo y entonces tienen que proteger los juegos para que no se puedan utilizar más que en el área geográfica para el que fueron distribuidos. El bloqueo regional funciona de la siguiente manera: Los primeros cinco sectores (000000-000004) contienen la información del área para el que se edita un determinado juego. Básicamente identifican el CD como Japonés, Americano o Europeo. Si la información que envía el CD no cuadra con la que tiene almacenada la consola nos vuelve a avisar que el CD introducido no es válido. 3.2. La partición de datos Como hemos visto en la sección anterior, la partición de datos se almacena en formato ISO9660[10]. La Playstation no soporta las extensiones Rock Ridge ni Joliet, esto supone una serie de limitaciones. Las más importantes son que no hay distinción entre mayusculas y minisculas en los nombres de ficheros y que la longitud de nombres de ficheros debe serguir el formato de DOS, esto es, 8 caracteres como máximo para el nombre y 3 para la extensión. Los juegos constan de una serie de ficheros binarios ejecutables y ficheros de datos. Los ficheros ejecutables compilados para el Emotion Engine están en formato ELF[11] que es el formato estándar en bastantes sistemas operativos, entre ellos Linux. El código de entrada/salida que se ejecuta en el IOP suele estar en ficheros binarios separados con extensión IRX también en formato ELF pero compilados para MIPS-I. Los juegos de la PS2 los podemos montar en nuestro sistema operativo y acceder al sistema de ficheros. En el proceso de arranque, la PS2 lee la tabla de contenidos de CD y busca un fichero llamado SYSTEM.CNF. Este fichero indica el nombre del ejecutable a cargar. El sistema operativo de la Playstation parsea el fichero y ejecuta el binario que se indica. Además de las protecciones físicas impuestas por Sony. Las productoras de videojuegos añaden mecanismos de protección extra usando en los juegos librerías criptográficas, comprobando el formato físico donde se ejecuta el juego, etc. Prácticamente todas estas protecciones se han roto CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 13 Algorithm 1 Manipulación del sistema de ficheros desde Linux # mount /mnt/cdrom # cd /mnt/cdrom # ls chall.ngh eorps2io.irx mcman.irx padman.irx sles_512.57 data ioprp254.img mcserv.irx sdrdrv.irx story.ngh default.ngh libsd.irx mtapman.irx sio2man.irx system.cnf # file sles_512.57 sles_512.57: ELF 32-bit LSB MIPS-III executable, MIPS, version 1 (SYSV), statically linked, not stripped # file mcserv.irx mcserv.irx: ELF 32-bit LSB MIPS-I processor-specific, MIPS, version 1 MathCoPro/FPU/MAU Required (SYSV), not stripped Algorithm 2 SYSTEM.CNF del juego THE SIMS BOOT2=cdrom0:\SLES_512.57;1 VER=1.02 VMODE=PAL y es fácil encontrar parches en Internet específicos para cada juego y que desabilita la protección de ese juego permitiendo su copia. 3.3. Método CogSwap para evitar la protección anticopia Existen varios programas comerciales que permiten ejecutar juegos en la Playstation modificando su comportamiento. Normalmente sirven para añadir vidas infinitas, inmunidad y otras caracterísitcas especiales a los juegos. Los programas de este tipo más conocidos son el Action Replay 2 (AR2) para PAL y el Gameshark 2 (GS2) pata NTSC, ambos de la misma compañía. Podemos aprovechar la capacidad de cargar otros juegos de este programa para ejecutar copias de juegos sin que salte la protección. El programa presenta un menú y una de las opciones es cargar un juego. Si introducimos un juego y pulsamos sobre esta opción, el juego cargará siempre que sea una copia original ya que cada vez que introducimos un juego, la PS2 realiza los tests de sectores erróneos, la comprobación de región y carga la tabla de contenidos en memoria del CD/DVD introducido. El método consiste en arrancar con el AR2 y abrir la bandeja del CD/DVD de la PS2 sin que a la PS2 le llegue la notificación, intercambiar los discos y pulsar sobre el menú de ejecutar. De CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 14 esta forma se ejecutará el juego sin llevar a cabo los chequeos anticopia. Hay varios métodos para abrir la bandeja sin que se le notifique a la PS2, los métodos van desde forzar la bandeja con un cuchillo hasta hacer una palanca especial para este menester. El método está comentado en detalle en [12]. Este método tiene varios inconvenientes aparte de que podemos romper la bandeja. Estos inconvenientes vienen de que la tabla de contenidos del nuevo disco introducido no se lee, por lo tanto la PS2 tiene los datos del disco anterior. Esto se traduce en que el fichero SYSTEM.CNF de la copia debe estar en la misma posición que tiene en el AR2. Esta posición en el LBA es la 12231. Por lo tanto debemos parchear la imagen ISO antes de pasarla a CD. Existen varios programas que se encargan de mover el SYSTEM.CNF a la posición correspondiente y rellenar el hueco que quede de ceros si es necesario. En [1] podemos encontrar varios programas que realizan esta función. A partir de la versión 1.3, el AR2 utiliza un método de carga del juego diferente y ya no es necesario que el SYSTEM.CNF se encuentre en la posición 12231. Otro de los inconvenientes es que la Playstation no leerá más del tamaño del AR2. Cada versión del AR2 tiene un tamaño, por ejemplo, el límite de la versión 2 es de 74 min. La única ventaja de este método con respecto a los chips, es que no se pierde la garantía de la PS2 puesto que no se abre. 3.4. Nosolder chips Para evitar el engorro del CogSwap y los posibles daños que se le puedan hacer a la consola, existen algunos chips, que sin necesidad de soldar, se pueden instalar en la PS2 y que evitan que se produzca la notificación de inserción del CD a la consola. Estos tipos de chips gozan de las mismas limitaciones que el CogSwap añadiendo que se pierde la garantía puesto que se tiene que abrir la PS2 para su instalación. Se puede encontrar información sobre su instalación en [13], en este mismo sitio se puede consultar el precio y hacer un pedido via Internet. Con este chip y el AR2 v1.3 o superior teoricamente es posible cargar cualquier copia de juego sin necesidad de parchearlo (siempre que el juego no implemente una protección hardware o software adicional). CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 15 3.5. Modchips El sistema más cómodo, aunque también el más complicado de instalar, es el uso de Modchips. Los Modchips interceptan los datos de protección anticopia enviados por el disco y envía los que la Playstation espera. De esta forma basta con introducir la copia y la Playstation automáticamente lo reconocerá como válido. Este método no tiene ninguna limitación de los métodos de swap, el único inconveniente es que, dependiendo del tipo de chip, hay que realizar hasta 40 soldaduras en distintos puntos para poder engañar a la BIOS. El modchip más fiable hasta la fecha es el Messiah 2. El uso y la venta de estos chips es perfectamente legal en España, por lo que se pueden encontrar en diversas tiendas por unos 40 E, incluso existen tiendas que venden la Playstation con el chip instalado, eso sí, sin garantía. 3.6. Backups de juegos bajo linux y creación de CDs para la PS2 Puesto que todo el entorno de desarrollo se instala fácilmente bajo el sistema operativo Linux (aunque se puede instalar bajo Windows usando Cygwin), a continuación se describen los distintos métodos de crear un CD bajo este sistema operative para que pueda ser leido por la PS2. Para realizar copias el método más rápido es usando el programa cdrdao[14], este programa hace una copia identica de la estructura del CD. El programa viene además con dos scripts, read-psx y write-psx que nos permiten leer y escribir directamente CDs para PSX. El programa también es capaz de escribir imágenes .cue/.bin generadas por el CDR-Win. Se puede usar el script write-psx para escribir la imagen o bien usar el siguiente comando directamente: # cdrdao write fichero.cue Si disponemos de la imagen del sistema de ficheros (iso9660) podemos usar el cdrecord[15] para grabar el CD, el comando sería: # cdrecord -dev=0,0,0 -multi fichero.iso o bien # cdrecord -dev=0,0,0 -xa1 fichero.iso CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 16 Para generar el sistema de ficheros del CD con los ficheros de los programas que estemos desarrollando usaremos el mkisofs que viene incluido con las cdrtools junto con el cdrecord. Para generar la imagen con nuestro programa, metemos todos los ficheros que van a ir en el CD en un directorio y usamos el siguiente comando: # mkisofs -o fichero.iso directorio Si queremos que el CD generado funcione con los métodos swap hay que parchearlo para que el SYSTEM.CNF esté en la posición adecuada. Normalmente los ficheros se almacenan en la imagen ISO ordenados alfabéticamente. En el caso de nuestros programas de prueba, al ser pequeños, el SYSTEM.CNF se encontrará por debajo del sector 12231 de la imagen. Para ver la posición donde se encuentra el fichero en la iso usaremos el comando isoinfo que se encuentra en el mismo paquete que mkisofs. Normalmente tendremos que generar un fichero vacio para empujar al SYSTEM.CNF a la posición conveniente. Como ejemplo vamos a ver el proceso de creación de una iso para la demo starsim. Una vez compilada la demo tenemos un fichero ejecutable, starsim.elf, este fichero es el que grabaremos en el CD junto con el SYSTEM.CNF que tendremos que generar para la ocasión. # cd starsim # ls starsim.elf system.cnf # cat system.cnf BOOT2 = cdrom0:\STARSIM.ELF;1 VER = 1.10 VMODE = PAL # cd .. # mkisofs -o starsim.iso starsim # isoinfo -l -i starsim.iso Directory listing of / d--------- 0 0 0 2048 May 6 2003 [ 23 02] . d--------- 0 0 0 2048 May 6 2003 [ 23 02] .. ---------- 0 0 0 126615 May 6 2003 [ 24 00] STARSIM.ELF;1 ---------- 0 0 0 56 May 6 2003 [ 86 00] SYSTEM.CNF;1 Como podemos observar, el SYSTEM.CNF está en la posición 86. Cada sector de la imagen iso es de 2048 bytes. Por lo tanto habrá que mover el SYSTEM.CNF 12231 - 86 = 12145 sectores. Creamos pues el fichero, que llamaremos 0.0 para que se ponga el primero y regeneramos la iso. CAPÍTULO 3. PROTECCIÓN ANTICOPIA DE LA PS2 Y MODCHIPS 17 # dd if=/dev/zero of=starsim/0.0 bs=2048 count=12145 # mkisofs -o starsim.iso starsim # isoinfo -l -i starsim.iso d--------- 0 0 0 2048 May 8 2003 [ 23 02] . d--------- 0 0 0 2048 May 8 2003 [ 23 02] .. ---------- 0 0 0 24872960 May 8 2003 [ 24 00] 0.0;1 ---------- 0 0 0 126615 May 6 2003 [ 12169 00] STARSIM.ELF;1 ---------- 0 0 0 56 May 6 2003 [ 12231 00] SYSTEM.CNF;1 La imagen iso parcheada es la que grabaremos en el CD con el cdrecord. Existe un programa, con código fuente, llamado arpatch que a partir de la imagen iso calcula automaticamente el tamaño del fichero 0.0 y lo genera. El programa también es capaz de parchear el fichero SYSTEM.CNF. Estudiando los fuentes del programa podemos comprobar que el parcheo que realiza sobre el SYSTEM.CNF es que si es menos de 56 bytes, añade al final caracteres 0x0A hasta que llega a ese tamaño. El programa lo podemos encontrar en [2, 1]. La finalidad de esta modificación al SYSTEM.CNF no la entiendo. Teoricamente estos pasos deberían crear una imagen válida para los métodos swap. En la realidad, con las nuevas versiones del mkisofs no funciona. Comparando imágenes iso que funcionan, con las generadas por este método, he visto que el mkisofs genera una sección para el arranque en desde CD, aunque esta sección no se utiliza. El problema es que esta sección ocupa un sector y por lo tanto el directorio raiz empieza en el sector 23. Como el Action Replay no tiene este sector de arranque el directorio raiz comienza en el sector 22. Ya que la PS2 no se ha enterado del cambio de disco y como guarda en caché la posición donde encuentra el directorio raiz, la imagen no funciona, habría que desplazar un sector todo el sistema de ficheros machacando el sector de arranque y reescribiendo la posición del directorio raiz en la descripción del volumen principal que es lo que realmente está en caché y contiene todas las limitaciones del método swap. El programa ps2mkisofs[1], genera la imagen iso con el directorio raiz en la posición correcta, por lo tanto las isos generadas por este programa funcionan perfectamente en la PS2. A partir de la versión 1.3 del AR2, el sistema de carga ha cambiado y no es necesario que el SYSTEM.CNF se en cuentre en el sector 12231, por lo que funcionarán imágenes sin parchear siempre que el directorio raiz empieze en el sector 22 de la iso. Capítulo 4 Métodos de programación de la PS2 4.1. Kit de desarrollo de Sony Sony vende el Sony Computer Entertainment Development Kit DTL-T10000 para desarrollar programas y juegos para la PS2. El coste por unidad es de unos 20.000 $, lo que lo hace inaccesible para usuarios normales, incluso para empresas pequeñas ya que normalemente sobre un kit pueden trabajar 1 o 2 personas por lo que para un equipo de desarrollo habrá que comprar varios kits con el consiguiente desembolso. El KIT contiene dos PS2 de desarrollo: La PS2 TEST, es igual que una PS2 normal pero puede leer cdr sin necesidad de modchips. La PS2 TOOL, es bastante más grande que una PS2 normal debido al aumento de los componentes con respecto a esta, entre las diferencias, destacan: • 128 MB de memoria principal • Disco duro • Tarjeta de red Sony proporciona a los desarrolladores esta máquina de tal forma que compilan su código y se ejecuta sobre el hardware de esta PS2. Sony sólo proporciona el hardware y las librerias,así como asesoría y ejemplos. Existen una serie de entornos de desarrollo comerciales. Entre ellos los dos mas conocidos: ProDG de Snsys. Tienen diferentes módulos, incluido uno muy interesante llamado proview que permite mediante el uso del interfaz firewire conectar una PS2 modelo DTL-H 18 CAPÍTULO 4. MÉTODOS DE PROGRAMACIÓN DE LA PS2 19 Figura 4.1: Kit de desarrollo Test Unit a un pc. Este modelo de PS2 tiene la peculiaridad de que es capaz de leer y ejecutar cdr ( sin chip ni nada parecido dado que es una unidad de testeo para desarrolladores). Snsys te proporciona con el proview los archivos de una iso que corre en esta PS2 a modo de programa monitor permitiendo la comunicación con el software que corre en el PC. ¿Y para que demonios sirve esto? Pues muy fácil, para subir el código que tu compilas directamente y ejecutarlo sin necesidad de grabar un cd por cada prueba. También tiene heramientas de debug que redirigen la salida al lado del pc para facilitar el desarrollo. CodeWarrior de Metrowerks. Al igual que Snsys nos proporciona un entorno de desarrollo completo con multitud de herramientas. Para tener acceso a estas herramientas es necesario ser desarrollador oficial de Sony y estar registrado como tal. 4.2. Kit de linux El kit de Linux para PS2[7] permite ejecutar una distribución Linux en la PS2. Esto convierte a la consola en un ordenador de sobremesa plenamente funcional. El kit de Linux contiene: CAPÍTULO 4. MÉTODOS DE PROGRAMACIÓN DE LA PS2 20 un disco duro interno de 40 GB un teclado usb un ratón usb una tarjeta de red 10/100 Base-T dos discos DVD El primero contiene el entorno de ejecución (RTE) y los manuales de la PS2 que Sony suele incluir en el kit de desarrollo. El segundo disco contiene todo el software de la distribución que se puede instalar en el disco duro. El kernel de Linux contiene drivers que ocultan el hardware e impiden el acceso directo a la IOP. Sony proporciona solo los binarios de estos drivers por lo que existen limitaciones a la hora de programar la PS2 con este kit. Por ejemplo estos drivers no proporcionan interfaz con el puerto Firewire, por lo que es imposible de programar este puerto. El Kit viene con el compilador de GNU gcc, las xfree y muchas otras utilidades. Por lo que tenemos un completo entorno de desarrollo. Aunque los programas o juegos que se desarrollen sobre el kit de Linux solo podrán ejecutarse en una PS2 que tenga el kit. 4.3. Programación RAW La programación RAW consiste en escribir programas para la PS2 sin utilizar ni el kit de desarrollo de Sony, ni el kit de Linux. El desarrollo se realiza en un PC mediante el uso de compiladores cruzados. Necesitamos trabajar con los siguientes procesadores: El procesador principal es un MIPS R5900[16], este procesador implementa todas las instrucciones del MIPS III ISA, algunas del MIPS IV y un conjunto propietario de instrucciones multimedia. Información sobre el conjunto de instrucciones y su uso se encuentran en [17, 18] Unidades vectoriales (VU0, VU1) IOP, es un MIPS R3000 CAPÍTULO 4. MÉTODOS DE PROGRAMACIÓN DE LA PS2 21 Existen herramientas libres de desarrollo libres capaces de generar código para todos los procesadores de la PS2. Estas herramientas son: binutils Es una colección de herramientas multiplataforma para trabajar con ficheros ejecutables, entre las que destacan: ld, el linkador de GNU as, el ensamblador de GNU gcc Es la colección de compiladores de GNU. Estos compiladores son capaces de generar código para una gran cantidad de plataformas. Nos interesa especialmente el compilador de C. ps2lib Es una librería open-source para desarrollar directamente con la PS2. Esta librería ha sido desarrollada a base de ingeniería inversa. La librería proporciona un gran número de funciones básicas para acceder al hardware de la PS2. Como la PS2 tiene dos CPUs (EE e IOP), la librería está formada por dos partes, cada una con funciones para una CPU. Newlib Es la librería que implementa las funciones de estándar de C (libc) y las funciones matemáticas (libm). Es una librería de Cygnus usada en muchos sistemas empotrados debido a su pequeño tamaño que ha sido adaptada para la PS2. Cuando comenzó la programación RAW de la PS2, para probar los programas que se estaban desarrollando había que grabarlos en un CD y ejecutarlos con alguno de los métodos vistos anteriormente. Esto hacía muy engorroso (y caro) el desarrollo. Con el tiempo han ido surgiendo programas que mediante la conexión de la PS2 al PC permiten enviar los programas compilados del PC a la PS2 para que esta la ejecute. De esta forma el proceso de desarrollo se ha dinamizado bastante. Existen tres programas de este tipo, uno para cada forma de conectar la PS2 con el PC[19]: Pukklink/InLink, que usa la tarjeta de red que se encuentra en el kit de Linux para transmitir los ejecutables. Naplink, usa un cable USB <->USB El método más común, por ser el más barato, es hacerlo con el Naplink. El único problema con este método es que hay que usar un cable USB que tenga el chip PL-2301 o PL-2302. Una vez que tengamos el cable, conectamos el PC a la PS2. En la PS2 ejecutamos el Naplink servidor, que tenemos que tener previamente grabado en un CD, y en el PC ejecutamos el Naplink cliente. Desde el cliente podremos indicarle a la PS2 el ejecutable a cargar. Existen versiones del cliente para Windows y para Linux. Capítulo 5 Instalación del entorno de programación RAW En este capítulo vamos a ver como instalar el entorno de desarrollo para empezar a programar la PS2. El entorno de desarrollo se compone de los compiladores cruzados de C y ensamblador para el EE y el IOP. También compilaremos las binutils para que se puedan programar las unidades vectoriales en ensamblador. Por último hay que instalar las librerías que nos facilitarán la tarea de acceso al hardware. El método de instalación descrito es para máquinas Unix, aunque también se puede instalar en Windows usando el entorno Cygwin que simula un entorno Unix en Windows. 5.1. Preparando el entorno Lo primero es elegir el directorio donde se va a instalar el entorno de programación y crear la estructura de directorios que albergará nuestras utilidades y compiladores para la PS2. En este caso se van a instalar todos los componentes en el directorio /opt/ps2dev. Creamos la estructura de directorios con: # cd /opt # mkdir ps2dev # cd ps2dev # mkdir ee iop newlib ps2lib Los funcionalidad de los directorios creados es evidente. 22 CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 23 A continuación crearemos el script ps2dev.sh que irá en /opt/ps2dev y que servirá para poner las variables de entorno necesarias para compilar. Habrá que ejecutar este script antes de empezar a programar. No es mala idea incluir las variables de entorno en el .bashrc para que estén siempre cargadas. El contenido del script es el siguiente: PS2DEV=/opt/ps2dev EE=$PS2DEV/ee IOP=$PS2DEV/iop PS2LIB=$PS2DEV/ps2lib NEWLIB=$PS2DEV/newlib PATH=$PATH:$PS2DEV/bin:$EE/bin:$IOP/bin export PS2DEV EE IOP PS2LIB NEWLIB PATH Veamos a continuación el proceso de instalación de los compiladores necesarios. 5.2. Emotion Engine La versión de GNU de binutils y gcc no soportan el juego completo de instrucciones del EE por lo tanto tenemos que descargarnos las versiones adaptadas a esta CPU. Podemos encontrar las binutils y el gcc para EE en [20]. Una vez descargado el fichero, estos son los pasos a seguir para compilar e instalar el compilador y el ensamblador del EE: # source /opt/ps2dev/ps2dev.sh # tar xzvf gnu-ee-binutils-gcc-1.1.tar.gz # cd gnu-ee-binutils-gcc # ./configure --prefix=$EE --target=mips64r5900-sf-elf # make LANGUAGES="c" # make install Esta versión tiene algunos problemas para compilar con los últimos compiladores, estos son los cambios que he tenido que hacer para que compile en mi ordenador: El paquete gperf debe estar instalado En el fichero gcc/c-lex.c hay que eliminar la línea: CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 24 #include "rtl.h" En el fichero gcc/cppobscure.c, cambiar la línea: #include <sys/utime.h> por: #include <utime.h> En el fichero cpp/cpplib.c, cambiar la linea: extern int devstudioflag; por: int devstudioflag; En el fichero gcc/Makefile, cambiar la linea: stmp-fixproto: fixhdr.ready fixproto stmp-headers por: stmp-fixproto: fixhdr.ready stmp-headers En el fichero gcc/cp/pt.c, borrar la linea: #include "parse.h" Creamos enlaces simbolicos a los programas recien compilados para que los nombres sean más manejables: # cd /opt/ps2dev/ee/bin # ln -s mips64r5900-sf-elf-addr2line ee-addr2line # ln -s mips64r5900-sf-elf-ar ee-ar # ln -s mips64r5900-sf-elf-as ee-as # ln -s mips64r5900-sf-elf-c++filt ee-c++filt # ln -s mips64r5900-sf-elf-gasp ee-gasp CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 25 # ln -s mips64r5900-sf-elf-gcc ee-gcc # ln -s mips64r5900-sf-elf-ld ee-ld # ln -s mips64r5900-sf-elf-nm ee-nm # ln -s mips64r5900-sf-elf-objcopy ee-objcopy # ln -s mips64r5900-sf-elf-objdump ee-objdump # ln -s mips64r5900-sf-elf-protoize ee-protoize # ln -s mips64r5900-sf-elf-ranlib ee-ranlib # ln -s mips64r5900-sf-elf-readelf ee-readelf # ln -s mips64r5900-sf-elf-size ee-size # ln -s mips64r5900-sf-elf-strings ee-strings # ln -s mips64r5900-sf-elf-strip ee-strip # ln -s mips64r5900-sf-elf-unprotoize ee-unprotoize Ya tenemos el compilador de ensamblador, ee-as, y de C, ee-gcc, listos para funcionar. 5.3. Unidades Vectoriales Las unidades vectoriales pueden ser programadas en modo interactivo o mandándole un programa y diciendo que lo ejecute. Para la segunda forma, necesitaremos un compilador que genere código para estas unidades vectoriales. Primero, en el fichero gnu-ee-binutils-gcc/config.sub, buscamos la linea que contiene: tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k ... y entre “tahoe” y “i860” introducimos “dvp”: tahoe | dvp | i860 | ia64 | m32r | m68k | m68000 ... Y ejecutamos lo siguiente para generar el compilador de ensamblador: # cd libiberty # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install # cd ../bfd CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install # cd ../opcodes # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install # cd ../binutils # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install # cd ../ld # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install # cd ../gas # sh ./configure --target=dvp-elf --prefix=$EE # make all # make install Ya solo queda generar los enlaces correspondientes con nombres más manejables: # cd $EE/bin # ln -s dvp-elf-addr2line dvp-addr2line # ln -s dvp-elf-ar dvp-ar # ln -s dvp-elf-as dvp-as # ln -s dvp-elf-c++filt dvp-c++filt # ln -s dvp-elf-gasp dvp-gasp # ln -s dvp-elf-ld dvp-ld # ln -s dvp-elf-nm dvp-nm # ln -s dvp-elf-objcopy dvp-objcopy # ln -s dvp-elf-objdump dvp-objdump # ln -s dvp-elf-ranlib dvp-ranlib # ln -s dvp-elf-readelf dvp-readelf # ln -s dvp-elf-size dvp-size # ln -s dvp-elf-strip dvp-strip 26 CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 27 5.4. IOP El procesador de la IOP está soportado por las utilidades estándar de las GNU, por lo que usaremos el gcc[23] y las binutils bajadas del sitio de GNU[22]. Compilación de las binutils # tar xzvf binutils-2.11.2.tar.gz # ./configure --prefix=$IOP --target=mipsel-sf-elfl # make # su # make install Compilación del gcc # cd .. # tar xzvf gcc-2.95.2.tar.gz # cd gcc-2.95.2 # ./configure --prefix=$IOP --target=mipsel-sf-elfl --with-gnu-ld --with-gnu-as --disable-shared --enable-languages="c" --with-newlib # make all-gcc # su # make install Creamos los enlaces simbólicos: # cd $IOP # ln -s mipsel-sf-elfl-addr2line iop-addr2line # ln -s mipsel-sf-elfl-ar iop-ar # ln -s mipsel-sf-elfl-as iop-as # ln -s mipsel-sf-elfl-gasp iop-gasp # ln -s mipsel-sf-elfl-gcc iop-gcc # ln -s mipsel-sf-elfl-ld iop-ld # ln -s mipsel-sf-elfl-nm iop-nm # ln -s mipsel-sf-elfl-objcopy iop-objcopy CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 28 # ln -s mipsel-sf-elfl-objdump iop-objdump # ln -s mipsel-sf-elfl-ranlib iop-ranlib # ln -s mipsel-sf-elfl-readelf iop-readelf # ln -s mipsel-sf-elfl-size iop-size # ln -s mipsel-sf-elfl-strings iop-strings # ln -s mipsel-sf-elfl-strip iop-strip 5.5. Newlib y ps2lib La forma más fácil de instalar estas librerías es bajándolas ya precompiladas. Los ficheros ps2lib-1.9.tar.gz y ee-newlib-binary-1.81.tar.gz que se pueden encontrar en [24] contienen estas librerías. Para instalarlas simplemente tenemos que descompirmirlas en el directorio /opt/ps2dev. Los directorios include y lib, habrá que indicárselos explícitamente al compilador con las opciones -I y -L para que encuentre las librerías cuando estemos compilando nuestros programas. 5.6. Compilando una demo Para probar nuestro entorno, nos bajaremos la demo de funslower de [25] e intentaremos compilarla. La demo contiene un fichero llamado crt0.s. Este fichero lo necesita el ee-ld para poder funcionar. Muchas demos y librerias lo traen. Vamos a compilarlo y lo ponemos en un sitio donde siempre lo encuentre el cargador: # ee-as -mcpu=5900 -EL crt0.s -o crt0.o # cp crt0.o $EE/mips64r5900-sf-elf/lib También es necesario para compilar, un script para el ld que le indique la posición de inicio del código ejecutable, el alineamiento de las secciones y algunos parámetros más, ya que los valores por defecto del ld no son los correctos. Este fichero se llama linkfile y también viene con la demo. El fichero se añada con -Tlinkfile al comando de linkado. Tendremos que editar el Makefile para indicarle los nombres de nuestras utilidades. Habrá que cambiar: CPATH = ../ee-bin/bin/mips64r5900-sce-elf- CAPÍTULO 5. INSTALACIÓN DEL ENTORNO DE PROGRAMACIÓN RAW 29 CC = $(CPATH)gcc.exe VAS = $(CPATH)dvp-as.exe AS = $(CPATH)as.exe LD = $(CPATH)ld.exe OBJCOPY = $(CPATH)objcopy.exe por: CPATH = $(EE)/bin CC = $(CPATH)/ee-gcc VAS = $(CPATH)/dvp-as AS = $(CPATH)/ee-as LD = $(CPATH)/ee-ld OBJCOPY = $(CPATH)/ee-objcopy Tambien hay que compilar con el compilador normal de nuestra máquina el fichero rawasm.c que se usará para convertir una imagen de la demo a asm: # gcc -o rawasm rawasm.c Seguidamente podemos probar a compilar el programa: # make Si todo ha ido bien, se habra generado el ejecutable main.elf. Podremos probar la demo con el Naplink, si poseemos el cable apropiado o grabando el ejecutable junto con un system.cnf que tendremos que generar en un CD y probándolo directamente. Bibliografía [1] PS2DEV network. http://ps2dev.livemedia.com.au [2] PS2DEV. http://ps2dev.sourceforge.net [3] PS2 Reality. http://www.ps2reality.net [4] El Otro Lado. http://www.elotrolado.net [5] Specs for Freeware Developers. http://www.ccs.neu.edu/home/bchafy/cdb/info/info.html [6] Protection technologys. http://www.goldenpi.no-ip.org/drm/protection.shtml [7] Playstation 2 Linux Comunity. http://playstation2-linux.com [8] Especificación CPSA. http://www.goldenpi.no-ip.org/drm/pdf/cpsa081.pdf. [9] Libro amarillo de la especificación CDROM. http://www.ecma.ch/ecma1/stand/ecma130.htm [10] Especificación del sistema de ficheros ISO9660. http://www.ecma-international.org/publications/files/ecma-st/Ecma-119.pdf [11] Executable and Linkable Format (ELF) ftp://ftp.opennet.ru/pub/docs/program/elf.ps.gz Specification (Programmer Guide). [12] Método CogSwap detallado. http://www.elotrolado.net/showthread.php?s=c951dd40188a330e6d21ead49a60bed2&threadid=92424 [13] Chips No solder. http://www.chipspain.com/guias/v5-v6.htm [14] Homepage de cdrdao. http://cdrdao.sourceforge.net/ 30 BIBLIOGRAFÍA 31 [15] Homepage de cdrecord y cdrtools. http://www.fokus.fhg.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html [16] Procesadores MIPS. www.mips.com [17] MIPS ISA. http://www.mips.com/publications/index.html [18] Conjunto de instrucciones y programación del MIPS III. http://decstation.unixag.org/docs/ic_docs/3715.pdf [19] Distintos métodos de carga. http://ps2dev.livemedia.com.au/kb/kb.asp?T=863 [20] Compilador y binutils para EE. http://ps2dev.sourceforge.net/downloads/ee/gnu-eebinutils-gcc-1.1.tar.gz [21] Parches para el compilador EE y binutils del kit de linux. http://www.cip.informatik.unimuenchen.de/~bolzer/ps2linux/src/ [22] Download de binutils 2.11. ftp://ftp.gnu.org/gnu/binutils/binutils-2.11.2.tar.gz [23] Download del gcc 2.95.2. ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.2.tar.gz [24] Newlib y ps2lib. http://ps2dev.sourceforge.net/ps2lib.html [25] Demo de Funslower. http://ps2dev.livemedia.com.au/kb//files/FSsource.zip