Blog | Archivo | Contacto | Administración |
Algún día tenía que llegar este momento; por fin me he decidido a portar un juego desde Spectrum al PCW, con lo que ahora debiera resultarme más fácil el volver a hacerlo.
Las diferencias entre sus arquitecturas son múltiples: diferente velocidad, sistema de contención, vídeo, matriz de teclado, mapa de memoria, frecuencia de interrupciones, altavoz en vez de zumbador, etc. Y todo eso son inconvenientes.
Pero también hay ventajas si nos lo trabajamos: partimos de pixeles cuadrados siempre (no tengo por qué buscar juegos en modo 1), modo fijo 256x192 (con lo que podemos usar siempre el modo reducido), ROM en el marco inferior (16KB de gratis para mis cosas), memoria de vídeo en posición fija (de nuevo, espacio gratis), se puede reproducir el audio por el zumbador interno del PCW (con alguna restricción), mucho monocromo gracias a los atributos (sprites o directamente la pantalla), su catálogo de exclusivos, etc.
Así que allá vamos.
Análisis:
Mirando juegos, me decido por el Movie. Ya había estudiado su versión de CPC para portarla, pero comparando con la original para localizar ciertas rutinas me decido a portar la de Spectrum como experimento.
Es una aventura isométrica interesante, con objetos, personajes, iconos de acciones y elementos conversacionales. En su día no lo tuve, pero fue uno de los primeros juegos en probar en cuanto tuve acceso a internet.
Crea en general una atmósfera bastante inmersiva. La programación es buena, la isométrica bien resuelta, el volcado de los sprites es similar a como lo hace la Abadía.
Infraestructura:
La mayor parte de mi infraestructura habitual se conserva, el mayor cambio es que utilizo mi emulador de Spectrum en vez del de CPC. Al estar mucho más pulido, puedo poner puntos de ruptura en accesos a la ULA o la memoria de vídeo, y localizar así las rutinas que necesitan parche de forma automática, medir ciclos de rutinas, veces ejecutadas, desde dónde, ...
El resto sigue siendo lo mismo, quizás mencionar que desde hace varios ports utilizo la habilidad del emulador de cargar binarios en memoria y ejecutar arbitrariamente desde línea de comandos. Con eso y mis ficheros BAT puedo probar las cosas inmediatamente sin tener que crear imágenes de disco ni cargadores.
Cargador:
No hay mucho que contar por aquí, utilizo mi cargador típico. Por cacharrear, le meto un par de efectos básicos basados en la Roller RAM con la pantalla de carga, la cual tengo comprimida dentro del propio cargador.
Frecuencia / contención:
En un Spectrum el Z80 va a unos 3,5 Mhz (3,5469 en los modelos de 128 KB), con ciclos de espera en la RAM controlada por la ULA (dos ciclos seguidos libres de cada 8, pero sólo cuando está pintando la pantalla, si no nada). La contención es por CLOCK en vez de WAIT en los modelos clásicos.
El PCW lo hace a 4 Mhz, con ciclos de espera (WAIT) en cualquier acceso a memoria (uno libre de cada cuatro); esto tiende a alinear los ciclos máquina a múltiplos de 4 ciclos de reloj.
Es difícil evaluar cuánto se pierde exactamente al desdoblar gráficos (el resto son más o menos los mismos ciclos) porque son sistemas muy distintos. No queda mal, es muy jugable, pero hago algún retoque menor para compensar.
Memoria:
Afortunadamente el PCW tiene un sistema de paginado muy potente, y nos permite comportarse casi como cualquier ordenador de la época basado en Z80. Podemos poner cualquier página de RAM en cualquier marco, así como escoger de forma separada las páginas en las que se lee y escribe en cada marco. Con esto podemos tener rutinas sobre memoria de vídeo o cosas igual de bizarras.
Originalmente tenía en escritura la VRAM del PCW y mis rutinas y teclado en lectura en la zona de la ROM ($83/$34, $80, $81, $82), pero una vez se parchearon todas las rutinas necesarias las nuevas se movieron a la zona de VRAM del ZX. De esa forma tenemos VRAM + teclado en la zona de ROM ($83, $80, $81, $82) y nos simplifica la lógica para tener código automodificable. Nos entra el juego entero + parches en 48 KB.
Acceso a ROM / FW:
Ya que la ROM del Spectrum está siempre paginada algunos juegos hacen uso de esta; y en este caso es así, aunque muy ligero.
Básicamente se usa para la lectura del teclado (escribir texto en los bocadillos y las teclas del “menú”) y cálculo de direcciones de vídeo. En ambos casos, basta con redireccionar a mis propias rutinas.
Por otro lado, hay un acceso insistente (y un tanto camuflado) al punto de entrada de la rutina de carga, entiendo que como medida de protección contra algún tipo de transfer. De nuevo, fácil arreglo.
Finalmente, se usa de nuevo en una rutina para generar aleatorios que se usan para el efecto de los pasos, por ejemplo. Al no ser aleatorios críticos (eso se hace en otra rutina), hago que mire en las 16KB superiores, donde hay más variedad de valores y el efecto es prácticamente el mismo.
Interrupciones:
Otro punto en el que se difiere; el Spectrum genera una interrupción al inicio del vídeo, mientras que el PCW tiene 6 a lo largo de cada frame PAL. Un arreglo simple sería comprobar VSYNC y si es el caso continuar el código.
Aunque en este juego no hace falta nada de esto; curiosamente, no usa las interrupciones para nada. Esto tiene sus cosas malas, como veremos cuando hablemos del teclado; por el lado positivo, tiene rutinas optimizadas que usan los registros SP e I a pelo.
Sonido:
Aunque pueda parecer que ambas máquinas son similares en este aspecto (“1b de audio”), eso no es del todo así. El Spectrum controla directamente un altavoz, mientras que el PCW tiene un zumbador (suena automáticamente a una cierta frecuencia).
Se puede encender y apagar el zumbador y el resultado es casi el mismo mientras que las frecuencias sean mayores que la del zumbador; si son menores se nos apagará y encenderá entre medias, causando una distorsión claramente audible (los que hayan escuchado la melodía del Bat-Man saben de lo que hablo).
Otro problema es que el oído detecta únicamente cambios de presión, le da igual el estado de la membrana del altavoz (encendido o apagado). Sin embargo, no puedo dejar encendido el zumbador pues seguiría sonando, algo que pasa en este juego.
Finalmente hay que aclarar que, aunque no es el caso de este juego, en un Spectrum normalmente se usa EAR para reproducir audio, pero también puede usarse MIC… ¡y ambos a la vez! Lo cual nos da una especie de 2 bits de audio, pues MIC suena más bajo que EAR.
En algunos modelos / clones esto no se lleva muy bien. Por ejemplo, en un Inves+ que los combina con XOR no hay audio en la carga, o en un Leningrad que no tiene audio por MIC se pierde la voz sintetizada del Cobra’s Arc, por ejemplo.
En cuanto a las temporizaciones, al no usar música no son críticas, así que las dejo tal cual. Si el juego hiciese uso del AY, algo que de nuevo no es el caso, hubiese sido necesario convertir las frecuencias de los osciladores (1,7735 -> 1,0 Mhz).
Vídeo:
En esta sección tampoco hay mucho que contar; uso el típico modo solapado 512x192 + fila en blanco en la página 3 para tener además el teclado, y ajuste vertical por Roller. Lo mapeo en la zona de ROM donde no estorba.
Las rutinas que acceden a la pantalla son pocas en este caso, afortunadamente. Anulo todo lo que tenga que ver con los atributos y desdoblo los gráficos al vuelo con mis rutinas. Para indicar que ocurre algo en los modos de pausa y abortar (que requieren otra pulsación para volver al juego o confirmar la salida) invierto el vídeo en el PCW.
Teclado / entradas:
Ambas matrices de teclas son completamente distintas, así que básicamente uso mis rutinas y luego tablas para convertir.
Aprovecho y le cambio las teclas raras que tiene por defecto a un clásico Q-A-O-P-Espacio, con opción de cursores. También se puede utilizar el joystick Kempston y el DkTronics.
Internamente, los controles se codifican en un byte, así que una tabla para cada caso menos el base (Kempston) y listo.
El teclado se lee en varios puntos dentro del bucle principal del juego, no por interrupciones, ya que no se usan. Esto hace que en ocasiones los controles no vayan muy finos cuando hay bastante carga de CPU. Es algo que ocurre en todas las versiones.
Fin:
Con esto llegamos al final; tenemos una versión para PCW clásico y la experiencia de portar juegos directamente desde Spectrum.
Como corolario de todo lo anterior: en este caso nos funcionan los POKEs de Spectrum en vez de los de CPC.
Añadir comentario