﻿# 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 ##

CPCEC requiere un sistema operativo Microsoft Windows 2000 o posterior. 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: el ejecutable propiamente dicho
CPCEC.EXE y los ficheros de firmware CPC464.ROM, CPC664.ROM, CPC6128.ROM y
CPCADOS.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 y
TCC 0.9.27 funcionan correctamente; GCC 4.7.1 comete fallos graves en la
compilación y genera 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 -xc cpcec.c -luser32 -lgdi32 -lwinmm
-lcomdlg32 -lshell32 -ocpcec.exe

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

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.

## 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.

* -C : emular un monitor verde en lugar de (por defecto) uno a todo color;
* -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);
* -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);
* -! : ocultar el menú y controlar la emulación exclusivamente por teclado.

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 tres 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.

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.

## Teclas de función ##

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, tanto como un fichero ROM como un
cartucho de formato CPR;
* F5+Control: reiniciar la emulación;
* 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;
* 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+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.

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 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 recorrer los contenidos de la cinta actual.

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;
* 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 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;
* 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 ("toggle") crea o destruye un breakpoint en la posición actual del cursor en
el desensamblado;
* U ("return") reanuda la emulación hasta alcanzar la dirección de regreso de la
llamada en curso;
* V cambia la apariencia del debugger, cambiando los colores blanco y negro y
los caracteres finos y gruesos;
* X conmuta el panel de información de hardware clásico/Plus;
* 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.

## 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.
