﻿# CPCEC -- http://cngsoft.no-ip.org/cpcec.htm #

	  ####  ######    ####  #######   ####   -------------------------
	 ##  ##  ##  ##  ##  ##  ##   #  ##  ##  CPCEC, plain text Amstrad
	##       ##  ## ##       ## #   ##       CPC emulator written in C
	##       #####  ##       ####   ##       as a postgraduate project
	##       ##     ##       ## #   ##       by Cesar Nicolas-Gonzalez
	 ##  ##  ##      ##  ##  ##   #  ##  ##  since 2018-12-01 till now
	  ####  ####      ####  #######   ####   -------------------------

## Introducción ##

CPCEC es un emulador de la familia de microordenadores domésticos Amstrad CPC
(modelos 464, 664, 6128, Plus y GX4000) cuyo objetivo es ser fiel al hardware
original y eficiente en sistemas modernos corrientes. Para ello ofrece una
emulación fidedigna del microprocesador Z80 y reproduce el comportamiento de los
chips de imagen CRTC 6845 y Gate Array, del chip de sonido PSG AY-3-8912, de los
demás circuitos presentes en el hardware original, y de las unidades de cinta y
disco que hacían posible la carga y ejecución del software existente.

El software y la documentación se proporcionan "tal cual" sin garantía alguna.
El código fuente y los binarios de CPCEC siguen la licencia GNU General Public
License v3, como se ve en el fichero GPL.TXT adjunto al paquete.

## Requisitos e instalación ##

La versión normal de CPCEC requiere un sistema operativo Microsoft Windows 2000
o posterior, mientras que la versión para SDL2 necesita cualquier sistema
operativo que disponga de la librería SDL2 [http://www.libsdl.org/] desde la
versión 2.0.4 o superior. El hardware mínimo es el propio de dichos sistemas
operativos, y se recomienda que el microprocesador central funcione a 400 MHz
por lo menos. La resolución de pantalla en píxeles debe ser 800x600 como mínimo.
Una tarjeta de sonido es opcional, así como emplear un joystick.

El emulador se compone de varios ficheros: los binarios ejecutables (por defecto
CPCEC.EXE y ZXSEC.EXE para Windows) y los ficheros de firmware CPC464.ROM,
CPC664.ROM, CPC6128.ROM, CPCADOS.ROM, CPCPLUS.ROM, SPEC128K.ROM, SPEC-P-2.ROM,
SPEC-P-3.ROM y SPECTRUM.ROM. Todos ellos deben ser copiados en un mismo
directorio, idealmente creado para alojar el emulador.

Los binarios pueden ser compilados a partir de los ficheros fuente siguiendo las
instrucciones incluidas a continuación. GCC 4.9.2, GCC 5.1.0, Pelles 4.50.113,
TCC 0.9.27 y Clang 3.7.1 funcionan correctamente; GCC 4.7.1 comete fallos graves
en la compilación y puede generar binarios inválidos.

Los binarios para Windows pueden ser compilados desde GCC (o compatibles)
mediante los siguientes comandos:

	windres cpcec.rc -Ocoff -ocpcec.res
	gcc -m32 -mwindows cpcec.res -O2 -xc cpcec.c -luser32 -lgdi32 -lwinmm
-lcomdlg32 -lshell32 -ocpcec.exe

	windres zxsec.rc -Ocoff -ozxsec.res
	gcc -m32 -mwindows zxsec.res -O2 -xc zxsec.c -luser32 -lgdi32 -lwinmm
-lcomdlg32 -lshell32 -ozxsec.exe

La posibilidad de emplear opcionalmente DirectDraw consiste en añadir `-DDDRAW
-lddraw` al final de los comandos `gcc ...`.

Pelles C y otros compiladores visuales pueden definir el proyecto entero a
partir de los ficheros fuente CPCEC.C y ZXSEC.C y los ficheros de recursos
CPCEC.RC y ZXSEC.RC, y deducir los ficheros adicionales por sí mismos (iconos y
ficheros de cabecera) mientras que las librerías necesarias para compilarlo (de
no reconocerlas automáticamente el compilador) son USER32, GDI32, WINMM,
COMDLG32 y SHELL32, todas ellas del SDK de Win32.

Los binarios para sistemas operativos con soporte SDL2 necesitan comandos
distintos. Algunos sistemas pueden necesitar un parámetro adicional
`-DSDL2_DOUBLE_QUEUE` si el sonido se interrumpe porque el buffer por defecto es
corto.

	gcc -DSDL2 -O2 -xc cpcec.c -lSDL2 -ocpcec

	gcc -DSDL2 -O2 -xc zxsec.c -lSDL2 -ozxsec

Además, los nombres de fichero deben estar en minúsculas: el contenido del
archivo ZIP pueden necesitar extraerse con "unzip -LL cpcec-20XXXXXX.zip".

## Configuración y ficheros ##

El funcionamiento de CPCEC se configura especificando parámetros opcionales en
la línea de comandos. Para que los parámetros preferidos por el usuario sean
estables se recomienda crear en el menú del sistema un enlace al emulador que
contenga dichos parámetros. Las opciones pueden ser abreviadas al estilo Unix:
por ejemplo `-C -d -J` se abrevia `-CdJ`. En caso de duda, el parámetro `-h`
muestra una breve explicación de las opciones disponibles.

* -C0 : mostrar la imagen en blanco y negro;
* -C1 : mostrar la imagen a color oscuro;
* -C2 : mostrar la imagen a todo color (por defecto);
* -C3 : mostrar la imagen a color claro;
* -C4 : mostrar la imagen en fósforo verde;
* -c0 : elegir el modo de "scanlines" medios;
* -c1 : elegir el modo de "scanlines" normales (por defecto);
* -c2 : elegir el modo de entrelazado simple;
* -c3 : elegir el modo de entrelazado doble;
* -d : iniciar la emulación con el "debugger" activo (por defecto inactivo);
* -g0, -g1, -g2, -g3, -g4 : elegir el tipo de CRTC de 0 a 4 (tipo 1 por
defecto);
* -h : ayuda breve;
* -j : activar la emulación del joystick por teclado (cursores y teclas Z, X y
C);
* -J : deshabilitar el uso de un joystick conectado al sistema;
* -K, -k0 : emular solamente 64k de RAM;
* -k1 : emular 128k de RAM (por defecto);
* -k2 : emular 192k de RAM;
* -k3 : emular 320k de RAM;
* -k4 : emular 576k de RAM;
* -m0 : iniciar la emulación como un Amstrad CPC 464;
* -m1 : iniciar la emulación como un Amstrad CPC 664;
* -m2 : iniciar la emulación como un Amstrad CPC 6128, por defecto;
* -m3 : iniciar la emulación como un Amstrad Plus (Plus 464, Plus 6128 y GX4000
solamente se distinguen en la cantidad de RAM, el controlador de disco y el
teclado);
* -O : ocultar indicadores en pantalla (por defecto visibles);
* -R : deshabilitar emulación en tiempo real (por defecto habilitada);
* -S : deshabilitar sonido (por defecto habilitado si hay una tarjeta de
sonido);
* -T : deshabilitar estereofonía (por defecto habilitada);
* -X : emplear la pantalla completa en lugar de una ventana;
* -X : deshabilitar emulación de unidades de disco (por defecto habilitada);
* -Y : deshabilitar el análisis de cinta (por defecto habilitado; ver más
adelante);
* -Z : deshabilitar la aceleración de cinta (por defecto habilitada);
* -! : deshabilitar la aceleración por hardware de vídeo.

También es posible añadir nombres de fichero a la línea de comandos: el emulador
intentará cargar y ejecutar los ficheros especificados. Gracias a ello CPCEC
puede ser vinculado a las extensiones de fichero CDT, CPR, CSW, DSK y SNA para
cargar dichos ficheros automáticamente.

Los tipos de fichero admitidos por el emulador se dividen en cuatro tipos:

* WAV, CSW y CDT: ficheros de cinta, es decir volcados digitales de los
contenidos de una cinta magnética utilizada para almacenar y distribuir datos y
software.
* DSK: ficheros de disco, representaciones virtuales de la estructura y los
contenidos de un disco flexible magnético capaz de contener datos y software.
* SNA: instantáneas o "snapshots", copias integrales del estado de un sistema
emulado que hacen posible reanudar más tarde dicho estado de emulación.
* ROM y CPR: firmwares y cartuchos. El firmware contiene la BIOS y el intérprete
de BASIC; los cartuchos eran utilizados por la serie Amstrad Plus.

La lectura de cintas emplea dos métodos (habilitados por defecto) para mejorar
la experiencia de usuario abreviando un proceso que entonces era muy lento: un
programa típico en cinta tardaba cinco minutos en cargar. El primer método
(aceleración de cinta) simplemente detecta si hay una cinta insertada y el motor
del cassette está en funcionamiento: entonces el emulador se pone a funcionar a
la máxima velocidad posible. El segundo método (análisis de cinta) examina el
estado actual del Z80 y detecta si éste intenta leer la cinta de una forma
conocida: entonces manipula su estado para generar al instante los resultados de
la lectura en lugar de esperar a que la cinta genere la siguiente señal.

La ejecución automática de ficheros de disco intenta detectar por sí misma el
método de arranque necesario. Dado que algunos discos tenían más de un arranque
posible y el emulador corre el riesgo de elegir uno distinto al esperado, el
usuario puede establecerlo a mano tecleando la orden `RUN"NOMBRE` (donde NOMBRE
es el fichero de arranque, que suele venir especificado en las instrucciones del
software, o ser simplemente DISC o DISK) en el sistema emulado y pulsando
RETURN. En caso de duda, la orden CAT muestra la lista de ficheros contenidos en
el disco.

## Funciones ##

Una vez en funcionamiento, CPCEC muestra la pantalla del sistema emulado y
obedece a las órdenes del usuario, que además de las pertinentes a dicho sistema
(pulsaciones de teclas alfanuméricas y de control, movimientos del joystick real
o emulado mediante teclado) incluye una serie de teclas de función especiales.
En caso de duda, la tecla F1 muestra un breve índice de dichas teclas de
función.

* F1: ayuda breve;
* F1+Control: autoría del emulador;
* F2: grabar el estado actual de la emulación en una instantánea;
* F2+Control: volver a grabar la última instantánea seleccionada;
* F3: cargar y ejecutar un fichero de cinta, de disco, una instantánea o un
cartucho;
* F3+Control: volver a cargar la última instantánea seleccionada;
* F4: habilitar (o deshabilitar) la emulación de sonido;
* F4+Control: habilitar (o deshabilitar) el joystick por teclado;
* F5: elegir el firmware del CPC emulado, que puede ser un fichero ROM, un
fichero INI o un cartucho de formato CPR;
* F5+Shift: insertar cartucho de Dandanator; nótese que estos cartuchos tienen
un formato diferente al de los firmwares de CPC y por ello deben ser manipulados
separadamente;
* F5+Control: reiniciar la emulación;
* F5+Control+Shift: extraer cartucho de Dandanator;
* F6: habilitar (o deshabilitar) la emulación en tiempo real;
* F6+Control: elevar la velocidad del Z80 emulado de 4 MHz a 8, 12 y 16 MHz;
* F6+Control+Mays: reducir su velocidad a 12, 8 y 4 MHz;
* F7: insertar un fichero de disco en la disquetera virtual A; nótese que el
modo de acceso es sólo-lectura a menos que el usuario explícitamente elija
lectura-escritura en el diálogo de selección de ficheros;
* F7+Mays: insertar un fichero de disco en la disquetera virtual B;
* F7+Control: extraer el disco de la disquetera virtual A;
* F7+Control+Mays: extraer el disco de la disquetera virtual B;
* F8: insertar un fichero de cinta en el cassette virtual;
* F8+Mays: empezar a grabar un fichero de cinta nuevo;
* F8+Control: extraer la cinta del cassette virtual;
* F9: habilitar el "debugger" (ver más adelante);
* F9+Mays: mostrar (u ocultar) los indicadores en pantalla;
* F9+Control: habilitar (o deshabilitar) la aceleración de cinta;
* F9+Control+Mays: habilitar (o deshabilitar) el análisis de cinta;
* F11: cambiar el modo de color entre verde y tres gamas de color de claridad
creciente;
* F11+Mays: ídem en sentido contrario, recorriendo las gamas por orden
decreciente;
* F11+Control: cambiar el tipo de "scanlines", de scanlines medios a entrelazado
doble;
* F11+Control+Mays: ídem en sentido contrario, de entrelazado doble a scanlines
medios;
* F12: grabar el contenido de la pantalla en un fichero BMP;
* F12+Mays: grabar un vídeo en formato intermedio XRF;
* F12+Control: comenzar a grabar (o terminar) el sonido en un fichero WAV;
* F12+Control+Mays: comenzar a grabar (o terminar) el sonido en un fichero YM;
* Pausa: detener (o reanudar) la emulación;
* Alt+Return: maximizar (o restaurar) la ventana. El menú se oculta al maximizar
la ventana mediante estas teclas.

Las versiones para SDL2 son ligeramente distintas en la medida en que
proporcionan su propio interfaz gráfico; el menú aparece al pulsar la tecla F10
del teclado o el botón derecho del ratón, y para cambiar el modo de acceso de
ficheros de disco hay que pulsar TAB dentro del diálogo de selección de ficheros
mostrado por F7 ó F7+Mays. Los diálogos se manipulan con las teclas y el ratón:
en los menús, tocar un botón sobre un elemento del menú sirve para elegirlo,
mientras que en los demás diálogos se elige un elemento tocando un botón del
ratón sobre dicho elemento (si no está visible la lista se desplaza para
mostrarlo) y se acepta este elemento tocando el botón otra vez. Todos los
diálogos se abandonan tocando un botón del ratón mientras éste apunta fuera del
diálogo.

Los ficheros BMP y WAV son los ficheros de imagen y sonido estándares homónimos.
Los ficheros YM son volcados del estado del chip de sonido, que por haber sido
usado en más plataformas además de Amstrad CPC (Spectrum 128, MSX, Atari ST...)
pueden ser emulados y reproducidos independientemente en programas terceros
tales como STSOUND y AY-EMUL. Nótese que el modo de "scanlines" (opción que
simula varios tipos de monitor) se refleja en las grabaciones igual que en la
pantalla, y que cada modo tiene un impacto distinto en el rendimiento del
programa: el modo normal consume más esfuerzo, y el entrelazado doble, menos.

Los ficheros INI pueden definir un "perfil", un conjunto de ROMs extras para
superponer al firmware actual. Internamente son simples ficheros de texto donde
cada línea define un atributo o una ROM:

* type = 0..3 : elige el tipo de firmware (por ejemplo 0 significa CPC464) de
igual forma que los parámetros de línea de comandos -m0..3;
* bank = 0..4 : elige el tamaño de RAM (por ejemplo 0 significa 64k) de igual
forma que los parámetros -k0..4;
* crtc = 0..4 : elige el tipo de CRTC de igual forma que los parámetros -g0..4;
* fddc = 0..1 : elige si el controlador de unidad de disco está presente (1) o
ausente (0);
* lowest=nombrefichero : define el contenido de ROM LOW; el fichero ROM debe
estar ubicado en el mismo directorio del perfil;
* highXX=nombrefichero : define el contenido de la ranura XX de HIGH ROM, donde
XX es un número hexadecimal de dos cifras: "00" es 0, "0A" es 10, "10" es 16,
etc. por ejemplo HIGH07=PARADOS.ROM cargaría PARADOS.ROM en la ranura 7.

Los indicadores en pantalla muestran el estado de las unidades de disco (número
de pista, actividad), la cinta (actividad) y el joystick.

Las siguientes teclas ajustan el "frameskip" o salto de "frames": a mayor valor
de este parámetro, menor consumo de potencia de proceso, pero también menor
suavidad visual. Idealmente debe mantenerse su valor a 0 a menos que 1.- el
sistema no tenga potencia de proceso suficiente, o 2.- el usuario necesite
acelerar la emulación durante un tiempo.

* Num.+ : incrementa el valor de "frameskip", hasta 25;
* Num.- : decrementa el valor de "frameskip", hasta 0;
* Num.* : establece el valor de "frameskip" al máximo, 25;
* Num./ : establece el valor de "frameskip" al mínimo, 0.

El menú también incluye algunas opciones adicionales (por ejemplo el tipo de
CRTC) además de acciones tales como cambiar los lados de los discos insertados,
examinar los contenidos de la cinta actual, habilitar las extensiones de
hardware Dandanator y Playcity, etc.

CPCEC permite arrastrar y soltar ficheros. Éstos serán automáticamente
ejecutados (como con F3) a menos que la tecla Mays esté pulsada, en cuyo caso
serán simplemente insertados como con F7 y F8.

Los archivos ZIP pueden ser leídos por CPCEC (de haber más de un fichero en su
interior se mostrará una lista para que el usuario elija el fichero necesario)
pero sus contenidos no pueden ser modificados.

## Debugger ##

El depurador o "debugger" sirve para detener la emulación y examinar su estado
interno. Al principio empleaba un interfaz de línea de comandos; ahora se basa
en un interfaz de usuario controlado mediante cursores dividido en cuatro
paneles: desensamblado (arriba izquierda), registros (arriba derecha), volcado
de memoria (abajo izquierda) y pila (abajo derecha). La mitad izquierda del
panel de registros (sólo lectura) muestra los registros del hardware (Gate
Array, CRTC, etc.) mientras que la mitad derecha (lectura y escritura) muestra
los registros propiamente dichos del Z80. Los valores mostrados en la pantalla y
los parámetros de las órdenes emplean notación hexadecimal.

* Los cursors, Re.Pág. y Av.Pág. mueven el cursor dentro del panel actual;
* Tab (o Mays+Tab) mueve el cursor al panel siguiente (o anterior);
* Dígitos del 0 al 9 y letras de la A a la F modifican el valor bajo el cursor;
* Punto (".") crea o destruye un punto de ruptura o "breakpoint" en la posición
actual del cursor en el desensamblado;
* G ("go to") solicita una dirección (en hexadecimal) y envía el cursor a su
lugar correspondiente en el desensamblado o el volcado de memoria;
* H ("help") muestra una ayuda breve;
* I ("input") solicita un nombre de fichero y carga su contenido en memoria a
partir de la dirección actual del cursor;
* J ("jump to") asigna la dirección actual del cursor al registro PC del Z80:
equivale a que el Z80 "salte" a dicha dirección.
* L ("log") solicita un registro de 8 bits (B, C, D, E, H, L, F o A) y crea un
breakpoint especial en la instrucción actualmente bajo el cursor; a partir de
entonces, cuando esta instrucción tenga lugar, el valor del registro de 8 bits
será enviado a un fichero de grabación elegido por el usuario;
	+ K cierra el fichero de grabación;
* M conmuta el contenido del volcado de memoria entre lo que el Z80 puede leer
(RAM o ROM; el separador entre el campo hexadecimal y el ASCII es `/`) y lo que
puede escribir (solamente RAM; el separador es `\`);
* O ("output") solicita una longitud en bytes y un nombre de fichero, y crea un
fichero con un volcado de memoria que comienza en la dirección actual del
cursor;
* P ("print") solicita una longitud en bytes y un nombre de fichero, y crea un
fichero con un desensamblado que comienza en la dirección actual del cursor;
* Q conmuta el comportamiento del código ilegal $EDFF, bien en modo normal
("EDFF-") donde no hace nada especial o en modo de desarrollo ("EDFF+") donde es
un breakpoint;
* R ("run to") ejecuta la emulación hasta alcanzar la operación actualmente bajo
el cursor en el desensamblado;
* S ("search") solicita una cadena bien ASCII (sin importar las mayúsculas),
bien hexadecimal con un prefijo (por ejemplo `SOS` se convierte en `$534F53`) y
la busca en la memoria a partir de la dirección actual hasta la última dirección
válida. Si encuentra la cadena ubica el cursor en ella en el desensamblado o el
volcado de memoria;
	+ N ("next") vuelve a buscar la misma cadena;
* T ("timer") limpia el cronómetro; su valor se incrementa a medida de la
emulación;
* U ("return") reanuda la emulación hasta alcanzar la dirección de regreso de la
llamada en curso;
* V ("view") cambia la apariencia del debugger, cambiando los colores blanco y
negro y los caracteres finos y gruesos;
* W ("watch") conmuta entre el debugger de la emulación y el visor de gráficos;
los cursores, Re.Pág., Av.Pág y la tecla "G" recorren la memoria, Inicio/Fin
reducen y aumentan la anchura de los gráficos, y Tab conmuta entre el modo
horizontal y el vertical;
* X conmuta el panel de información de hardware clásico/Plus;
* Y solicita una longitud en bytes y un valor de 8 bits, y llena con dicho valor
el intevalo de memoria que comienza en la dirección actual del cursor;
* Z elimina todos los breakpoints;
* Espacio ("step into") ejecuta exactamente una instrucción y se detiene en la
siguiente.
	+ Mays+Espacio ejecuta instrucciones durante un "scanline" entero;
* Return ("step over") reanuda la emulación hasta alcanzar la operación
siguiente a la actual. Se comporta de una forma distinta a Espacio si la
instrucción actual es una llamada;
* Escape abandona el debugger y reanuda la emulación.

El uso de mayúsculas y minúsculas no es importante: el debugger no hace
distinciones.

## Vídeos ##

Los vídeos se graban como ficheros XRF, un paso intermedio (compresión baja,
consumo de CPU bajo) previo a la generación de ficheros de vídeo convencionales.

La herramienta adjunta XRF convierte un fichero de tipo XRF en un fichero de
tipo AVI. Funciona de dos formas diferentes, una exclusiva de Windows y otra
general.

Al compilarla en Windows (necesita la librería de sistema AVIFIL32: "gcc
-lavifil32 -xc xrf.c -oxrf.exe") y ejecutarla (la sintaxis es "xrf fuente.xrf
destino.avi ABCD") leerá el fichero "fuente.xrf" y generará un fichero llamado
"destino.avi" mediante el códec ABCD, de estar instalado. Ejecutar la
herramienta sin parámetros muestra la ayuda y la lista de los códecs
disponibles. Se recomienda instalar y utilizar el códec ZMBV realizado por el
proyecto Dosbox porque es el que mejor rendimiento proporciona en grabaciones
pixeladas como éstas.

En otros sistemas XRF no puede usar ningún códec directamente, así que el
resultado es un fichero AVI sin comprimir (imagen RGB de 24 bpp, sonido PCM
estéreo); afortunadamente es capaz de generarlo a través de la consola
especificando "-" en lugar de "destino.avi" y alimentar así un programa de
codificación de vídeo, por ejemplo FFMPEG: la línea "xrf fuente.xrf - | ffmpeg
-i - destino.avi" delega en FFMPEG la tarea de codificar el fichero AVI. Lea la
documentación de FFMPEG al respecto.

## ZXSEC ##

ZXSEC es un emulador de la familia Sinclair Spectrum (48k, 128k, +2/Plus2 y
+3/Plus3) basado en los componentes compartidos con el Amstrad CPC: el
microprocesador Z80, el chip de sonido PSG AY-3-8912, el sistema de cinta y la
controladora de disco NEC765.

Se compone de los ficheros ZXSEC.EXE, SPECTRUM.ROM, SPEC128K.ROM, SPEC-P-2.ROM y
SPEC-P-3.ROM, y por lo demás funciona igual que CPCEC, con varias salvedades:

* la opción -mX elige uno de cuatro modelos posibles: -m0 (48k), -m1 (128k), -m2
(+2) ó -m3 (+3);
* la opción -K deshabilita el chip de sonido PSG AY-3-8912 (habilitado por
defecto) si el modelo elegido es Spectrum 48k;
* la opción -X deshabilita la unidad de disco si el modelo elegido es Spectrum
+3, que así se convierte en un +2A;
* Control+Mays+F8 sirve para poner en marcha (o detener) el motor de cinta, dado
que el hardware de CPC dispone de control de cinta incorporado, mientras que el
de Spectrum carece de él.
* las opciones de joystick se refieren al interfaz Sinclair 2 por defecto; el
menú permite elegir el tipo de joystick.

ZXSEC puede mostrar efectos Gigascreen (por ejemplo la demo "Mescaline
Synesthesia" 2009 DeMarche) tras activar las opciones de entrelazado en el menú
Video.

## Agradecimientos ##

Este emulador debe su existencia a una serie de personas y sociedades que
enumero a continuación:

* Los ficheros de firmware incluidos en el paquete son propiedad de Amstrad, que
autoriza la emulación de sus antiguos sistemas informáticos y permite la
distribución de sus firmwares siempre que se respete su autoría y su contenido,
y a quien agradezco de todo corazón la creación de aquellos magníficos
ordenadores y la buena voluntad hacia la emulación de los mismos.
* Este emulador fue mi proyecto de fin de máster en Ingeniería Informática para
la Universidad Nacional de Enseñanza a Distancia (UNED), que estuvo dirigido por
el profesor José Manuel Díaz Martínez y resultó galardonado con un diez con
derecho a matrícula de honor.
* La documentación sobre el sistema procede de cpcwiki.eu, cpc-power.com,
cpcrulez.fr y quasar.cpcscene.net.
* Las pruebas alfa corrieron a cargo del fiel y leal Denis Lechevalier.

## Apéndice: casos de pruebas ##

A continuación se enumeran los cien títulos que sirvieron para hacer el grueso
de las pruebas del emulador durante su desarrollo. Algunos abarcan varias
pruebas (por ejemplo "Donkey Kong" es a la vez una cinta protegida y un caso
medio de varios modos de imagen simultáneos); se les menciona solamente en la
primera de ellas.

Diagnósticos:

* Z80 Instruction Exerciser ZEXALL (2004 dominio público)
* PLUSTEST (2002 Richard Wilson)

Casos simples:

* Sultan's Maze / Laberinto del Sultán (1984 Gem Software / Amsoft)
* Oh Mummy (1984 Gem Software / Amsoft)
* Roland on the Ropes / Fred (1984 Indescomp / Amsoft)
* Roland in the Caves / La Pulga (1984 Indescomp / Amsoft)

Ficheros de cinta:

* Sin protección:
	+ Roland in Time (1984 Gem Software / Amsoft)
	+ Manic Miner (1985 Software Projects / Amsoft)
	+ Jet Set Willy (1985 Software Projects / Amsoft)
	+ Knight Lore (1985 Ultimate)
	+ Alien 8 (1986 Ultimate)
* Protecciones simples:
	+ Technician Ted (1985 Hewson)
	+ Abu Simbel Profanation (1986 Dinamic)
	+ Deflektor (1987 Costa Panayi / Gremlin Graphics)
	+ Desperado (1987 Topo Soft)
	+ Humphrey (1988 Made in Spain / Zigurat)
* Protecciones medias:
	+ Donkey Kong (1986 Arcana / Ocean)
	+ MASK (1987 Gremlin Graphics)
	+ Operation Wolf (1988 Imagine)
	+ Rainbow Islands (1989 Graftgold / Ocean)
* Protecciones complejas:
	+ Rasputin (1985 Paul Hibbard / Firebird)
	+ Spiky Harold (1985 A.Rogers / Firebird)
	+ Druid (1986 Firebird)
	+ Split Personalities (1986 Domark)
	+ Last Mission (1986 Opera Soft)
	+ Marmalade (1987 MBC Informatique)
	+ Gonzzálezz (1989 Opera Soft)
	+ Twinworld (1990 Ubi Soft)

Casos extraños:

* Z80:
	+ Sabre Wulf (1985 Ultimate)
	+ Bigfoot (1989 Codemasters)
* PIO:
	+ Nodes of Yesod (1986 Odin)
	+ Prehistorik (1991 Titus)
	+ Antiriad / Sacred Armour of Antiriad (1987 Palace Software)
* Puertos:
	+ Skweek (1989 Loriciels)
	+ Night Shift (1990 Lucasarts)
	+ Hero Quest (1991 Gremlin Graphics)

Casos medios:

* Varios modos de imagen o paletas de color a la vez:
	+ Sorcery (1985 Gang of Five / Virgin Games)
	+ Kong Strikes Back (1985 Ocean)
	+ Crafton & Xunk (1986 Ere Software)
	+ Elite (1986 Bell and Braben / Firebird)
	+ Amaurote (1987 Binary Design / Mastertronic)
	+ Feud (1987 Binary Design / Mastertronic)
	+ Gauntlet (1987 Gremlin Graphics)
	+ Renegade (1987 Arcana / Imagine)
* Scroll rápido y suave por hardware:
	+ TLL / Tornado Low Level (1985 Vortex Software)
	+ Thing on a Spring (1986 Gremlin Graphics)
	+ Ghosts'n Goblins (1986 Elite)
	+ Prohibition (1987 Infogrames)
* Pantalla de tamaño mayor ("overscan"):
	+ Arkanoid (1987 Probe / Imagine)
	+ Arkanoid 2: Revenge of Doh (1988 Imagine)
* Doble búfer por hardware:
	+ Sol Negro (1988 Opera Soft)
	+ Mutan Zone (1988 Opera Soft)
	+ Rescate Atlántida (1989 Creep Soft / Dinamic)
	+ AMC / Astro Marine Corps (1989 Creep Soft / Dinamic)
* Sonido digitalizado:
	+ Enigma de Aceps (1986 ACE Software)
	+ Dragon Ninja (1988 Imagine)
	+ Robocop (1988 Ocean)

Ficheros de disco:

* CP/M 2.2 (1984 Digital Research / Amstrad)
* CP/M Plus (1985 Digital Research / Amstrad)
* Abadía del Crimen (1987 Opera Soft)
* Corsarios (1990 Opera Soft)
* Ghostbusters 2 (1989 Software Studios / Activision)
* SWIV (1991 Storm / Sales Curve)
* Addams Family / La familia Addams (1991 Ocean)
* 5KB Demo 3 (1999 Duncan + LBB)

Casos avanzados:

* Mission Genocide (1987 Paul Shirley / Firebird)
* Warhawk (1987 Proteus / Firebird)
* Dynamic Duo (1988 Probe / Firebird)
* Rastan (1988 Probe / Imagine)
* Skateball (1988 Ubi Soft)
* Turrican (1990 Probe / Rainbow Arts)

Amstrad Plus:

* Arnold 5 Diagnostic Rom Version 1.3 (1990 Amstrad)
* Burnin' Rubber (1990 Ocean)
* Navy Seals (1990 Ocean)
* Copter 271 (1991 Loriciel)
* Fire 'n Forget 2 (1990 Titus)
* Dick Tracy (1991 Titus)
* No Exit (1990 Coktel Vision)
* Robocop 2 (1990 Ocean)
* Switchblade (1990 Gremlin Graphics)
* World of Sports (1990 Epyx)
* 1st Plus Demo (1991 GPA)
* Eerie Forest (2017 Logon System)

Casos muy avanzados:

* Turrican 2 (1991 Enigma Variations / Rainbow Arts)
* Facehugger Megademo (1991 Face Hugger)
* Zap't'Balls (1992 Amstrad CPC International)
* Super Cauldron (1992 Titus)
* Prodatron Megademo (1992 Prodatron)
* Prehistorik 2 (1993 Titus)
* Voyage '93 (1993 BENG)
* Overflow 5 Previews (1994 Overflow)
* Big'O Full'O Dem'O (1998 Arkos)
* Byte '98 (1999 Mortel & Overlanders)
* École Buissonière (2000 Overlanders)
* DTC (2006 Arkos)
* Orion Prime (2009 Cargosoft)
* Edge Grinder (2011 Cosine & Format War)
* Batman Returns (2011 Batman Group)
* Bloc Us (2011 Benediction)
* Super Edge Grinder (2012 Cosine & Format War)
* R-Type 128 (2012 Easter Egg)
* Still Rising (2013 Vanity)
* Yet Another Plasma! (2012 Logon System)
* Breaking Baud (2015 CRTC & 3LN)
* Megablasters: Escape from Castle in the Clouds (2015 Project Argon)
* Imperial Mahjong (2016 Cargosoft)
* Logon's Run (2017 Logon System)
* Wunderbar (2017 Arkos & Benediction)
* Isometrikum (2018 Vanity)
* Still Scrolling (2018 Music2Eye & Praline)
* PhX (2018 Condense)

## Historial de versiones ##

- 20190314 -- primera versión pública.
- 20190317 -- segunda versión pública. Corrige bugs de joystick en Win32:
JoyGetPos devuelve CERO en EXITO, no en ERROR.
- 20190318 -- tercera versión pública. Por defecto la ventana muestra un menú;
la nueva opción -+ lo oculta.
- 20190325 -- cuarta versión pública. Indicadores en pantalla (se ocultan con
-O); corrige un bug en ZXSEC que ralentizaba la emulación si el "frameskip" no
era nulo, y otro en la grabación de sonido en ficheros WAV.
- 20190331 -- quinta versión pública. Se puede recorrer cintas por posición (WAV
y CSW) o por bloques (CDT, TZX y TAP).
- 20190404 -- sexta versión pública. Corrige un bug del Z80 en la lógica del
IRQ. La configuración (modelo emulado y ubicación de ficheros) se conserva entre
sesiones en un fichero INI.
- 20190408 -- séptima versión pública. Corrige un bug en la grabación de
ficheros YM3, otro en los tiempos internos de ZXSEC y otro en los comandos del
debugger con parámetros opcionales.
- 20190419 -- octava versión pública. Añade opciones para interpolar la imagen y
el sonido; la cinta se rebobina al final automáticamente (como en FUSE); corrige
un bug en ficheros TZX con 0 en lugar de 8 en el campo "bits usados", otro en
bloques CUSTOM INFO de TZX, y otro cuando ZXSEC carga un fichero SNA de 48K en
modo Plus3 (de todas formas los usuarios deberían elegir el modelo apropiado
antes de cargar ficheros). Los ficheros INI recuerdan los nombres de los últimos
ficheros usados.
- 20190430 -- novena versión pública. Suaviza el modo monocromo para Spectrum;
corrige un bug del FDC en los sectores con datos GAP (de Loriciels); ZXSEC añade
contención de memoria simple ("Amaurote", "Black Lamp", "Puzznic", "Sly Spy",
"Zub"...).
- 20190524 -- décima versión pública. Añade lectura de bloques 0x24 y 0x25
(inicio y fin de ciclo) en ficheros CDT/TZX (cfr. BATMAN.TZX), corrige errores
en la lectura de sectores débiles en ficheros DSK (cfr. "Titus Classiques"), la
grabación de ficheros YM es reentrante, los ficheros INI corrigen un problema
con campos vacíos y añaden la opción `autorewind <0|1>` para rebobinar (o
expulsar) una cinta al alcanzar su final.
- 20190526 -- parche menor para corregir un error del arranque automático: abrir
menús y cambiar ventanas anulaba el teclado.
- 20190731 -- undécima versión pública. Añade un debugger con interfaz gráfico
de usuario (se acabó teclear órdenes en la consola) y la capacidad de leer
ficheros contenidos en archivos ZIP basada en PUFF.C del proyecto ZLIB,
actualiza GCC a 5.1.0 y elimina todas las etiquetas `inline` (hacían más
perjuicio que beneficio), y en general todos los elementos internos de la
emulación ya son independientes del sistema operativo. También se mejoran
algunos detalles: el interfaz de selección de ficheros corrige un error en Win10
(y en ciertos casos en Win7), el diálogo para recorrer cintas muestra el nombre
de la cinta, Spectrum +3 se convierte en +2A al cargar cintas, "auto rewind"
aparece en el menú Edit y ya no comete errores con ficheros CSW, y la emulación
del sonido ha mejorado, por ejemplo "Terminus" para CPC interpreta efectos
sonoros y "Agent X II" para Spectrum ya no tiene ruido.
- 20190809 -- parche menor para rechazar "silenciosamente" (i.e. sin códigos de
error) las operaciones de escritura en discos de sólo-lectura y para permitir el
autoarranque de discos con formato IBM.
- 20190817 -- parche menor para arreglar un "crash" al abrir cintas precisamente
cuando se activa el "frameskip" automático.
- 20190831 -- parche menor para corregir varios errores (arrancar discos de dos
caras con la opción FLIP SIDE habilitada, grabar "snapshots" o cintas después de
extraer un snapshot o cinta de un archivo ZIP), mejorar varios detalles (cargar
snapshots con compresión de memoria, emular hasta 576 kB de RAM) y redefinir los
menús (Edit se divide en Edit y Settings, Image y Sound se convierten en Video y
Audio, opciones nuevas de filtrado de vídeo...) y la línea de comandos: "-+"
ahora limita el zoom a valores enteros; "-!" hereda la opción de no mostrar el
menú.
- 20191003 -- duodécima versión pública. Contención de memoria y ruido de ULA
("nieve") precisos (aunque aún no perfectos): "48K Timing Tests" supera todas
las pruebas menos 36 y 37, y "128K Timing Tests" falla en solamente seis. "Mask
3: Venom Strikes Back" dibuja los efectos de atributos y borde en sus momentos
exactos en todas las plataformas (48K, 128K/Plus2, Plus3) y "Black Lamp", "LED
Storm" y "Sly Spy" de Software Creations se comportan bien en las máquinas de
128K. Mejoras en el debugger: corregido el emplazamiento erróneo del cursor en
el panel de desensamblado, añadida opción de caracteres altos, evitado el
conflicto entre debug y pausa, la nueva tecla M conmuta el volcado de memoria
entre modos de ROM+RAM y RAM sola. Mejoras en el uso de archivos ZIP (los
archivos no se quedan bloqueados, los ficheros en su interior se filtran por
extensión) y retoques en el interfaz de usuario.
- 20191004 -- parche menor para hacer que las opciones de V y M del debugger
perduren de una sesión a otra.
- 20191117 -- decimotercera versión pública. Emulación más precisa del CRTC tipo
1 (por defecto en lugar de 0) en CPCEC ("From Scratch", "Pinball Dreams"...) y
la contención de memoria de 48K en ZXSEC ("Starion", "Black Lamp"...). CPCEC
también permite elegir la duración de la señal V-Hold (por ejemplo "Thunder
Blade" necesita la señal corta) y si la sincronización horizontal (H-Sync) debe
ser flexible ("Batman Returns", "Pinball Dreams"...) o no ("CPC 30th Anniversary
Megademo", "PhX"). Por desgracia, algunas de las demos que antes funcionaban
bien ahora sufren problemas que no se resuelven eligiendo otro CRTC. Eliminado
el tercer botón de joystick de CPCEC, ningún joystick real lo incluyó. El
joystick de ZXSEC es Sinclair 2 por defecto.
- 20191130 -- parche menor para corregir un bug al ejecutar CPCEC y ZXSEC en una
pantalla de menos de 600 px de altura, otro al grabar un fichero WAV, y otro más
en la lógica de puertos de CPCEC ("Knight Rider": OUT &0088,&88 no debe alcanzar
el Gate Array, pero "Hero Quest", OUT &00C0,&C0 sí debe). Los tipos CRTC 0 y 2
han mejorado ("Face Hugger Ultimate Megademo: Tantrum", "5KB Megademo 3", "Power
System Megademo: Glooms"...) pero todavía son incompatibles con "Pinball
Dreams", a diferencia de CRTC 3 y 4, que junto a CRTC 1 ya pueden con este
juego.
- 20191227 -- decimocuarta versión pública. Mejoras visuales: la paleta de
fósforo verde es más cercana al original, los filtros verticales ("Y-Masking")
son compatiles con los modos entrelazados, combinar X-Masking con Y-Masking
genera un patrón cuadriculado. Mejoras internas: la nuevas propiedades de los
registros 3 y 9 del CRTC y los retrasos del Gate Array respecto del Z80 y el
CRTC por fin permiten emular "Pinball Dreams" por completo para todos los tipos
de CRTC y resuelven los problemas de varias demos ("Scroll Factory", "Still
Rising", partes de "The Demo"...) y juegos ("Action Fighter", "Storm Warrior",
"Usagi Yojimbo"...), pero algunos títulos todavía necesitan CRTCs concretos
("PhX" CRTC0, "Onescreen Colonies" CRTC1, etc.) para funcionar bien.
- 20191231 -- parche menor para corregir un bug en el FDC (el bit 6 de SENSE
DRIVE STATUS debe reaccionar cuando el usuario cambia discos: "Fugitif") y una
regresión en CRTC0 (detectar REG6<REG4 en lugar de REG6<=REG4: "5KB Megademo 3:
Nayad"). ¡Feliz año nuevo 2020!
- 20200101 -- parche menor para corregir una regresión en CRTC0 provocada por el
parche anterior ("Scroll Factory", intro de "Pinball Dreams", "Overflow Preview:
Part 1") y mejorar sus heurísticas ("Overflow Preview: Part 3").
- 20200229 -- decimoquinta versión pública. Añade hardware de Amstrad Plus:
colores extendidos, scroll suave, sprites por hardware, interrupciones de
barrido programables, canales DMA, cartuchos ROM, etc. Cincuenta nuevos esquemas
de cinta para acelerar la lectura de bytes e incluso bloques enteros. Mejoras en
la emulación de la unidad de disco: discos nuevos (formato DATA por defecto
común a CPC y Spectrum +3) que pueden ser creados al instante, emulación de
juegos protegidos de Design Design ("2112 AD"), The Edge ("Palitron"), Titus
("Prehistorik" y "Moktar/Titus the Fox") y errores corregidos (READ ID: "5KB
Demo 3", "Daley Thompson's Olympic Challenge" y "Turbo Copy III"; FORMAT TRACK
convierte discos del estilo antiguo MV - CPC al estilo nuevo EXTENDED, y limpia
el final del disco de datos inútiles). CPCEC respeta el tamaño de RAM (hasta
576k) y el tipo de CRTC al leer un snapshot (demo "Postscript") y lo mismo hace
ZXSEC, que puede leer instantáneas Z80 y cambia de PLUS3 a PLUS2 si el usuario
pide cargar una cinta y además permite elegir entre snapshots estrictos de 48K o
relajados. Control-F2 evita accidentes: no graba snapshots que hayan sido
cargados antes del último reset. Corrige un error que ocurría al combinar las
opciones "Y-Masking" y "Half Scanlines". Los archivos ZIP generados mediante
tuberías (i.e. las cabeceras finales son las correctas) ahora también pueden ser
leídos. Las fuentes se distribuyen junto a los binarios en lugar de entregarse
bajo demanda.
- 20200307 -- parche menor para evitar un cuelgue en globbing(), mejorar la
compatibilidad de los snapshots (WinAPE y ACE emplean bloques CPC+ ligeramente
distintos) y eliminar algunos detalles superfluos. Los paquetes de firmware
opcionales ahora incluyen los cartuchos correspondientes.
- 20200314 -- ¡primer aniversario! parche menor para resolver problemas de las
demos "CRTC3" y "Eerie Forest" para Amstrad Plus.
- 20200331 -- parche menor con mejoras adicionales para las demos de Plus
"CRTC3" y "Synergy 4" (aunque los sprites de arriba a la izquierda desaparecen
tras pocos segundos) y la nueva odren Mays+Espacio (saltar "scanline") al
debugger.
- 20200404 -- parche menor que corrige el controlador del DMA (todos los
comandos menos LOAD pueden combinarse) y elimina varios "apaños" para Plus menos
el de "Black Sabbath": gracias a Norecess464 por ubicar el error. Además -C pasa
a ser -C0..4.
- 20200406 -- parche menor que añade multiplexación parcial de los sprites de
Plus: "Synergy 4" recupera los sprites de arriba a la izquierda.
- 20200418 -- parche menor con mejoras en el contador de interrupciones (que
empieza con el primer final de HSYNC después del principio de VSYNC -"Onescreen
Colonies"- excepto en Plus donde puede empezar cuando el principio de VSYNC
coincide con el final de HSYNC -"Black Sabbath"-), los puertos de hardware (el
puerto A del PIO devuelve 0 al leerlo en modo de escritura excepto en Plus donde
devuelve 255 -"Tire au Flan"-, el puerto B debe activar VSYNC en medio de la
pantalla si el CRTC se lo pide -"Chany Dream End Megademo"- y el intervalo de
bytes 0-191 del Gate Array necesita una lógica de puertos más rígida -"Overflow
Preview 3"-) y en el debugger: los parámetros del desensamblado están alineados
verticalmente y el panel de información de hardware está alineado al volcado
ASCII de memoria. También corrige un error en el buscador de cabeceras de
archivos ZIP.
- 20200420 -- parche menor que corrige las barras negras de las señales HSYNC de
"Chany Dream End Megademo" en CRTC 1, "Onescreen Colonies" en CRTC 0, etc., así
como el valor de MEMPTR en JR cc,$RR y DJNZ $RR y la lógica de BIT n,r,(IX+$XX):
las cuotas de error de ZXSEC en las pruebas de 2012 RAXOFT son Z80FULL 10/152,
Z80CCF 70/152 y Z80MEMPTR 4/152.
- 20200430 -- decimosexta versión pública. Ahora es posible compilar CPCEC y
ZXSEC con SDL2 (que incluye su propio interfaz gráfico de usuario) para
múltiples sistemas operativos mediante la opción -DSDL_MAIN_HANDLED; también se
incluyen los ficheros CPCEC.ELF y ZXSEC.ELF para GNU/Linux 32bit ya compilados.
Nuevo soporte de perfiles de extensiones de ROM mediante ficheros INI capaces de
contener hasta 257 bloques ROM de 16K. Más retoques de Z80: las nuevas cuotas de
errores de ZXSEC en las pruebas 2012 RAXOFT son 8/152 Z80FULL, 5/152 Z80CCF y
0/152 Z80MEMPTR.
- 20200503 -- parche menor que mejora el comportamiento de las operaciones INI,
IND, INIR, INDR, OUTI, OUTD, OTIR y OTIR del Z80: las pruebas 2012 RAXOFT
(Z80CCF, Z80FULL y Z80MEMPTR) obtienen cero errores. "Frameskip" automático algo
más preciso.
- 20200505 -- parche menor centrado en el toolkit de SDL2: corrige un fallo al
confirmar sobreescribir archivos, y mejora la búsqueda de ficheros entre
directorios eligiendo por defecto el directorio anterior.
- 20200509 -- parche menor que mejora la sincronía entre Z80 y vídeo en ZXSEC:
el test ULA48 ya funcionaba antes, pero ULA128 tenía problemas; ahora ambos
funcionan bien. Añade la opción -W (emplear la pantalla completa en lugar de una
ventana) y mejora el código de SDL2 para ampliar la ventana.
- 20200603 -- decimoséptima versión pública. Añade sonido estéreo. Corrige un
bug en el PIO de CPC (el modo de sólo-lectura del puerto A permitía escrituras),
otro en el análisis de cintas (CPCEC: el algoritmo para TITUS provocaba
problemas en "The Blues Brothers"; ZXSEC: Speedlock5 no reconocía el ruido
inicial; ambos sistemas añaden parches para reducir las esperas iniciales), otro
en la carga de snapshots de CPC (cargar un snapshot grabado en hardware Plus sin
el bloque "CPC+" mostraba una paleta totalmente negra), otro en el debugger de
Z80 (la orden 'P' podía generar un desensamblado infinito), otro en la gestión
de cinta (leer un fichero WAV debe usar >128 como referencia, no >=128) y
algunos problemas en Win32 (la pantalla dejaba de redibujarse al hacer una
pausa, cambiar de ventana y volver al emulador) y otros en SDL2 (no mostraba
mensajes de error en el arranque; el algoritmo para ordenar nombres de ficheros
era lento).
- 20200606 -- parche menor con sonido envolvente: el usuario puede elegir la
separación de canales entre 0% (mono), 50% (envolvente) y 100% (estéreo).
- 20200616 -- parche menor que añade algunos aceleradores de cinta y elimina el
parche para acelerar las esperas iniciales (provocaba problemas). Varios cambios
en SDL2 (menos "warnings", caché de unidades de disco en Win32) y en el debugger
de Z80 (más contenido: 256 bytes en el volcado de memoria y 32 en la pila).
- 20200622 -- parche menor que reduce el consumo de memoria (el espacio de ROMs
extras se reserva solamente si el usuario carga un "perfil"), dibuja las señales
SYNC en negro en lugar del color del borde y corrige la parte de los cilindros
3D de "PhX" en CRTC1; los "gusanos de bolas" y el scroller final siguen mal en
CRTC3 y CRTC4, sin embargo.
- 20201010 -- decimooctava versión pública. Lógica de CRTC reescrita por
completo, con un sistema interno de eventos que aumenta la compatibilidad de
demos (por ejemplo "Chapelle Sixteen", "Madness Demo" y "S&KOH" para CRTC1) y un
dibujador de sprites de Plus completamente multiplexado. Más protecciones de
disco (ERE, UBI) funcionan, WRITE DELETED DATA pone al día la bandera
correspondiente en la tabla de sectores. Nuevo soporte de Dandanator, de sólo
lectura ("Sword of Ianna"). Soporte preliminar de Playcity, limitado a los dos
chips PSG extras y el disparador NMI. Nueva grabación de vídeo basada en un
formato intermedio XRF, incluyendo una herramienta que permite convertirlo en
ficheros AVI. Mejoras en el interfaz SDL2, con una fuente mayor (12px en lugar
de 8px) y alineamiento vertical en los atajos de teclado del menú. Añadidas
nuevas funciones de depuración (examinar los gráficos en la memoria con la tecla
"W", interceptar el código $EDFF como un breakpoint con "Q", etc.) y trasladados
los breakpoints de "T" a ".". Eliminados CPCEC.ELF y ZXSEC.ELF porque están
unidos a un sistema operativo concreto (Linux Mint 18 32bit) y el usuario debía
compilar los binarios de todas formas. Trasladados los ficheros de configuración
en sistemas distintos de Windows de CPCEC.INI y ZXSEC.INI a .cpcecrc y .zxsecrc
como es costumbre en Unix. Retoques de compatibilidad para CLANG.
- 20201012 -- parche menor que añade uso del ratón al interfaz de usuario de
SDL2.
- 20201015 -- parche menor que corrige un error en el soporte de Dandanator (las
operaciones "LD (IY+n),A/B/C" deben funcionar con cualquier valor de "n", en
lugar de solamente 0: gracias a Spirax por informarme) y otro en el CRTC (el
contador HCC es de 8 bits: "Camembert Meeting 4 Demo" deja de mostrar una línea
de basuras entre el panel superior y el central), añade SDL2_DOUBLE_QUEUE como
una opción de compilación de SDL2 (algunos sistemas necesitan un de audio mayor
que los 8 frames por defecto) y emplea un patrón de píxeles distinto cuando
X-Masking y Y-Masking están activos a la vez.
- 20201022 -- parche menor que añade soporte de la rueda de ratón al interfaz de
usuario de SDL2 y una opción para elegir en CPCEC y ZXSEC entre conflictos de
escritura de disco estrictos (provocan errores) o relajados (no hacen nada).
- 20201024 -- parche menor que resuelve un problema en el evento
SDL_WINDOWEVENT_EXPOSED, invierte los bits blanco/negro en el visor de gráficos
de ZXSEC y apunta el visor de CPCEC a la RAM en vez de la ROM.
- 20201028 -- parche menor que mejora la emulación de Issue-2 en Spectrum 48K:
"Abu Simbel Profanation" y "Rasputin 48K" funcionan en 48K Issue 2 y fallan en
los demás modelos, como debe ser.
- 20201111 -- parche menor que añade seguimiento del ratón en el interfaz de
SDL2 y hace que la grabación de ficheros XRF consuma menos memoria.
- 20201122 -- parche menor que corrige un cuelgue cuando se usa el interfaz de
SDL2 para guardar un fichero en el directorio raíz, y que detecta
automáticamente SDL2 en tiempo de compilación.
- 20201124 -- parche menor que añade detección de cabeceras AMSDOS al cargador
de perfiles de ROM, según una idea de Sid.
- 20201130 -- parche menor que da más campos a los perfiles de ROM: type, bank,
crtc, fddc.
- 20201212 -- decimonovena versión pública. La versión de Windows puede emplear
DirectDraw en lugar de GDI, y la de SDL2 emplea texturas en lugar de
superficies: la eficiencia sube al disponer de aceleración por hardware. De
todos modos, el parámetro de línea de comando `-!` y la opción de menú "Video:
Software render" sirven para deshabilitar la aceleración por hardware en
sistemas donde o no existe o rinde peor que el software puro. Corrección en CPC:
el registro 14 del PSG es independiente, tal como espera "Gremlins (v1)".
Corrección en Spectrum: los puertos fantasma en 128K ahora están bien emulados,
por fin la demo "Tiratok" toca música. Nuevo comando de debugger "Y": llenar
memoria con byte. XRF enumera los codecs disponibles al arrancarlo sin
parámetros.
- 20201215 -- parche menor que corrige la carga de snapshots de Spectrum Plus3 y
extiende el comportamiento de la "nieve" de la ULA ("Vectron") y su ámbito
("Narco Police", "Robocop 3"). El UI de SDL2 coloca unos puntos suspensivos al
final de los nombres de fichero demasiado largos para caber en los diálogos.
- 20201220 -- parche menor que elimina el debugger de consola, ya obsoleto, de
las fuentes, y hace que la opción de Playcity perdure entre sesiones. "Software
render*" ahora es "Acceleration*", más congruente en su contexto.
- 20210105 -- parche menor que corrige un error en la grabación de vídeo
(convertía el sonido 44KHz estéreo en 88KHz mono) y otro en la lectura de cintas
(problemas con ficheros WAV de 16 y 24 bits), aumenta el soporte de joystick
para aceptar controles angulares (gracias a Pelrun por el código para Win32 y
SDL2), y permite que la emulación de Dandanator modifique el cartucho
(configuración, partidas...) si el usuario lo permite.
- 20210107 -- parche menor que corrige un error en la pantalla dividida del ASIC
(SSSL se comprueba cuando HSYNC sube, no cuando HDISP sube) y un fallo en el
soporte de joystick de Win32, y que hace el CTC de Playcity más reactivo.
- 20210114 -- parche menor que mejora la detección automática de estéreo en
Playcity ("Alcon 2020" solamente usa el chip izquierdo), añade simulación de ROM
a los cartuchos Dandanator ("CPC Soccer") y corrige un bug en la instrucción de
Z80 CPI aparecido en la versión 20210105 (pruebas RAXOFT) y otro en la duración
de VSYNC en CRTC 1 ("Pheelone").
- 20210115 -- parche menor que corrige un error en el PIO de CPC: "Inertie"
manda un valor al puerto A, y luego lee el mismo valor en lugar de recibir un
registro del PSG o bits del teclado.
