viernes, 17 de agosto de 2012

Resurrección

Cuatro años han pasado desde la última entrada de este blog y desde que la traducción quedó en estado de letargo por problemas técnicos: los recursos del juego pisoteaban en memoria el script que había crecido mucho en español. Una auténtica pena que no parecía tener solución tras mucho mirarlo.

Que el script del juego se inflara tanto era consecuencia de que cada carácter ocupaba 2bytes, lo habitual en la codificación japonesa. Una de las posibles soluciones, teóricamente, era hacer que el juego comprendiera carácteres escritos usando un único byte, porque nuestro alfabeto tiene de sobra con un byte por carácter... Pero hacer eso no era nada fácil, posible seguro, pero casi imposible para mí y mis conocimientos. La traducción tendría que estar parada de forma indefinida hasta encontrar una solución o a alguien capaz de crearla.

Y así fue, la traducción quedó en un coma indefinido. Pero el tiempo sirve para aprender, y eso ha pasado; he aprendido bastantes cosas que antes no sabía. Algunas de mi amigo Wiz, otras de personas anónimas que comparten información por internet, y otras por mí mismo. Y ese conocimiento adquirido en estos cuatro últimos años, ¡me ha permitido solucionar el problema! He logrado hacer que el juego funcione con carácteres de 1byte, lo que evita el engorroso fallo que sucedía. Todo ha pasado a ser 1byte; los carácteres y los diferentes opcodes que actúan sobre el texto.

El primer paso para lograrlo lo hice en 2011, cuando empecé a intentar encontrar la rutina del juego que se encarga de tratar los textos. Poco a poco fui sacándola en el ejecutable del juego y descifré parte, aunque no toda.


Toquetearla no daba resultado porque otras partes del juego contaban con trabajar con dos bytes o resultados de operaciones hechas con esos dos bytes que se usaban por carácter. Además de que no tenía toda la función descifrada, así que siempre se me podía escapar algo crucial.

Tras varios intentos de encontrar solución al asunto llegué al siguiente pensamiento; si el juego quiere dos bytes le daremos dos bytes, pero se los daremos añadiendo uno en el proceso de la rutina del juego. Esto quiere decir que los carácteres en el fichero y en memoria estarán escritos usando 1byte y que cuando la consola los lea les añadirá un segundo byte para que el juego los entienda. Para hacer esto había que tocar a otro nivel las instrucciones del juego. No solo había que modificar código, sino que había que crear nuevo. Y como somos muy "machos" todo ello usando código máquina directamente.

En el último mes he terminado de encontrar/descifrar las partes de la rutina que necesitaba saber y he empezado a aprender SH2 según lo he ido necesitando. Por suerte por la red hay bastante material oficial sobre la familia "Hitachi SuperH" y el documento "Hitachi SuperH RISC Engine SH-1/SH-2/SH-DSP Programming Manual" me ha venido de perlas. Sin él me habría costado horrores el ir descifrando las instrucciones que he necesitado crear y posiblemente no lo hubiera logrado.

Para ir terminando este tochopost resumiré lo que he tenido que hacer. He tenido que modificar diferentes partes de varias subrutinas del juego y crear dos pequeñas rutinas que interceptan  la rutina principal del juego y así poder hacer lo que a mí me interesa. La verdad es que trabajar en código máquina directamente me ha dado algún que otro dolor de cabeza por pequeños errores tontos, pero al final todo ha ido como la seda. Y debo decir que haciendo todo esto he disfrutado como un niño :)

Como anécdota comentar que por falta de descubrir un trozo de función me encontré con la situación que todos los textos del juego se mostraban conforme iba pulsando A, jejeje. 

Gracias a esta modificación en el código del juego que permite usar carácteres de 1byte el script ha pasado a ocupar miseria y hay espacio de sobra. Aunque debo advertir que seguramente surja algún otro problema para completar la traducción (los libros y alguna otra cosa), pero por ahora todo lo que es la historia principal está cubierta. Y lo cierto es que ahora me veo algo más capacitado para solucionar lo que pueda surgir. 

La historia continua... ;)