Entrevista a Pedro Gimeno
La década de los 90 supuso el declive comercial del Spectrum y la popularización del
compatible IBM-PC. Fue entonces cuando muchos de nosotros pudimos seguir disfrutando
de los juegos de nuestro pequeño amigo en la nueva plataforma de ocio y trabajo,
gracias a un sorprendente programa publicado a finales de 1992 en la revista
PCManía.
"Spectrum.exe", el primer emulador de Spectrum español, trajo los ficheros en formato SP
a nuestros discos duros, e inició el fenómeno de la emulación de Spectrum al alcance de
todos los usuarios españoles. Este mes entrevistamos a su creador, Pedro Gimeno.
"Mi objetivo con el primer
emulador era que mi Spectrum no se perdiera aunque se me estropeara."
|
 |
Cuéntanos cómo te introdujiste en el mundo del Spectrum. ¿Fue de la mano de los
juegos, o te atrajeron sus posibilidades a nivel de máquina de cómputo?
Pues siendo el año 1981 y por tanto estando aún en sus albores la computación doméstica,
no es de extrañar que lo que más me fascinaba fuera el poder de cómputo y la inmensidad
de posibilidades que parecía ofrecer. Pero claro, no hay que olvidar que por aquellas
fechas yo tenía trece años, por tanto la idea de aprovechar ese potencial para jugar era
casi natural a esa edad.
¿Cuál ha sido tu evolución dentro de los diferentes modelos de ordenadores antes y
después del Spectrum?
Empecé con un ZX-81 que me prestaron durante bastante tiempo. Con él aprendí ya bastante
sobre el BASIC de Sinclair, pero no tardé en darme cuenta de que los programas más
interesantes estaban hechos en código máquina, y ¡oh, bendición del cielo!, el apéndice
A del manual incluía una lista de las instrucciones del Z80. Mis primeros programas en
código máquina los escribía tecleando directamente una línea REM con las letras cuyo
códigos eran los de las instrucciones que necesitaba. He eludido mencionar "códigos
ASCII" porque el ZX-81 no usaba el estándar ASCII. En el ZX-81 había sólo unos pocos
códigos que no tenían un carácter equivalente, y esos los cambiaba mediante POKEs a
posteriori. Aún recuerdo la famosa secuencia "E
RND" por la que empezaban muchos programas; esto equivalía a "ld hl,(DFILE)", es
decir, cargar HL con la dirección de la pantalla. También recuerdo que el programa
se ejecutaba con RAND USR 16514, que era la dirección del carácter que seguía al
REM.
Cuando vi las especificaciones del ZX-Spectrum me quedé maravillado (no es de extrañar
viendo las del pobre ZX-81). Mi primer contacto con un Spectrum fue en casa de un
compañero de colegio; por desgracia no hubo tiempo para mucho, apenas para probar el
PLOT y comprobar la alta(?) resolución (recordemos que la resolución del PLOT del ZX-81
era de 64x44 a base de caracteres semigráficos).
Me costó mucho convencer a mis padres para tener uno, pero finalmente accedieron. No
estoy seguro del año; es muy probable que fuera en 1983. En cuanto lo tuve lo primero
que hice fue averiguar cómo se hacía en el Spectrum todo lo que estaba acostumbrado a
hacer en el 81: dónde estaba la memoria de pantalla, cómo estaba organizada (menudo
chasco cuando vi la extraña estructura), cómo escribir código en REMs y todas esas
cosas. No tardé mucho en darme cuenta de que el sistema de los REMs no era el más
indicado; los códigos de control introducidos con el cambio a ASCII eran un obstáculo
muy fuerte, porque había bastantes instrucciones importantes en el rango 0-31;
notablemente el 17, que era un código de control que además producía errores al listar.
Tuve que mudarme a emplear la nueva instrucción DATA y escribir con números decimales en
vez de caracteres.
Luego por supuesto apareció el típico vecino que tenía un amigo que tenía muchos juegos.
De entre los primeros que me llegaron recuerdo con especial cariño el Scuba Dive y,
sobre todo, cómo no, el Manic Miner. Cabe decir que mis padres no aprobaban la compra de
juegos y yo no tenía dinero, así que la opción de tener originales no estaba entre las
posibles.
El siguiente ordenador que tuve fue un PC, un 286 a 10 MHz con tarjeta EGA y 70 Mb, que
aunque en realidad era de mi padre yo era el principal usuario. Para entonces ya había
utilizado muchos PCs y conocía bastante su estructura. Era de procedencia francesa; la
marca se llamaba Goupil. Entre la documentación se encontraban manuales técnicos del
hardware y el código fuente de la ROM; esto me ayudó bastante a profundizar en el
funcionamiento interno de un PC con todos sus periféricos, sobre todo la tarjeta
gráfica.
Más adelante comencé a trabajar y a tener autonomía económica. El primer ordenador que
compré fue un Sinclair QL, aunque ya se había pasado un poco la época de su máximo
esplendor. Era técnicamente bastante atractivo, salvo por tres inconvenientes básicos:
era algo lento (basado en un 68008), tenía poco software y funcionaba mediante los
odiosos Microdrives. Esto último me llevó al extremo de tener que devolverlo, ya que
desde que lo compré estaba constantemente teniendo que llevarlo a reparar porque el
cabezal de lectura se desplazaba y dejaba de leer. Supongo que estaba defectuoso. El
software que incluía, sin embargo, era muy bueno y guardo buenos recuerdos de él.
También compré un Atari 1040 ST, pero el uso que le di fue casi exclusivamente dedicado
a la música por MIDI. No profundicé en sus posibilidades computacionales.
A partir de ahí todo lo que he tenido han sido PC's, excepto por un Commodore 128 que me
regalaron porque querían a deshacerse de él, pero que no llegué a usar (no tenía
software). Más adelante también conseguí un ZX-81 en buen estado, pero tampoco he
llegado más allá de comprobar que funcionaba. También un Inves Spectrum sin fuente de
alimentación, que no sé si funciona.
Y de todos estos equipos, ¿cuál es tu preferido o de cuál guardas mejores
recuerdos?
El Spectrum, por supuesto. ¿Acaso lo dudabas?
Debo decir de todas formas que cuando preparé mi segundo emulador en el Pentium 200, me
maravillé de que tuviera la potencia suficiente como para realizar una emulación
completa en tiempo real, ciclo a ciclo. Viendo que iba sobrado de velocidad no me
preocupaba mucho añadir aspectos más finos de la emulación, porque sabía que los
soportaría. Esto me permitió decidirme a incorporar emulación de 128K, opciones de
sonido y otros refinamientos.
¿Qué ocurrió con este tu "segundo emulador"?
La idea partió de la documentación del x128 de Joe McKay, creo que en la versión 0.5.
Este emulador incorporaba una opción llamada "ULA Delay" en un intento de que se vieran
demos como la Overscan de Busy Soft. El autor se quejaba de que el número de ciclos
parecía ser un número fraccionario, cosa que no alcanzaba a entender. Al leerlo sospeché
que el problema consistía en que el retraso no era homogéneo, sino que dependía de algún
factor como a qué dirección se accedía en qué momento. Así que me lie la manta a la
cabeza y me puse a investigar sobre la "contended memory" hasta que tuve todos los
detalles bien perfilados.
Sólo faltaba aplicar mis descubrimientos. Mi objetivo con el primer emulador era que el
Spectrum no se perdiera aunque se me estropeara, pero sabía que la emulación era
imperfecta. Pero tras mis averiguaciones tenía, por primera vez, la oportunidad de
realizar una emulación prácticamente perfecta. Esto significaba, por supuesto, renunciar
a que se usara en máquinas de potencia modesta, pero el precio a pagar era pequeño en
comparación con la ganancia. Así que de nuevo me puse manos a la obra empezando un nuevo
emulador desde cero, pretendiendo incorporarle todos los refinamientos de emulación de
que fuera capaz.
Para entonces ya empezaban a existir unos cuantos "DOS extenders" y el NASM acababa de
salir. Decidí pues entrar en el maravilloso mundo de los 32 bits y el DPMI, esta vez
usando íntegramente herramientas FOSS. Por el camino me enfrenté a algunos errores en el
NASM que localicé y reparé (y de los cuales por supuesto informé a su autor, que para
entonces aún era Simon Tatham, a quien también debemos hoy el PuTTY).
El primer extensor que utilicé creo que era el PMODE/W. Mientras programaba el emulador
y le iba añadiendo cosas me amenazaba cada vez más la idea de que el resultado no
funcionara con la suficiente velocidad ni siquiera en un Pentium 200. Puedes imaginar la
alegría que me llevé al hacer las primeras pruebas de temporización, sólo comparable a
aquella primera vez en la que vi el Manic Miner aparecer en la pantalla.
Más adelante, ante la perspectiva de portarlo a Linux, renuncié a usar únicamente
ensamblador y decidí escribir en C la interfaz con el sistema operativo, con lo cual
pasé a usar DJGPP y su extensor. Por entonces ya había pasado por varios extensores y
linkers, incluyendo el linker de RDOFF del NASM; probablemente sea de las pocas personas
del mundo que le han sacado utilidad, en parte gracias al WDOSX que lo soportaba.
Este emulador fue el primero en el que se vio la demo Overscan correctamente. Pero el
tiempo que podía dedicarle no era mucho, y el retraso en el lanzamiento me hizo pensar
que tal vez era mejor publicar la información que había recopilado con la esperanza de
que otros la aprovecharan. Y así fue, pero sólo el FAQ de comp.sys.sinclair me otorgó
crédito por ello. Como resultado mi nuevo emulador cayó básicamente en el olvido. Con la
aparición del RealSpectrum vi satisfechas mis propias necesidades en cuanto a emulación
y decidí no proseguir con el desarrollo.
En tu época en el mundillo del Spectrum, ¿llegaste a tomar contacto con algún grupo
de programación de compañías como Dinamic, Made in Spain, Zigurat u Opera?
No, en absoluto. En el Spectrum no destacaba por ningún programa. Lo que más hacía era
jugar, buscar pokes cuando el juego era demasiado difícil para mí, lo cual ocurría con
frecuencia, y desproteger programas para copiarlos (he de decir en mi descarga que no
tenía dinero y mis padres no apoyaban que jugara). Para mí desproteger era un desafío
interesante; llegué a poder con algunas protecciones complicadas como por ejemplo el
famoso Speedlock.
Sin embargo, más tarde, como resultado de escribir el emulador, Víctor Ruiz se puso en
contacto conmigo para pedirme una adaptación del juego After The War al PC usando el
emulador mismo. Accedí y el juego fue publicado, aunque sin control de velocidad de
ninguna clase. Los únicos cambios fueron: una optimización de la velocidad para la
instrucción LDIR hecha a medida del programa, y una adaptación para evitar que
necesitara la ROM del Spectrum, ya que según me aseguró el juego no requería de la
misma, y por motivos de copyright no querían incluirla.
¿Llegaste a programar algún programa o juego complejo o extenso para Spectrum?
Realmente no. Los programas más complejos que recuerdo fueron uno para probar autómatas
celulares lineales y uno que hacía de buzón de correo para radio que en realidad nunca
se llegó a poner en marcha.
También hice un programa para mostrar el conjunto de Mandelbrot, pero usando coma
flotante lo cual lo hacía tremendamente lento incluso siendo compilado. Llegué a obtener
una imagen decente en blanco y negro del conjunto cuando aún no conocía (¿no existía?)
el ahora famoso Fractint. Era el año 1985; A.K.Dewdeney acababa de publicar su famoso
artículo sobre este fractal en la revista Investigación y Ciencia, a la que mi padre
estaba suscrito. Por entonces no conocía las técnicas de cálculo en coma fija mediante
enteros; si lo hubiera programado ahora seguramente me hubiera salido mucho más rápido.
Pasando a hablar de tu emulador Spectrum, ¿cuándo y cómo se te ocurrió la idea de
programar un emulador de Spectrum para PC?
Bueno, para cuando tuvimos el Goupil las casas que reparaban Spectrums empezaban a
escasear y yo temía que llegara el momento en el que se me estropeara y no pudiera
arreglarlo. Quería encontrar una forma de alargarle la vida y al mismo tiempo poder usar
un teclado en condiciones. La idea de emularlo surgió casi sola a partir de esas
premisas. Además corría la voz de que existía un emulador para Amiga, lo cual resultó
ser verdad. No recuerdo de quién era, puede que fuera el de Peter McGavin.
Sabía que para emular un ordenador de 3.5 MHz con uno de 10 necesitaría código lo más
optimizado posible y que aún así iría lento, lo cual más tarde se demostró cierto. No
era posible escribir un emulador tal que por cada tres instrucciones de PC se
consiguiera una de Spectrum. He de hacer notar que la técnica de la compilación Just In
Time no se me ocurrió ni era ampliamente conocida. Sí que es cierto que el emulador de
Amiga la empleaba, pero no tuve el menor contacto con él ni conocimiento de sus
técnicas.
Empecé a escribirlo en Pascal pero renuncié enseguida, dándome cuenta de que en
ensamblador sería mucho más sencillo de lo que me imaginé al principio, incluso más que
en Pascal. Los manejos de memoria serían mucho más simples, y con una tabla de saltos
paliaría bastante el problema de la velocidad. Además con los flags la CPU me ahorraría
un montón de trabajo, y podría sacar ventaja del hecho de que el x86 tiene los flags en
las mismas posiciones de bits que el Z80. Así que me lié la manta a la cabeza y me puse
manos a la obra con un emulador en ensamblador.
Cuéntanos algo sobre el proceso de desarrollo de tu emulador. ¿Qué herramientas de
desarrollo usabas? ¿De dónde obtuviste toda la información técnica necesaria para la
emulación de ciertas instrucciones indocumentadas, de los timings de las mismas,
etc.?
Mi editor favorito siempre ha sido uno llamado SEE que me presentó mi amigo Javier
Vázquez. Con él editaba los .asm, y los ensamblaba con el TASM. Dada la extensión tuve
que organizarlo por módulos (ficheros .obj que luego enlazabacon el TLINK). Aprendí a
escribir Makefiles para no tener que compilar todo el proyecto cada vez que hacía un
cambio.
Como información sobre el Z80 usé las microfichas de código máquina de Microhobby, por
la comodidad del formato sobre todo. De la temporización no podía ocuparme dada la poca
velocidad que esperaba obtener y de hecho obtuve. Además de las microfichas consultaba
un libro sobre el Z80 de SGS proporcionado por mi amigo Diego Hernández.
El manual técnico del Goupil me fue extremadamente útil para recabar información sobre
la EGA y sus detalles. Por desgracia, los modos estándar de la EGA eran muy lentos para
escribir en ellos; había que escribir por planos, desglosando cada color en cuatro bytes
distintos. El primer emulador que tuve a punto, el EGASPEC, tenía un cuello de botella
tremendo en el vídeo.
Conocía un juego que aprovechaba una característica extraña de la CGA para implementar
un modo de vídeo de 160x100 a 16 colores. Lo hacía mediante un modo de texto, alterando
la altura de los caracteres. En una conversación que mantuve con Alejandro Valero sobre
el problema de la velocidad gráfica, durante una tormenta de ideas se nos ocurrió usar
una técnica parecida a la de ese juego, utilizando un modo de texto, y redefinir los
caracteres (en la CGA no era posible, pero en la VGA sí). Así le dimos forma al que
sería el modo definitivo: caracteres de 8x1 con la misma forma que los bytes de Spectrum
en la memoria de pantalla. Cuando implementé ese modo, la mejora de la velocidad gráfica
fue realmente espectacular.
¿Quieres decir que en lugar de utilizar píxeles en un modo gráfico, tu emulador
utiliza CARACTERES DE TEXTO redefinidos para así dibujar múltiples píxeles de una
sola vez?
Sí, en efecto. No sólo eso, es que además separa caracteres y atributos de la misma
forma que en el Spectrum, y por tanto cada byte de memoria de pantalla del Spectrum
equivale a un solo byte de memoria de pantalla del PC para la zona de píxeles. La
información de atributos implica un poco más de trabajo, pero muy poco más. Sólo hay que
escribir el byte ocho veces y añadir el procesado de flash; con eso queda completo. La
ventaja que le da al emulador respecto a los modos gráficos convencionales es evidente.
Tu emulador fue incluído en uno de los discos de la revista PCManía de Diciembre de
1992. ¿Cómo surgió la posibilidad de que fuera publicado en PCManía?
Me llamaron ellos para pedirme permiso para publicarlo. Me pidieron incluso que se lo
diera por escrito, y así lo hice. Me prometieron una suscripción a cambio, pero nunca
cumplieron su palabra.
Después de trabajar en el emulador, ¿te has vuelto a involucrar en algún proyecto de
software, ya sea para Spectrum o para otras arquitecturas?
Sí, he dedicado parte de mi tiempo a dos proyectos de software libre: GMP y GIMP. En el
primero he implementado una versión del generador de números pseudoaleatorios Mersenne
Twister; en el segundo he colaborado arreglando algunos bugs.
Ya por último, ¿a qué se dedica Pedro Gimeno actualmente? ¿Cuáles son sus hobbies y
sus ocupaciones?
Mi hobby actual se centra en seguir colaborando para el GIMP. Mi ocupación es un trabajo
que consiste básicamente en introducir datos. Sí, yo también me pregunto qué hace un
programador haciendo de usuario, pero al menos mi trabajo me permite vivir.
Muchas gracias por tu atención, Pedro. Desde MagazineZX queremos agradecerte que nos
hayas dedicado tiempo para esta entrevista y aprovechamos para felicitarte por lo
que supuso para muchos de nosotros la creación de un emulador como "Spectrum", que
nos permitió continuar viviendo durante mucho tiempo la magia de nuestro querido
Sinclair en una nueva arquitectura como era el PC. No sé si eres consciente de que
muchos de nosotros poblamos nuestros discos duros con ficheros .SP desde finales de
1992...
Gracias a vosotros. Un saludo a todos y buena suerte con la revista.