TUTORIAL: Cambiar un fichero en una imagen de PSX

Tutoriales, herramientas, aportes, etc

Moderador: skybladecloud

Responder
CUE

TUTORIAL: Cambiar un fichero en una imagen de PSX

Mensaje por CUE » Vie Oct 23, 2009 7:36 pm

Bueno, pues empiezo otro tocho, que se compondrá de varias partes. Lo iré poniendo poco a poco, que ahora tengo poco tiempo.

Está destinado a programadores y explicaré, más o menos, cómo es la estructura de un CD de la PSX y cómo cambiar un fichero del mismo, sin importar si el que queremos poner es más grande o más pequeño que el original, actualizando todo lo necesario para que quede bien. Incluiré algunas funciones de cosecha propia para hacerlo, todas en C, por si alguien quiere incorporarlas a sus programas o por si quiere hacer uno propio.

Ojo, que cambiar un fichero no implica que después funcione el juego. Muchos juegos llevan en su ejecutable, o en uno de los ficheros, una tabla indicando los LBA de cada fichero del juego, y si éste cambia de tamaño hay que modificarla, pero esa es otra historia que será contada en otra ocasión...

CUE

Sectores de un CD de PSX

Mensaje por CUE » Dom Oct 25, 2009 10:00 am

Lo primero es hablar de los sectores de un CD. Cada sector ocupa siempre 2352 bytes, eso es así por norma. Ese número es conocido por muchos porque a la hora de hacer la imagen de un CD de la PSX, siempre hay que elegir en los programas la opción MODE2/2352.

Cuando grabamos un segundo de música, necesitamos 16 bits (2 bytes) por cada muestra. Como se graba a 44.1KHz, es decir, 44100 muestras por segundo, necesitaremos 44100 * 2 = 88200 bytes. Además, como se graba en estéreo, necesitamos el doble de ese valor, 88200 * 2 = 176400. Entonces tenemos que cada segundo de música necesita 176400 / 2352 = 75 sectores. Esto es importante porque en los sectores de PSX (en los de los demás también, pero como sólo voy a hablar de PSX paso del resto) se almacena información del tiempo empleado o necesario, que es una forma de indicar el número de sector.

Los números de sector se guardan en el formato MM:SS:FF, donde MM es el número de minuto, SS el número de segundo y FF el número de fracción, que corresponde a 1/75 de segundo.

Con los CDs de datos no es exactamente lo mismo. De esos 2352 bytes sólo se utilizan 2048 (2KB) para almacenar datos en cada sector. El resto se usa para guardar otro tipo de información.

Aquí es donde la PSX es un tanto especial, pues los CDs pueden tener dos tipos de sectores, los llamados MODE2/FORM1 y MODE2/FORM2.

El FORM1 es más o menos normalito, muy similar a cualquier sector de un CD de datos. Su estructura es la siguiente:
- 12 bytes con el campo de sincronización. Estos datos los utiliza el lector para saber dónde empieza el sector. Siempre tiene el mismo valor: un cero, 10 valores -1, un cero (0x00, 0xFF, 0xFF,... ,0xFF, 0x00).
- 4 bytes con la cabecera. Los tres primeros bytes corresponden al número de sector en formato MM:HH:FF y el último indica el modo, que en la PSX siempre es 2 (MODE2).
- 8 bytes con la subcabecera. Realmente son 4 bytes, pero se repiten como medida de seguridad, siendo los 4 últimos igual a los 4 primeros. Más adelante explico algo de ellos.
- 2048 de datos, que es donde se almacena la información de los ficheros.
- 4 bytes con el EDC, código de detección de errores. No es más que un simple CRC32 inverso de todo lo que hay a partir de la subcabecera (subcabecera + datos).
- 276 bytes con el ECC, codigo de detección de errores. Realmente son dos tablas de paridad, de 172 y 104 bytes respectivamente, y sirven para recuperar datos cuando hay errores de lectura.

El FORM2 es ligeramente distinto. También tiene campo de sincronización, cabecera y subcabecera, pero después la cosa cambia. En vez de 2048 bytes para datos tiene 2324 bytes, seguidos de los 4 bytes del EDC.

¿A qué se debe que haya dos tipos de sector? Pues es muy sencillo. El FORM1 se usa para ficheros de datos, donde es muy importante que todo esté tal y como es originalmente. Por eso se incluyen esos bytes de corrección de errores. Basta pensar, como ejemplo, que cambiar un sólo bit en un programa puede hacer que el sistema se caiga. El FORM2 se usa para ficheros de vídeos y música, donde cambiar un simple bit no provoca nada catastrófico (puede pasar, pero no es lo normal). Incluso pueden encontrarse vídeos que tengan la parte de audio en una forma y la de vídeo en otra.

El FORM2 tiene además otra ventaja. Como almacena más información en un sector, serán necesarios menos sectores para guardar los datos. No hay que olvidar que la PSX tiene un lector que ya es bastante antiguo, y cuanto menos se utilice, mejor que mejor.

Vamos a ver un ejemplo con un vídeo de 1MB. Si se grabase como FORM1 necesitaríamos 1048576 / 2048 = 512 sectores, pero como se graba como FORM2, se necesitan 1048576 / 2324 = 452 sectores. Un montón de sectores que nos ahorramos y que la unidad lectora no tiene que leer, ganando tiempo y prolongando la vida útil del lector.

Normalmente los fichero .STR o .XA, bastante conocidos en la PSX, suelen estar grabados en modo FORM2. Más adelante pondré un programita que dirá la forma en que están grabados cada uno de los ficheros de un CD de la consola.

Ahora vamos a terminar hablando de la subcabecera antes mencionada. La verdad es que se encuentra muy poca información sobre ella, y sólo sé tratarla bien para los sectores de tipo FORM1.

Los 4 bytes que tiene se denominan:
- FN, File Number, número de fichero. De éste no voy a contar nada, pero es porque no tengo una idea exacta de su uso, sólo aproximada.
- CN, Channel Number, número de canal. Poco sé de éste también. Parece ser que suele usarse en ficheros de música que tiene datos entrelazados, indicando a qué canal van. En los vídeos suelen usarse 7 sectores para la imagen y luego otro para el sonido, y es en este byte donde se indica.
- SM, Sub Mode. Éste es facilito. Cada uno de los 8 bits de este valor nos da información que podemos usar:
Bit 0: EOR, fin de registro
Bit 1: Vídeo
Bit 2: Audio
Bit 3: Data
Bit 4: Trigger
Bit 5: FORM2
Bit 6: RT, tiempo real
Bit 7: EOF, fin de fichero
- CI, información de codificación. Relacionado con música y audio. Puede indicar la frecuencia, si es estéreo, pero no tengo muy claro cómo va.

Ahora toca explicar el byte del Sub Mode. Siempre encontraremos que uno de los bits 1-2-3 está a uno y los otros dos a cero. Nos sirve para saber el tipo de datos grabado.
El bit 5 es el que nos sirve para saber si un sector está grabado como FORM1 o FORM2.
Los bits 0 y 7 se emplean para saber cuándo acaba un fichero o un registro.
El bit 6 indica si los datos dependen del tiempo.
Del bit 4 poco sé. Lo único que he podido averiguar es que depende del sistema operativo, por lo que es bastante probable que no use en la PSX.

En los ficheros, y así servirá para más adelante, esos 4 bytes tienen siempre el valor 0x00-0x00-0x08-0x00 en cada sector, excepto en el último, que es 0x00-0x00-0x89-0x00 (si sólo tiene un sector, también serán estos valores). Veamos por qué es así (sólo el tercer byte, que los demás siempre estarán a 0), analizando esos valores de 0x80 y 0x89 que aparecen (analizando desde el bit 0 hasta el 7):

0x08 es 00001000 en binario, que nos indica:
Bit 0: 0- no es fin de registro
Bit 1: 0- no es vídeo
Bit 2: 0- no es audio
Bit 3: 1- son datos
Bit 4: 0- el trigger, no usado o a saber lo que indica
Bit 5: 0- es FORM1
Bit 6: 0- el RT, no usado o a saber lo que indica
Bit 7: 0- no es fin de fichero

0x89 es 10001001 en binario, que nos indica:
Bit 0: 1- es fin de registro
Bit 1: 0- no es vídeo
Bit 2: 0- no es audio
Bit 3: 1- son datos
Bit 4: 0- el trigger, no usado o a saber lo que indica
Bit 5: 0- es FORM1
Bit 6: 0- el RT, no usado o a saber lo que indica
Bit 7: 1- es fin de fichero

En un fichero de datos siempre coinciden los bits de fin de fichero y de registro. Hay otros sectores, como los que contienen los descriptores de medio, que el fin de cada registro no coincide con el del fichero, pues estos pueden tener varios registros.

Bueno, pues por si hay algún loco que se ha leído esto y se pregunte la utilidad de todo este rollazo, hay que explicar que si se quiere cambiar un fichero de sitio es necesario actualizar toda esta información del sector. Por la red hay programas que permiten crear una imagen de CD a partir de sus ficheros, pero tratan todos como si fueran del tipo FORM1, grabando los ficheros que originalmente estaban como FORM2 de esta forma, lo que nos produce una imagen siempre más grande que la original.


Bueno, pues no más rollo por hoy.
CUE

CUE

Mensaje por CUE » Lun Dic 21, 2009 10:16 am

El post no está muerto. Una vez acabado todo el rollo del BoF4 y sacando un poco de tiempo antes de que acabe el año, espero terminar el rollo. Como no quiero meter más caña que luego no entenderá ni Cristo, postearé al final de todo una pequeña utilidad para cambiar ficheros de una imagen de PSX en vez del código, que cualquiera que sepa un poco de programación podrá hacerlo él mismo con las explicaciones dadas.

Lo que queda:
- estructura de datos de un CD (rollo a escribir que nadie leerá)
- breve explicación de cómo cambiar un fichero (a lo mejor lo lee 1)
- el programita (a lo mejor lo utilizan 2 y algún guiri)

* el programa es una versión muy básica hecha en 15 minutos, así que le faltan añadir una serie de controles, como no dejar cambiar un fichero de 1KB por uno de 100GB, pero esas chuminadas no me interesan por ahora.

Responder