Me complace presentar aquí en RetroWiki los frutos de un proyecto que se inició hace 18 meses: una ampliación del formato TZX que permite soportar eficientemente los especiales patrones de bits en las rutinas de grabación hacia cinta que encontramos en la norma MSX. Además, esta ampliación se ha pensado con la suficiente versatilidad como para poder soportar un amplio número de máquinas, como los equipos de 8 bits de Acorn Computers y famosos microordenadores de los 70 como el MITS Altair 8800, KIM-1, Ohio Scientific Superboard II, Compukit UK101 o Tangerine MICROTAN65, entre muchos otros.
Para ello he diseñado un nuevo tipo de bloque TZX que permite describir en apenas 16 bytes de metadatos, las caracterísicas del formato KCS (Kansas City Standard) y el formato CUTS (Computer Users Tape Standard), así como sus posibles variaciones en velocidad, número de ciclos por bit y número de bits de arranque/parada alrededor de cada byte real de datos. Esto permite que ligeras desviaciones del estándar KCS, como las de la norma MSX que hoy nos ocupa, sean fácilmente definibles cambiando solo un par de valores.
Aunque en estos momentos solo haya un pequeño puñado de volcados de cintas, realizados para las pruebas de desarrollo, en los últimos tiempos he procurado que existiese una masa crítica de herramientas disponibles para que la gente interesada pudiese empezar a trabajar. Por mi parte he actualizado la aplicación TZX2WAV en Windows y el reproductor TapeRider en Android para que pudiesen funcionar con este nuevo bloque, y durante 4 meses he estado colaborando con el alemán Claus Jahn para que su excelente programa ZX-Blockeditor también permita cargar y crear ficheros TZX con dichos bloques. Otra gente está trabajando en una evolución del MakeTZX que reconozca cintas MSX, también en reproductores hardware basados en Arduino que aparte del CAS incorporarán el nuevo formato, y me han llegado ecos de que un programador que está preparando un nuevo emulador de MSX podría también incluirlo si se generan suficientes volcados.

Los valores por defecto del estándar KCS son 4 ciclos (8 pulsos) de 1200 Hz para un bit cero y 8 ciclos (16 pulsos) de 2400 Hz para un bit uno. El orden de los bits en un byte (endianness) coloca el bit menos significativo en primer lugar (LSb) y cada byte está precedido por un bit a cero de arranque y seguido de dos bits a uno de parada, lo que hace un total de 11 bits por cada grupo y una velocidad efectiva de 300 baudios. Los tonos guía usan también una frecuencia de 2400 Hz (se podría considerar como un número finito de bits a uno). La duración del tono guía y de las pausas es típicamente de 5 segundos, aunque no hay una norma fijada sobre ello.
Microsoft (Bill Gates asistió a la reunión de Kansas City de 1975 como representante de MITS) decidió usar dicho patrón para la norma MSX posteriormente en 1983. Sin embargo, como a lo largo de los años se había observado que los cassettes eran más fiables de lo esperado, cuadruplicó la tasa a 1 ciclo (2 pulsos) de 1200 Hz (1458 T-states) para un bit cero y 2 ciclos (4 pulsos) de 2400 Hz (729 T-states) para un bit uno. Existe un tono guía largo para cabeceras de 15380 ciclos (30720 pulsos) de 2400 Hz y uno corto para el resto de datos de 3840 ciclos (7680 pulsos) de 2400 Hz. Es más, el MSX incorpora una velocidad adicional de 2400 baudios al doble de frecuencia: 1 ciclo (2 pulsos) de 2400 Hz (729 T-states) para un bit cero y 2 ciclos (4 pulsos) de 4800 Hz (365 T-states) para un bit uno.
Solo un inciso para recordar que en la terminología TZX se denomina "pulso" a un semiciclo de una onda, ya que el formato es originario de la emulación de Spectrum y éste es capaz de detectar tanto el flanco de subida como el de bajada (otros equipos son solo capaces de detectar uno de ellos, como los equipos Commodore de 8 bits, que solo detectan el flanco descendiente de una onda). Por lo tanto, un ciclo equivale a 2 pulsos a la hora de contabilizar para el formato TZX. Igualmente, la duración de cada pulso viene dada por la frecuencia base del Spectrum (3.5 MHz) y para otras máquinas hay que rehacer los cálculos: por ejemplo el MSX tiene una frecuencia de 3.579.545 Hz (2.27% más rápida) y los T-states del procesador Z80 definidos en la cabecera TZX no van a coincidir exactamente con los reales en esa máquina.
Historia y evolución del proyecto
En Junio de 2014, se creó en el foro Z?n? d? Pru?b?? (que junto con RetroWiki, Vintagenarios y Va de Retro conforman los 4 foros generalistas de retroinfomática en España) una solicitud para la creación de un formato de cinta "universal" que pudiese soportar todos los ordenadores existentes. La consulta provenía de usuarios de MSX que se encuentran con que el formato CAS creado para sus copias de seguridad, solo es capaz de interceptar las llamadas a las rutinas de carga en la ROM (BIOS) de sus máquinas, y no es capaz de emular convenientemente las protecciones (curiosamente modulaciones de Spectrum en su mayoría) sin parchear/desproteger el código del juego, así como replicar las pausas presentes en las cintas porque confían en la existencia de un control remoto que pare el motor. Ante una solicitud similar realizada en el foro internacional de referencia MSX Resource Center (msx.org) solo habían encontrado indiferencia.
Ingenuamente y ante mi desconocimiento absoluto del MSX por la fecha, supuse que se debería comportar como otras máquinas de 8 bits y contesté que el formato TZX debería sin mayor problema ser capaz de soportarlo, con lo que empecé a hacer mis primeras averiguaciones. Los compañeros Antonio Villena en Octubre de 2014 y Miguel Angel Rodríguez (mcleod ideafix) en Julio de 2015 igualmente propusieron que el formato PZX podría ser otro candidato, pero todos andábamos bastante equivocados, sobre todo porque ambos formatos están muy centrados en el Spectrum y solo plantean bytes de 8 bits: no contemplan que existan marcadores de inicio y parada (con lo que obtenemos un grupo de 11 bits por byte) ni que los propios bytes cargados en memoria estén dados la vuelta en la cinta.
Los diversos compromisos del resto de interesados (supongo que en esto el desarrollo del ZX-Uno tuvo mucho que ver) dejaron todo esto en el aire, hasta que me planteé en Noviembre de 2015 volver a retomar el tema. Fue cuando realmente entendí cómo se almacenaban los datos en MSX, acostumbrado a que en el resto de ordenadores los bits tuviesen siempre 2 pulsos de distinta frecuencia, me encontré que en MSX la combinación óptima "0[00000000]11" necesitaba 26 pulsos y la peor "0[11111111]11" necesitaba 42 para definir un único byte. La única manera de que las herramientas existentes en la fecha (Tapir y ZX-Blockeditor) pudiesen gestionar esos patrones, era usar el poco usado bloque generalista (introducido en la versión TZX 1.20) y añadir a cada bloque un diccionario de 21 KB que definiese 256 entradas con un número variable de pulsos para cada una de ellas.
Realicé manualmente, ayudado con el Adobe Audition y un editor hexadecimal, algún volcado con éxito (Stardust de Topo Soft) que utilizaba el ID19 del formato TZX... pero enseguida me di cuenta que había algunos juegos que tenían hasta 39 bloques de carga (Head over Heels) y necesitarían multiplicar por 39 los 21 KB de diccionario. Tendríamos así 819 KB solo para definir cómo estaban dispuestos los bits, aparte de lo que ocupasen después los propios bytes cargados del juego. Una locura. Incluir manualmente los 10700 númeritos en cada bloque, más la lentitud extrema que tanto dato extra provocaba en ZX-Blockeditor, me hicieron ver enseguida la necesidad de crear un nuevo bloque TZX fuera de las especificaciones oficiales.
Quiero destacar en este punto, el inestimable trabajo de recopilación de volcados de juegos de MSX en WAV realizado por el valenciano Pablibiris que dispone de un gran repositorio en la web de Vintagenarios, y cuyos archivos me han sido útiles para poder hacer todas las pruebas a lo largo de este proyecto.
Aunque no fue sino hasta Noviembre de 2016, un año después, donde a raíz de un comentario en RetroWiki sobre la carga en los ordenadores Acorn Electron y BBC Micro, y casi como por casualidad, llegué a una página de Wikipedia donde se explicaba que el formato de codificación de ambos equipos proviene de una reunión realizada en 1975 en la ciudad de Kansas City (Missouri) y auspiciada por la prestigiosa revista Byte, para estandarizar las transferencias de datos y solucionar el caos que ya por entonces había entre distintos fabricantes, de ahí que al resultado se le conozca como Kansas City Standard. Por lo tanto, la opción más factible era la creación de un bloque TZX que consiguiese replicar el comportamiento del KCS y donde el MSX se acoplase sin necesitar diccionarios extraños. Así nació unos días después, el bloque con identificador 4B (el código ASCII de la letra K) que está descrito más arriba.
Inmediatamente actualizé mi herramienta TZX2WAV a la versión 0.4 Beta para poder generar audios a partir del nuevo formato, que pudieran ser cargados en máquina real o en emuladores (en la actualidad solo el OpenMSX y el MESS/MAME son capaces de admitir WAV como entrada). Al poco tiempo me puse en contacto con el alemán Claus Jahn, creador de la suite de herramientas ZX-Modules, y aunque él ya había abandonado el proyecto, le convencí de actualizar ZX-Blockeditor para que soportase una nueva versión TZX 1.21 que incorporase el bloque 4B. Durante los siguientes cuatro meses, en los ratos que ambos teníamos libres, le proporcioné retroalimentación a las betas que me iba proporcionando, especialmente en la inclusión de opciones específicas para MSX en el editor de bloques. Finalmente el pasado 15 de Marzo de 2017, liberó al público la versión 2.4.2 actualizada.
Por último, anteayer actualicé el reproductor TZX para Android TapeRider a la versión 0.3 Beta, que igualmente soporta el nuevo bloque 4B.
Herramientas
Volcados de ejemplo