Anoche le volví a dar una vuelta al Loom de Atari a partir de donde acabaron mis pesquisas el domingo pasado, y no me extraña que en los diversos foros extranjeros aparezca como que fue un coñazo para desproteger en su día. El tema es que el juego consta de un bucle principal que está continuamente repitiéndose, y que va haciendo sucesivas llamadas a "eventos" que medirán algo del juego. El bucle es el mismo independientemente de qué momento nos encontremos y de qué parezca estar esperando en la pantalla, sea la elección del nivel de dificultad o la de los iconos pidiendo la clave de acceso.
También se ve claramente -para el que ha debugeado algo similar en el pasado- que el juego está hecho en alto nivel y no en código máquina, pues contiene las típicas llamadas traducidas de C en las que se pasan un montón de valores a la pila y el código va jugando con la pila y no con los registros del procesador, ni con las posiciones de memoria reales donde quedan las cosas. Se complica comparado con los 8 bits, porque el Motorola 68000 no posee una única pila, sino que puede "reservar" espacio dinámico asociado a cualquier puntero de direcciones y trabajar con ese espacio como una base + despazamiento relativo, sin preocuparse de su posición absoluta (
más info). Esto hace que las rutinas sean reentrantes.
Estas rutinas son utilizadas múltiples veces de manera genérica por otras partes del programa, y no se pueden modificar sin cargarse el código global. Las rutinas que me leen diversos valores y me los vuelven a escribir, son realmente la misma, por eso es complejo seguir la pista a cómo se manipulan los datos. De por sí, sistemas operativos como el de Atari o el de Amiga, son con ejecutables relocalizables... estoy teniendo mucha suerte porque parece que me carga el código de LOOM.PRG siempre en la misma posición cada vez que lo lanzo desde el emulador.
Lo que descubrí ayer es que en cierta posición (02D766.w) me guarda el valor entre $00 y $0B del icono que he pulsado de entre los 12 disponibles para meter la clave. A partir de eso, pude encontrar el sitio donde se guardan (02D560-02D567) los 4 valores que el juego espera que pulses para la clave en curso, pero no el sitio donde los compara después. Vuelvo a recordar que estas posiciones nunca son absolutas, sino del estilo base + desplazamiento, en rutinas genéricas reutilizables, tras un montón de operaciones hasta llegar algo del estilo de "move.w 0(a0,d0.l),0(a1,d1.l)" que por sí solo no te dice nada, si no estás siguiendo la traza de cada valor en el debugger.
Otro día más... ya estoy viejo para esto.