JSpeccy v0.91 Edición "Apatruyando la siudá"

Dicen que comer y rascar, todo es empezar. Ahora estoy convencido que también se puede aplicar al verbo "programar". Esta iba a ser una versión menor, la 0.90.1, e iba a llevar algunos arreglos y sugerencias de los usuarios.

Pero empieza uno a liarse, que si ahora arreglo esto, que si luego añado lo otro porque tampoco me cuesta tanto, que si acabo aquello de más allá y la publico... y cuando comparas las diferencias con la última versión te quedas a cuadros. Os prometo que nada de esto estaba planificado.

Así pues, intentaré no olvidarme de nada, empezando por lo más importante y llamativo:

  • Debido a las gracietas y particularidades del sistema aperitivo de siempre he tenido que cambiar el manejo del teclado. La verdad es que ahora se parece mucho más al resto de emuladores, pero no ha sido por gusto. El anterior esquema funcionaba en todos los sistemas (¿he contado alguna vez que me han confirmado que JSpeccy también funciona en el sistema operativo zLinux?) excepto en el más usado. Ahora, ambas teclas May hacen de Caps Shift. Las teclas Control hacen de Symbol Shift y la tecla AltGr hace de botón de disparo del joystick seleccionado. Naturalmente, no ha sido fácil, otra vez por causa del mismo (¡qué raro!, ¿no?), pero la solución que he implementado permite usar AltGr en los teclados que la tienen o el Alt derecho que tienen en su lugar algunos teclados para Windows. El resto de sistemas no tienen problemas con la tecla AltGr, bueno, con un matiz; la tecla Meta hace de AltGr en los teclados de los equipos de Apple.
  • Otro tema que ha traído su cola ha sido la emulación del bug del 128k que implementé en la versión anterior. He tenido que investigar varios informes de usuarios con problemas con programas que funcionaban en otros emuladores pero no en JSpeccy, y siempre era por lo mismo, el contenido del registro I y la memoria en contienda. Para colmo, esas parecen ser razones necesarias pero no suficientes para que el ordenador físico se reinicie y, realmente, no se conocen todos los condicionantes. Visto lo visto, después de pensar y preguntar opiniones, he llegado a una decisión salomónica: crear una propiedad en el fichero de configuración llamada emulate128kbug y dejarla desactivada por defecto. Como es una de esas opciones arcanas que si no sabes de qué va, mejor no la toques, no tiene manera de ser cambiada desde el emulador. El que quiera disfrutar de esa funcionalidad que edite el fichero a mano y la ponga con el valor true. Ya tenemos la primera razón para borrar el fichero JSpeccy.xml que tengamos.
  • Al salir del emulador, ahora se guarda automáticamente la configuración seleccionada del método de zoom y los filtros. Lógicamente, se recupera al arrancar. Esta es la segunda razón para borrar el fichero de configuración.
  • La tercera razón para borrar el susodicho fichero es la más reciente. He añadido un menú en el que se puede seleccionar el tamaño del borde que se muestra, configuración que también se guarda automáticamente al salir, junto la información de si en ese momento la ventana está ampliada o no. Para horror de los que no les guste leer, esto va a necesitar de cierta explicación:
    1. Sin borde: tan simple como suena. Elimina el borde y solo se ve la zona de pantalla. Curiosamente, se ve mejor ampliado que a tamaño normal.
    2. Borde estándar: proporciona un borde de 32 pixels de ancho a izquierda/derecha y 24 pixels arriba/abajo. Más que suficiente para ver todo los efectos de borde. El único programa que yo conozca que necesita más ancho de borde es el Defenders of the Earth.
    3. Completo: pinta 48 pixels arriba/izquierda/derecha y 56 abajo. Esto es lo que se supone que un televisor mostraría en el mejor caso algo que, sospecho, no se daba nunca.
    4. Enorme: pinta 64 pixels a izquierda/derecha y 56 arriba/abajo. Es la resolución que describe el gurú de la ULA, Chris Smith, salvo porque el borde está ampliado horizontalmente de 48 a 64 pixels. Permite ver donde hacen los cambios de borde los programas (dentro de unos límites, claro).
    Creo que no es necesario decir que, cuanto más pixels se pintan, más trabajo debe hacer el emulador....
  • Como consecuencia de que la Paralactika Demo (gracias a Radastan por el enlace), no funcionaba todo lo bien que debería, he tenido que afinar el redibujado de la pantalla. Cuando todas las otras demos que había probado eran felices con la manera en que manejaba el asunto, esta demo es brutalmente exigente con los tiempos de actualización. Digo, completamente en serio, que cuando queráis saber si una emulación es lo suficientemente buena, probéis esta demo. Y hablo de tiempos menores de 8 t-estados de precisión respecto al momento exacto de actualización (¿existe el momento exacto?. Creo que no, son 4 t-estados...).
  • Cuando se abren cuadros de diálogo modales, se detiene la emulación y en la zona de porcentaje de velocidad se pinta claramente la palabra STOP en rojo. Por ejemplo, al abrir el diálogo de configuración.
  • Existía un error en el manejo de las ROMs del Interfaz II cuando se pasaba a emular el +2a/+3 y otro más que grababa la ROM del IF2 en los ficheros de snapshot de +2a/+3 en formato SZX y se cargaba indebidamente si existía.

Y esto es todo, amigos. No puedo terminar sin agradecer como siempre la colaboración a varias personas: Radastan, na_th_an, Andrew Owen, Eduardo Acero, Iznogoud y, en general, a los amigos del canal #spectrum del IRC-Hispano, que aún sigue vivo. ;)

JSpeccy v0.90

Ha costado lo suyo, pero ya tengo la primera versión de JSpeccy en este 2012. Trae un poco de todo, arreglos de bugs, optimizaciones e incluso alguna novedad. Vayamos por partes.

Errores corregidos:

  • Cada vez que se reseteaba (tecla F5) el Spectrum, se perdía la configuración de mapeo de teclado natural
  • En el +2a/+3 la línea de interrupción se mantiene activa durante 32 t-estados como en el 48K y no 36 como en el 128K
  • En los modelos de 128K, la primera línea del borde inferior es la 255. Empezaba una línea tarde.
  • Los snapshots de formato SNA solo guardan IFF2.
  • Al restaurar el estado del Z80 cuando se carga un snapshot, IFF2 se cargaba desde IFF1.
  • Si se intenta salir del emulador y hay una cinta funcionando, pararla antes de salir para evitar demoras
  • Todos los modelos de Spectrum emulados son early-timing. Ahora la Rotatrix4-demo funciona bien en todos los modelos.
  • Se introducía contención en los estados finales de las instrucciones IN/OUT (y derivadas) cuando se emulaba al +2a/+3. Eso provocaba el mal funcionamiento de la Nyantro demo.
  • Antes de escribir en la memoria de video, es necesario actualizar la pantalla. Ahora el test stime funciona bien en todos los modelos (este era el único test que no pasaba JSpeccy hasta ahora).
  • El AY-8912 no se seleccionaba inmediatamente en modo 16k/48k y era necesario cambiar de modelo para que se activara.
  • En el modelo 128k, el registro de interrupciones no puede contener un valor comprendido entre 0xC0-0xFF si se ha seleccionado una página de RAM con contención. De ser así, el Spectrum se resetea e imprime un mensaje de aviso en la consola
  • Cuando se carga un snapshot de +2a/+3, no se configuraba el Spectrum correctamente si la paginación estaba bloqueada (bit 5 de 0x7ffd)
  • Cuando se usa el modo ULA+, es necesario redibujar la pantalla completa cada vez que se cambia la paleta de colores.
  • El acceso a los puertos de ULA+ tiene la misma contención que el acceso al puerto 0xFE y no la que le correspondería según las especificaciones del Spectrum. Ahora ya funciona el HAM256 Viewer de Andrew Owen.
  • Se han hecho algunos cambios que permiten acelerar un poco (más) la carga rápida de cintas.
  • Algunas veces, al terminar de cargar una cinta, el borde se quedaba con la última imagen de las líneas de carga. Espero haberlo solucionado definitivamente (es un error esquivo que me está costando cazar).
  • Cuando se cargaba una cinta de forma rápida, el emulador no respondía inmediatamente a la pulsación del botón de reset.
  • Para cuando se usa el emulador en sistemas operativos Windows, había un thread en espera siempre, que es el que permitía tener una mayor resolución en el scheduler. Ahora ese thread solo se lanza si se ejecuta JSpeccy en alguna versión de Windows.

En la parte de las optimizaciones, la principal es que ahora no se redibuja la pantalla entera con los cambios de borde, sino que se dibuja la mínima zona posible, que puede ser incluso nada aunque se hayan producido teóricos cambios en el borde. Si además del borde se ha modificado la pantalla, se dibuja la mínima zona de pantalla necesaria que incluya a los dos.

La pantalla se actualiza ahora con mucha mayor precisión que antes, en parte por haber arreglado el defecto del test stime. Antes, la emulación del 48k era muy precisa pero no lo era tanto en los otros modelos. Ahora se ajusta a las necesidades más estrictas (espero).

La emulación de los modelos +2a/+3 es correcta ahora, tanto en lo referente a los accesos a memoria como en los accesos a los puertos de I/O. Ciertamente, he comprobado que antes era mejor de lo que pensaba, pero ahora sé que es mucho más precisa (hasta donde se conoce la máquina).

Y ahora la parte divertida, las novedades:

  • Un usuario de los foros, llamado VELESOFT, descubrió que existen dos modelos de +2. Unos, que debieron ser los primeros y quizá los menos numerosos, que tenían un defecto en un chip llamado HAL10H8. Este defecto es el culpable de que no se pueda leer el puerto 0x7ffd sin colgar la máquina y que el registro I no pueda contener un valor en el rango 0xC0-0xFF si se ha seleccionado una página de RAM en contienda. Parece ser que en algún momento el defecto fue corregido. De modo que tenemos dos submodelos de +2: unos que son funcionalmente iguales a un 128k con una ROM de Amstrad y los segundos, sin esos fallos. JSpeccy ya emulaba un +2 con la corrección del puerto 0x7ffd, de modo que he incorporado la corrección del registro I. Esto permitirá que se puedan probar los programas en las dos variantes de hardware, para que se puedan detectar problemas como los descubiertos (tarde) en el estupendo juego de los Mojon Twins, Maritrini, Freelance Monster Slayer, o en el magnífico juego de Retroworks, Cray 5. Si tenéis las primeras versiones de alguno de los dos, no funcionarán en modo 128k, aunque sí lo harán en +2/+2a/+3.
  • Cuando se usa alguno de los modos ampliados de pantalla (x2,x3,x4) ahora se puede elegir cómo lleva a cabo Java la amplicación de tamaño. Hay tres posibilidades, a saber: la estándar, que es la que se usaba hasta ahora, con interpolación bilineal, que suaviza los gráficos para que no tengan un aspecto tan pixelado, y la interpolación bicúbica, un método que ofrece aún más calidad a costa de consumir bastante CPU (nada es gratis).
  • Se han añadido tres filtros de imagen. Uno que intenta emular la manera en que las antiguas televisiones de CRT deformaban los colores en los bordes donde habían cambios de crominancia. En unos programas se nota más que en otros, por ejemplo, en el enladrillado del Arkanoid y, dado que es un filtro previo a la ampliación (si la hay), escoger un filtro bilineal o bicúbico hace que la imagen sea poco clara, pero que cada uno pruebe y se quede con lo que le guste. Además, este filtro es directamente incompatible con ULA+ y será desactivado automáticamente si se escoge emular ULA+
    El segundo filtro es una emulación de monitor RGB y es excluyente respecto del filtro PAL-TV, o uno u otro, y funciona a partir de tamaño de pantalla mayor que 1.
    El tercer filtro se puede usar solo o junto al filtro PAL-TV, y simula el efecto de scanlines de los viejos televisores, de modo que no se aplica al filtro RGB. También es necesario usar un tamaño de pantalla mayor que uno.
  • Se ha añadido soporte para los bloques CALL/RETURN en ficheros de cinta TZX. Solo conozco un programa que los use, el Hollywood Poker que se encuentra en TZXVault, pero si hay alguno más por ahí espero que funcione también.

No puedo dejar de dar las gracias al compañero Eduardo Acero del canal #spectrum del IRC-Hispano, por haber descubierto, e incluso corregido, varios de los bugs que ha ido encontrando en el emulador. Agradecer también su colaboración en las pruebas de la versión beta a Vaporatorius, un clásico, y a Andrew Owen por sus pruebas del soporte de ULA+.

JSpeccy v0.89.1, Edición Nochebuena 2011

Uno no sabe qué pasa con el software que, por muchas pruebas que se hagan, en cuanto haces pública una versión empieza Murphy a trabajar y te la lía parda. Y esa ley se respeta incluso en Navidades.

Esta actualización corrige un error que hacía imposible grabar en cinta. De paso, y para compensar, he introducido una pequeña mejora para permitir elegir el grado de zoom de la ventana. Ahora puede ser x2, x3 y x4. No es una pantalla completa, pero está más cerca de serlo. Los usuarios que tengáis tarjetas gráficas que soporten OpenGL por hardware, podéis sacarle partido añadiendo en la línea de comandos la definición -Dsun.java2d.opengl=True. Con esto, el consumo de CPU cuando se amplía la ventana se reduce, como mínimo, un 50%.

Una última cosa: el fichero de configuración ha vuelto a crecer, de modo que conviene borrarlo para que se vuelva a crear con todas las propiedades.

JSpeccy v0.89, Edición navidades 2011

Por fin tenemos una actualización mayor, ¡pero que muy mayor!. Siete meses de trabajo me han proporcionado tiempo suficiente como para corregir cinco o seis bugs menores e introducir varias docenas de los gordos. Como los nuevos bugs son consecuencia de las nuevas funcionalidades, a ver si consigo que pasen un pelín desapercibidos. Las novedades que tiene esta versión son:

· Emulación del Interfaz I y de hasta 8 Microdrives. Ha sido un trabajo largo y farragoso que me ha obligado a escribir la emulación de los uDrives dos veces. Pero puedo decir con humildad, que he conseguido la emulación más exacta de todas las existentes hasta ahora. De hecho, es el único emulador que, a día de hoy, es capaz de manejar formatos de cinta distintos del habitual de Sinclair. Para ello, ha sido necesario crear un nuevo tipo de archivo para almacenar la información de los cartuchos, con extensión MDV. Gracias a este nuevo formato, se pueden observar, por ejemplo, las diferencias que hay entre el formateo de la version 1 y 2 de la ROM del Interfaz I y del formateo que realiza la ROM del Multiface 128k. Los antiguos archivos de cartuchos, con extensión MDR, son legibles y se convierten al vuelo al nuevo formato. Pero, nada es perfecto, si se modifican hay que grabarlas con el nuevo formato. Y no es aconsejable reformatear un cartucho antiguo o quedará con una capacidad mucho menor de la teórica.

· Emulación de la extensión de RAM LEC, que equipa a un modesto Spectrum 48k con 528KB de RAM sin problemas de contención de memoria. Es un montaje hardware que los manitas de la electrónica pueden llevar a cabo, y que desarrolló el checo Jiri Lamac en 1987. Por si el desarrollo hardware fuera poco, se hizo su propia modificación de la ROM del Spectrum y un CP/M v2.2 que es capaz de usar a los Microdrives como dispositivos de almacenamiento. Y puedo asegurar que lo hace realmente bien. Para ello, también se inventó su propio formato de cinta, incompatible con el de Sinclair e imposible de usar en los viejos ficheros MDR. De nuevo, es la primera vez que se puede ejecutar este CP/M usando los uDrives en condiciones.

· Se pueden cargar y grabar ficheros binarios directamente a o desde la memoria del Spectrum.

· Es posible grabar un snapshot en la memoria del PC y recuperarlo instantaneamente más tarde. Ideal para las pantallas más difíciles del UChi-Mata (todas).

· Como nuestro querido gomas era portátil de verdad ya en los 80, se le ha dotado en esta nueva versión de la capacidad de hibernación (como los osos). Así pues, es posible grabar automáticamente el estado del emulador al salir y recuperarlo nada más arrancar. Levantas la tapa y a funcionar... o algo así. Para ello, crea en el directorio local un fichero llamado JSpeccy.szx, que puede cargarse en cualquier emulador que soporte snapshots en formato SZX.

· Se puede elegir si se quiere mapear el teclado del PC al del Spectrum, para no tener que aprenderse combinaciones de teclas, o bien usar un modo más tradicional, con la tecla May (izquierda) haciendo de Caps Shift y May (derecha) en el papel de Symbol Shift (esta peli no tiene bella, solo bestias).

· Carga de cintas en formato CSW RLE y Z-RLE

· Grabación y carga de bloques en formato CSW (RLE y Z-RLE) en las cintas de tipo TZX. Además de como hasta ahora, poder grabar datos en DRB's, estos tipos de bloques permiten almacenar la información de la cinta a mayor frecuencia de muestreo (48 Khz para los CSW Z-RLE frente a los 44.1 Khz para los DRB) ocupando la décima parte de espacio, ya que a la compresión propia del CSW se une la de la librería ZLib. Pero, debo deciros, creo que solo JSpeccy soporta los bloques CSW en los TZX. Desde luego, los emuladores más populares en los que estais pensando, no lo soportan. :)

· Hay una nueva caja de diálogo para poder introducir POKEs a discrección.

· Nuevo diálogo para poder ver y editar cualquier parte de la memoria del Spectrum en hexadecimal. La columna de direcciones puede verse en decimal pulsando con el ratón en la etiqueta Dirección de la correspondiente columna. Los datos se actualizan una vez por segundo, lo que significa que puede verse con una simple inspección qué partes de la memoria se están modificando en ese momento (si el emulador no está en pausa, claro). Naturalmente, la actualización no es en tiempo real entre otras cosas porque los cambios son tan rápidos que no se vería nada de nada. Pulsando en cualquier valor hexadecimal o ASCII se muestra su dirección exacta en hexadecimal (decimal) y su valor, también en hexadecimal (decimal). Es un editor, recuerda, de modo que no solo permite ver... (creo que también es el primer editor hexadecimal full-equip integrado en un emulador).

· El diálogo del catálogo de cintas tiene ahora una barra de herramientas extraíble del diálogo, para que lo sitúes donde más cómodo te venga.

· El menú de cinta tiene una nueva opción de recarga automática. Cuando se está haciendo algún desarrollo y se quiere recargar la nueva versión de la cinta esa opción facilita la tarea.

· El soporte de snapshots en formato SZX ha sido actualizado a la versión 1.4 de las especificaciones. Se soporta también en los SZX la configuración del Interfaz I y, todavía de forma no oficial, de los bloques de RAM de la extensión LEC. El autor de Spectaculator y creador del formato SZX ya tiene la propuesta de inclusión de esos nuevos bloques en la especificación oficial.

· La carga rápida de cintas ha sido acelerada un 30% aproximadamente.

· El icono de la cinta en la barra de estado ahora se activa cuando hay una cinta en el reproductor y señala mediante colores cuando la cinta está en modo reproducción y cuando en modo grabación.

· En los diálogos de selección de archivo a grabar se pone automáticamente una extensión por defecto cuando no se especifica ninguna de las válidas. Estas son: szx, para snapshots; tzx, para cintas; scr, para imágenes; mdv, para Microdrives y bin, para ficheros binarios.

· Se han añadido varios atajos de teclado para acciones frecuentes.

· No estaríamos hablando de un producto informático si no habláramos de los errores corregidos (lo siento, las peoras siempre son desconocidas):

  • Los efectos del borde en alta resolución no se veían en modo ULAplus
  • Corregido y mejorado el tratamiento de series repetidas de codigos DD/FD y cuando no van seguidos de un código valido para IX o IY. También se corrige un error en el estado de contención de las instrucciones INC/DEC (HL).
  • Corregido un error en la emulación del Multiface 128 en modo 128k. Faltaba por emular un puerto.
  • Se han añadido modificaciones para cumplir los puntos 10 y 12 de la especificación TZX.
  • Ciertos efectos de alta resolución en Buzzsaw+ y Boxzle ahora se ven correctamente.
  • Solucionado un error potencialmente destructivo en la opción Limpiar Cinta
  • Añadidas comprobaciones durante la carga de ficheros TAP, TZX y SZX para rechazar ficheros defectuosos.
  • El último pulso en un bloque DRB no se grababa en el TZX.
  • El número de versión menor de los TZX se grababa incorrectamente como 0x20.
  • Se comprueba que las cintas no sean de solo lectura antes de intentar escribir en ellas.
  • Se ha corregido un problema con el sonido del efecto de ruido de carga.
  • Se ha corregido un error en la grabación de snapshots en formato Z80 cuando el modelo de Spectrum era +2a o +3.

Dado que se han añadido más partes configurables, es necesario borrar el archivo JSpeccy.xml que tengáis ahora.
Se han hecho muchas cosas más a nivel interno pero, en lo tocante a lo percibido por los usuarios, creo que por esta vez es todo. ¡Feliz navidad y próspero año nuevo!.

JSpeccy, versión 0.88.4

Actualización menor que corrige un fallo en la carga de registros del AY-3-8912 y que afecta al sonido del juego Cray-5, modifica el contenido inicial de los registros del Z80 dependiendo de si es un arranque en frío o en caliente e implementa la posibilidad de cargar archivos de volcados de pantalla, tanto en formato estándar (6912 bytes) como en formato ULAplus (6976 bytes).

JSpeccy, versión 0.88.3

Otra actualización más y otro cambio en la gestión del teclado. He tenido que darle muchas vueltas al tema pero al final he logrado que la tecla May haga la misma función para el PC y el Spectrum. De modo que volvemos a una situación anterior, donde Control hace de botón de disparo del joystick y Alt continua a la suya, haciendo de Symbol Shift. De paso he añadido funcionalidad a otras teclas, a saber: ESC hace ahora de Break, es decir, Caps Shift + espacio. La tecla con el carácter 'º' hace de Extended Mode, el carácter '¡' hace la función de Edit (Caps + 1) y el carácter '¿' pone el cursor en Graphics Mode. El resto de símbolos se pueden teclear todos, aunque algunos de ellos necesitan que el editor esté en Extended Mode. En los teclados españoles los caracteres { y [ no se pueden introducir directamente por tener un tratamiento diferente a bajo nivel, ya que son teclas de dead code.

Por otro lado he corregido un par de cosillas. Ahora se pueden cargar ROMs en el Interfaz II que tengan un tamaño inferior a 16KB, de hecho, se pueden cargar ROMs con tamaños entre 1 byte y 16KB. Eso permite cargar la Sinclair Test ROM que solo tiene 8KB. La otra corrección permite cargar algunos TZX bastante problemáticos con rutinas de carga muy sensibles, como el MASK y el Basil, the Great Mouse Detective.

JSpeccy, versión 0.88.2

Pequeña actualización del emulador que corrige un error y añade una "feature" que espero no me traiga dolores de cabeza. El error era que las teclas de los joysticks Sinclair 1/Sinclair 2 estaban cambiadas. La "feature" tiene, como casi todo en la informática, una mejora y una peora. La mejora es que es posible teclear la mayor parte de los símbolos usando el teclado "normal" del PC/Mac. La mala es que he tenido que volver a cambiar algunas teclas, que ahora quedan así: la tecla May no tiene uso en el Spectrum de forma directa. La tecla Control pasa a emular a Caps-Shift, Alt sigue haciendo de Symbol-Shift y las teclas que hacen de botón de disparo del joystick son AltGr y Escape (cualquiera de las dos vale, o puede que no...). Se puede usar cualquiera de los dos métodos, bien teclear unas comillas (por ejemplo) pulsando May+2 o bien Sym-Shift+p, a lo Spectrum de toda la vida.

Y una aclaración que no hice la última vez. Desde la versión v0.88 el emulador se comporta como está documentado cuando en modo 128k/+2, un programa pone en el registro I un valor entre 64-127. O sea, que se resetea enseguida la máquina. Eso afecta a algunos programas que solo pueden ejecutarse en los +2A/+3, como el Robocop 3.

JSpeccy, versión 0.88

¡Por fin otra actualización de JSpeccy!. Aunque mi intención en septiembre pasado era empezar a mirar la emulación del controlador de disco del +3, diversos asuntos personales me lo impidieron. Y cuando menos me lo esperaba cayó en mis manos un juego nuevo de los chicos de Retroworks, el excelente Genesis: dawn of a new day. Al cargar el juego algo no me cuadra. Ese tono con el que comienza la música de introducción es un pelín raro. Pruebo en otro emulador y, efectivamente, algo que pensaba que ya estaba superado como es la emulación del chip de sonido tiene un problema. El que haya desarrollado alguna vez ya sabe lo que viene a continuación: código p'arriba, código p'abajo. Pos yo como que no veo nada. Días de pegarle vueltas al asunto, de depuración para ver qué rayos hace el juego con el AY que hace que mi emulación no esté a la altura. Sigueron días de perplejidad por no saber qué hacer ni para donde tirar o mirar. Cambios un poco al tun-tun para intentar que salte la liebre. En uno de esos cambios cacé la liebre... o eso pensaba yo. Eso sería allá por noviembre. Desde entonces muchas horas de trabajo, pruebas, investigación y codificación que han llevado los cambios a algunas otras partes del código, como la que trata los frames de audio o la que emula el beeper. En resumidas cuentas, para no aburrir las novedades son:

  • Emulación mejorada del chip de sonido AY-3-8912. Ello incluye la posibilidad de seleccionar en el diálogo de configuración la calidad del sonido, entre calidad normal (por defecto) y alta calidad. La calidad por defecto es lo suficientemente buena y necesita menos CPU, de modo que está pensada en los ordenadores más modestos. La alta calidad equivale a la calidad que tenía el emulador en versiones anteriores, aunque con las mejoras introducidas que permiten, no solo escuchar bien el juego de Retroworks, sino también las voces digitalizadas del principio de partida y de vuelta al menú del Robocop. Conviene borrar el archivo de configuración para que se cree de nuevo con la opción de calidad del sonido.
  • Corregido un error en la emulación del ruido blanco del AY.
  • Filtrado del beeper para mejorar el sonido quitando efectos extraños.
  • Mejora del tratamiento de los frames de audio para evitar vaciados de buffer excesivos que perjudicaban el sonido, especialmente en ordenadores más modestos que solo tienen una CPU.
  • Se ha modificado el tratamiento de ciertas partes del teclado. La tecla May sigue emulando a Caps-Shift y la tecla Alt a Symbol-Shift. Las teclas Control ahora emulan el botón de disparo del joystick, en lugar de hacerlo la tecla Supr como antes. El cambio era necesario, entre otras cosas, porque los usuarios de MacOS-X tienen la función Supr como una combinación de teclas. En general, los usuarios de MacOS-X deberían usar algún Look&Feel distinto del que lleva por defecto la máquina virtual Java en Mac, ya que la caja de diálogo de apertura de ficheros en Mac no lleva el campo de texto que permite teclear el nombre del fichero y, sin esta funcionalidad, no puede crearse una cinta nueva.
  • Las ROMs del Interfaz II se emulan también en modo 128k/+2
  • Corregido un error que afectaba a la selección por defecto del modelo +2A. Gracias a Andrew Owen por informarme de este error.
  • No puedo acabar esta actualización sin agradecer a Vaporatorius, una vez más, la inestimable y paciente ayuda que me han prestado él y sus oídos, manifiestamente mejores que los míos. La emulación del AY no sería decente sin su ayuda como betatester. Te debo una botella de Chivas. ;-) Ah!, y feliz día de Reyes Magos a todo el mundo. :)

JSpeccy, versión 0.87

Esta "pequeña" actualización del emulador no incorpora una lista tan larga de novedades como otras veces, pero no por ello menos importantes:

  • Implementa una funcionalidad pedida por varios usuarios, la lista de últimos archivos abiertos. Se guardan los últimos 5 archivos usados. Si el archivo es un snapshot al seleccionarlo, se carga directamente. Si se trata de un archivo de cinta se carga en el reproductor virtual, pero no se hace un Autoplay. Se guardan también los últimos directorios de carga de snapshots y cinta por defecto. Para poder implementar esta funcionalidad se ha ampliado el archivo de configuración y es necesario borrar el archivo de configuración existente antes de ejecutar la nueva versión de JSpeccy (JSpeccy.xml).
  • Emulación del Fuller AudioBox, incluído el interfaz de Joystick.
  • En el menú Medios se ha añadido la opción de cargar ROM's del Interfaz II para los modelos 16k/48k. En realidad permite cargar cualquier ROM alternativa con tal de que tenga 16k de tamaño.
  • Se ha incorporado la posibilidad de grabar snapshots en formato SZX. El formato SZX lo desarrolló Jonathan Needle para su emulador Spectaculator y después ha sido mejorado con la ayuda de otros desarrolladores como Philip Kendall, autor de Fuse. Es un formato mucho más moderno que los clásicos Z80, SNA y demás, bien documentado y ya tiene soporte en los principales emuladores. Comprime los datos con más eficiencia que el formato Z80 gracias al uso de la librería Zlib y es el único formato que permite grabar cosas como la ROM del IF2, el estado y la RAM del Multiface, embeber o enlazar la cinta usada (TAP/TZX) dentro del snapshot y, además, ha sido ampliado para poder grabar el estado y la paleta de colores usada por ULAplus. En definitiva, es el formato de snapshot del siglo XXI. Hay que dar las gracias a Jonathan Needle por documentar tan bien el formato y por dejarlo en su Web a disposición de todo el mundo. Thanks Johnatan!.

JSpeccy, versión 0.86

Tras dos semanas de desarrollo más o menos continuado (para lo que es habitual), he implementado algunas funcionalidades que hace tiempo tenía pendientes, a saber:

  • Emulación del Spectrum 16k y la inclusión de la opción de +3. Por el momento, el +3 es exactamente igual al +2A porque JSpeccy aún no emula al controlador de disquetes, pero todo se andará... ;)
  • Emulación de los Multiface 1/128/+3, pudiendo elegir en el caso del 48k si se quiere emular al MF1 o al MF128. Debo reconocer la gran ayuda prestada por The Woodster, sin la cual la emulación del Multiface sería mucho peor (en el caso del MF3, ni siquiera existiria). Thanks again, Woodster!.
  • Soporte para grabación de cintas en formato TAP/TZX de forma instantánea si el programa usa las rutinas de grabación de la ROM. Para el caso de que no las use, permite grabar en formato TZX usando frecuencias de muestreo del puerto MIC de 22050 Hz o 44100 Hz. En las pruebas que he hecho, con 22050 Hz sobra y el fichero generado es la mitad de grande. No he probado con rutinas de grabación a alta velocidad, pero supongo que igualmente servirán los 22050 Hz. El menú de cintas se ha ampliado para las opciones de insertar una cinta nueva, vaciarla, iniciar la grabación en modo muestreo y finalizar la grabación.
  • En el menú Archivo hay ahora una opción para grabar la imagen de la pantalla en formato SCR o PNG, que incluye el borde. Si el programa que está funcionando usa el soporte de ULAplus, el SCR incluye en los últimos 64 bytes la paleta de colores usada en ese momento tal y como está descrito en la página ZX Spectrum 64 Colour Mode
  • En el menú Opciones hay ahora una opción llamada Configuración que da acceso a un diálogo que permite configurar todas las opciones del emulador, y que se pueden guardar en un fichero llamado JSpeccy.xml. Si el fichero no existe, al arrancar el emulador se crea uno en el directorio donde se haya instalado JSpeccy. Algunas de estas opciones se usan como configuración por defecto (principalmente el modelo de Spectrum preferido y el modelo de Joystick).
  • El botón rojo de la barra de herramientas tiene una funcionalidad más lógica (de hecho, era la que pretendía que tuviera desde el principio). Ahora, en lugar de salir del emulador, permite hacer un reset completo del Spectrum (más parecido a desenchufar de la corriente y volver a enchufar). En esta opción se recupera la configuración por defecto del modelo de Spectrum y de Joystick.
  • Desde el diálogo de configuración se puede seleccionar el modo de escuchar el sonido del AY-3-8912, elegible entre Mono(fónico) y 3 modos de estéreo con mezclas ABC, ACB y BAC (canal izquierdo-central-derecho). Se debe tener en cuenta que, en el caso de los modos pseudo-estéreo (que es lo que son en realidad), la cantidad de datos a enviar a la tarjeta de sonido son exactamente el doble que en modo monofónico, dato a tener en cuenta por los usuarios de máquinas más veteranas. Cuando se cambia el modo de sonido es necesario desactivar/activar el sonido o bien hacer una nueva selección del modelo de Spectrum.
  • La carga rápida de cintas (no la carga instantánea, esa ya era rápida) es ahora todo lo rápida que dé de si la JVM en la máquina de cada usuario. En las máquinas en que yo he probado oscila entre 1000% la más lenta y vieja y los casi 4000% en la más nueva.
  • Y un último cambio ¡IMPORTANTE!. JSpeccy necesita una versión de Java que sea, al menos, la 6.0. La razón del cambio es que uso el soporte de JAXB 2.0 para leer y guardar la configuración en el fichero XML y Java 6 lleva incluídas las librerías necesarias, mientras que para Java 5 hay que añadir aparte las librerías de JAXB lo que haría que, o bien el jar de JSpeccy sería mucho más grande o tendría que poner las instrucciones acerca de cómo usarlas junto al emulador. Por eso, en beneficio de la mayor facilidad de uso, he preferido usar Java 6. Espero que con ello no cause problemas adicionales a algún usuario.
  • Como es habitual se incluyen también múltiples correcciones de errores en varios lugares, la carga desde cinta entre ellos. Espero no haber empeorado nada. :D

Y ahora, a por el FDC.... ;)

JSpeccy, versión 0.85

Tras una tarde de hacking, he implementado lo que faltaba para poder emular al +2A. Funciona, aunque queda por probar el tratamiento de los modos todo RAM, pero los programas que usan el +2A como si fuera un 128k, se ejecutan sin más problemas añadidos. Los principales programas de prueba y las demos detectan correctamente un +2A y se ven bien, aunque, me duele decirlo, la emulación no es perfecta. De paso, he solucionado algunos problemillas en el catálogo de cintas y he implementado la carga instantanea de bloques TZX de velocidad normal. A sugerencia de un usuario, ahora también es posible abrir desde el botón de Abrir imagen... los archivos en formato TAP y TZX, para no tener que ir adrede al menú de Cintas.

JSpeccy, versión 0.80.1

Como pasa siempre que haces público algo, encuentras fallos antes de 10 minutos. He dejado una versión actualizada del emulador, para resolver algunos problemas en la implementación del ULAplus. De paso, he optimizado la rutina de dibujado del borde (mañana otra actualización que resolverá algo relacionado con el borde, Murphy dixit). Y, gracias a la amable colaboración de Andrew Owen, JSpeccy ya tiene un icono de aplicación y me ha proporcionado también otra imagen del teclado más realista.

JSpeccy, versión 0.80

¿A que ya pensabas -¡mira!, otro emulador olvidado...-? Pues va a ser que no. :-D

Ha costado mucho, un cuatrimestre entero a la sazón, pero ha llegado. La versión que pongo a disposición del que la quiera probar lleva tantas novedades que espero no olvidarme de ninguna. Allá va:

  • Emulación de los modelos Spectrum 128k/+2 (pixel-perfect, as usual).
  • Emulación del chip de sonido AY-3-8912.
  • Emulación seleccionable de Joysticks Kempston, Sinclair 1/2 y Cursor/AGF/Protek. Si no se selecciona ninguno, los cursores del teclado emulan los cursores del Spectrum, para que la edición de programas BASIC sea más cómoda.
  • Grabación de snapshots en formato SNA del modelo de 128k.
  • Carga/grabación de snapshots en formato Z80 versión 3.
  • Emulación del Spectrum 48k Issue 2, si la cabecera del Z80 así lo indica.
  • Catálogo de cintas TAP/TZX, con seguimiento de la reproducción (va por ti, Vaporatorius). Gracias a este soporte ha sido posible añadir también el adecuado comportamiento ante un JUMP Block en el TZX.
  • Ahora hay un botón para quitar el sonido y otro distinto para acelerar la ejecución hasta x10.
  • Se han reescrito las rutinas de tratamiendo del borde y la pantalla. El borde es ahora más exacto que antes y solo se redibuja si es absolutamente necesario. La pantalla solo redibuja la parte modificada.
  • Se ha corregido un pequeño error en el tratamiento de las instrucciones LD SP, IX/IY.
  • La tecla Pause del teclado, ahora también para la emulación.
  • Si hay una cinta insertada, al situar el cursor encima del icono de la cinta saldrá unaayuda emergente con el nombre del fichero cargado.
  • Por si todo lo anterior fuera poco, emulación de ULAplus para poder disfrutar de los juegos Mojonos en toda su gloria gráfica.

Y no os descuideis, que dentro de poco habrán más novedades, seguro.... :)

JSpeccy, versión 0.75.1

Tras las vacaciones pascueras he tenido que perseguir un error un poco marciano que impedía que el emulador pasara los timing tests de Richard Butler. El error está corregido aunque, si intentas comprobarlo, los tests 36 y 37 siguen fallando debido a que no hay forma desactivar la emulación del Joystick Kempston. Era difícil que un programa se topara con el problema, pero lo que está mal, mal está. De paso, he corregido también un error en la carga rápida de ficheros TAP.

JSpeccy, versión 0.75

Esta es una revisión menor del emulador que corrige algunas cosas que había ido dejando pendientes, como una actualización correcta (desde el punto de vista de Java Swing) de la etiqueta de velocidad y del icono de cinta en marcha/parada y su posición cuando se duplica el tamaño de la ventana del emulador. La ventana de ayuda con la imagen del teclado del Spectrum es ahora un JDialog y no un JFrame, con lo que no crea una nueva entrada en la barra de tareas. Se corrige también un pequeño error en la rutina de tratamiento de NMI en el núcleo Z80.

He realizado algunas pequeñas modificaciones al núcleo Z80 que lo optimizan un poco y se gana algo de velocidad (nada espectacular, por otra parte). Para poder probar el gestor de NMI's se añade la opción de lanzar una desde el menú Máquina.

Corregido un problema en el núcleo Z80 con las interruciones y la instrucción HALT. Gracias a Woodster por informarme del error y proporcionarme un programa de test que lo ponía de manifiesto. Thanks Woodster!.

Corregido (espero) el problema de sonido en Solaris cuando se usan los drivers del sistema operativo. Las modificaciones deberían afectar, para mejor, al sonido en el resto de plataformas. Añadida una modificación, inocua para los sistemas basados en Unix, pero que mejora la precisión de la medición del tiempo en Windows. En un XP-SP2 que he probado, se nota.

JSpeccy, versión 0.66

Implementado el soporte de bloques Direct Recording en los TZX. Thanks Woodster!. Añadida una caja de diálogo para mostrar la versión del programa. Se actualizan los fuentes y se incluyen correctamente los ficheros que faltaban para importar el proyecto en NetBeans. Actualizada la página de las instrucciones.

JSpeccy, versión 0.60

Corregido un problema que, sobre todo en determinadas máquinas con Windows, causaba parpadeos y efectos extraños en la pantalla. Thanks Pegaz by your collaboration!.

Corregido un error en la carga de archivos SNA que provocaba, en ciertos casos, que tras cargar la imagen el teclado no respondiera. Thanks Arjun!. Se corrige también el estado M1 en respuesta a una interrupción en modo IM0, que dura 7 estados y no 6. El error está inducido por la información de la FAQ de WoS que probablemente es incorrecta. También actualizo los fuentes.

Andrew Owen ha tenido el dudoso honor de inagurar el informe de errores. La pantalla no se actualizaba después de la carga rápida de un TAP. Thanks Owen!. Se actualiza el jar, pero no los fuentes (es una corrección de una sola línea).