
English: 
Hello friends, and welcome to David Programs.
In today's episode I'm going to talk about the project
that has kept me busy in recent weeks:
A full Spectrum emulator,
inside a modified keyboard.
Just connect a VGA monitor,
speakers or headphones,
and USB power;
and we have a Spectrum emulator
which boots in seconds,
and can store up to 50 games
that load instantly.
Open the menu with the F1 key,
choose "load snapshot",
choose a game with cursor keys,
and load it with Enter.
Inside the system there is an Espressif ESP32
dual core microcontroller running at 240 MHz,

Spanish: 
Hola amigos, y bienvenidos a David Programa.
En el episodio de hoy voy a hablar del proyecto
que me ha tenido ocupado las últimas semanas:
Un emulador de Spectrum completo,
en el interior de un teclado modificado.
Sólo hay que conectar un monitor VGA,
altavoces o auriculares,
y alimentación por USB;
y tenemos un emulador de Spectrum
que arranca en segundos,
y puede almacenar hasta 50 juegos
que cargan al instante.
Abrimos el menú con la tecla F1,
elegimos "cargar instantánea",
escogemos un juego con las teclas de cursor,
y lo cargamos con Enter.
El corazón del sistema es un microcontrolador
Espressif ESP32 de dos núcleos a 240 MHz,

Spanish: 
con 4 MB de RAM y 4 MB de almacenamiento flash.
Tiene conectividad WiFi y Bluetooth,
más adelante veremos como conectar
un mando de juegos inalámbrico,
en concreto el mando de la Wii.
En principio, no tiene salidas de vídeo ni audio
ni entradas de periféricos, pero cuenta con un buen
número de pines de entrada/salida de propósito general
que pueden programarse de muchas maneras.
Fabricado por la empresa china Espressif,
es un dispositivo de bajo coste
que puede adquirirse por unos 10 euros.
Cuenta con un puerto micro USB que se puede utilizar
para alimentarlo, o para cargar programas
desde un ordenador PC o Mac.
Para programar el ESP32 tenemos 3 opciones:
- El entorno de desarrollo de Arduino,
intuitivo y fácil de usar.
- El entorno de desarrollo PlatformIO,
que funciona sobre Visual Studio Code.
- Y por último, las herramientas de línea
de comando ESP-IDF
proporcionadas por el fabricante Espressif.
Para este proyecto, lo primero
que necesitamos es una salida de vídeo.

English: 
with 4 MB of RAM and 4 MB of flash storage.
It has WiFi and Bluetooth connectivity,
later we will see how to connect
a wireless game controller,
specifically the Wii remote.
The ESP32 has no explicit video or audio outputs
nor peripheral inputs, but has a lot
of general purpose input / output pins
which can be programmed in many ways.
Manufactured by the Chinese company Espressif,
it is a low cost device
which can be purchased for about 10 euros.
It has a micro USB port that can be used
for powering it, or to load programs
from a PC or Mac computer.
For programming the ESP32, we have 3 options:
- The Arduino development environment,
intuitive and easy to use.
- The PlatformIO development environment,
which works on top of Visual Studio Code.
- And finally, the ESP-IDF command line tools,
provided by the manufacturer Espressif.
For this project, the first
we need is a video output.

Spanish: 
Vamos a utilizar las librerías de vídeo de Bitluni,
un diseñador electrónico y programador
que ha desarrollado librerías para ESP32
que permiten generar señal de vídeo en tiempo real
utilizando uno de los dos núcleos de la CPU.
En este proyecto utilizaré la libreria
que genera señal de vídeo VGA,
que en realidad son cinco señales distintas:
componente roja,
componente verde,
componente azul,
sincronismo horizontal, y
sincronismo vertical.
He preparado un conector VGA hembra
con cables soldados para las cinco señales
y un cable negro para la masa común.
Aquí tengo una ESP32 pinchada en una placa
de desarrollo.
Es tan ancha que sólo me deja libre
una fila de agujeros, así que me las arreglaré
para utilizar solo los pines de un lado de la ESP.
Conecto los 6 cables a los pines correspondientes
según este esquema.
Por suerte, muchos de los pines
se pueden reasignar por software.
Conecto mi VGA hembra al cable VGA que va al monitor,
y conecto la ESP32 por USB al ordenador.

English: 
We are going to use Bitluni's video libraries,
an electronic designer and programmer
who has developed libraries for ESP32
which allow to generate video signal in real time
using one of the two CPU cores.
In this project I will use the library
which generates VGA video signal,
which are actually five different signals:
red component,
green component,
blue component,
horizontal synchronism, and
vertical synchronism.
I have prepared a female VGA connector
with soldered cables for the five signals
and a black wire for the common ground.
Here I have an ESP32 on a prototype board.
It's so wide that it just lets
a row free of holes so I'll manage
to use only the pins on one side of the ESP.
I connect the 6 wires to the corresponding pins
according to this scheme.
Luckily many of the pins
can be reassigned by software.
I connect my VGA female to the VGA cable that goes to the monitor,
and I connect the ESP32 via USB to the computer.

Spanish: 
He modificado una demo de bitluni
para que imprima muchas lineas de "Hola, Mundo!"
y dibuje una carta de barras de color en pantalla.
Pincho el botón "Subir" en el entorno de Arduino,
lo que compila la demo y sube el ejecutable a la ESP.
Después de algunos segundos vemos
el resultado en pantalla.
A continuación voy a conectar
un teclado PS/2 a la ESP
para leer las pulsaciones de teclas.
Lo primero que hago es preparar
un conector PS/2 hembra al que he conectado
unos cables que a su vez conectaré a la ESP.
Los pines que me interesan del conector PS/2 son:
- Alimentación a +5 voltios y masa
- Señal de reloj, y 
- Señal de datos.
La alimentación la conectaremos al pin
de la ESP que proporciona +5 voltios,
pero las señales de reloj y datos
no las podemos conectar directamente,
porque los niveles lógicos de la ESP están a 3.3V,
mientras que los niveles PS/2 están a 5V.

English: 
I have modified a Bitluni demo
to print many lines of "Hello, World!"
and draw a color bar chart on the screen.
I click the "Upload" button in the Arduino environment,
which compiles the demo
and uploads the executable to the ESP.
After a few seconds we see
the result on screen.
Next, I will connect
a PS / 2 keyboard to the ESP
for reading the keystrokes.
The first thing I do is to prepare
a female PS / 2 connector to which I have connected
some cables that I will connect to the ESP.
Interesting pins on the PS / 2 connector are:
- Power supply at +5 volts and ground
- Clock signal, and 
- Data signal.
We will connect the power to the pin
from ESP providing +5 volts,
but clock and data signals
cannot be connected directly,
because the ESP logic levels are 3.3V,
while the PS / 2 levels are 5V.

English: 
We need an adapter circuit called
bidirectional logic level converter.
It consists of a MOSFET transistor and two resistors,
and it is bidirectional because there is communication
both from keyboard to ESP
as from the ESP towards the keyboard.
We will need two copies of the circuit,
one for the clock and one for the data.
Here I have the two circuits mounted
on the prototype board.
As the ESP is so wide I have to pass
some cables below it.
I connect the cables that go to the PS / 2 connector,
and the PS / 2 connector to the keyboard.
I use the PS2KeyAdvanced library by Paul Carpenter,
which on the one hand initializes the keyboard
and on the other it shows the hexadecimal codes
generated by the keyboard
when you press and release keys.
In the serial monitor we can see
the values ​​corresponding to each key.
Some keyboards work without the need for
sending them initialization commands,
but this one in particular does not start sending events
until an echo command is sent to it.
As i do have to use this keyboard anyway,

Spanish: 
Necesitamos un circuito adaptador llamado
convertidor bidireccional de niveles lógicos.
Consta de un transistor MOSFET y dos resistencias,
y es bidireccional porque hay comunicación
tanto del teclado hacia la ESP
como de la ESP hacia el teclado.
Necesitaremos dos copias del circuito,
una para el reloj y otra para los datos.
Aquí tengo los dos circuitos montados
en la placa de prototipo.
Como la ESP es tan ancha tengo que pasar
algunos cables por debajo de ella.
Conecto los cables que van al conector PS/2,
y el conector PS/2 al teclado.
Utilizo la librería PS2KeyAdvanced de Paul Carpenter,
que por un lado inicializa el teclado
y por otro muestra los códigos hexadecimales
generados por el teclado al pulsar y soltar teclas.
En el monitor serie podemos ver
los valores correspondientes a cada tecla.
Algunos teclados funcionan sin necesidad de
enviarles comandos de inicialización,
pero éste en concreto no empieza a enviar eventos
hasta que no se le envía un comando de eco.
Como tengo que utilizar este teclado sí o sí,

English: 
because my purpose is to put the ESP32 inside,
I have to make sure to send that initialization.
Lastly, I am going to use the ESP32Wiimote library,
that allows to read the keypresses
from the Wiimote
which connects via Bluetooth to the ESP32.
With the demo compiled and uploaded, I connect the controller by simultaneously pressing buttons 1 and 2.
We see that the remote has connected when the LEDs
stop flashing and remain steady.
In the serial monitor we can see the different values
produced by different button presses.
In this case, the value is a bit mask,
so each bit corresponds to a button.
In this image we can see the hexadecimal values
for each of the buttons on the remote.
The Spectrum emulator itself
is in a Github repository,
and it is a collaborative effort among many
programmers.
I forked Ramón Martinez and Jorge Fuertes' repository,

Spanish: 
porque mi propósito es meter la ESP32 dentro,
tengo que asegurarme de enviar esa inicialización.
Por último, voy a utilizar la librería ESP32Wiimote,
que permite leer las pulsaciones
del mando de la Wii
que se conecta por Bluetooth a la ESP32.
Con la demo compilada y subida, conecto el mando pulsando simultáneamente los botones 1 y 2.
Vemos que el mando ha conectado cuando los leds
dejan de parpadear y quedan fijos.
En el monitor serie podemos ver los distintos valores
que producen diferentes pulsaciones de botones.
En este caso, el valor es una máscara de bits,
de modo que cada bit corresponde a un botón.
En esta imagen podemos ver los valores hexadecimales
para cada uno de los botones del mando.
El emulador de Spectrum propiamente dicho
se encuentra en un repositorio de Github,
y es un esfuerzo colaborativo entre muchos
programadores.
Yo hice un fork del repositorio de Ramón
Martinez y Jorge Fuertes,

Spanish: 
que a su vez se basaron en el trabajo
de Pete Debenham.
El proyecto integra código de diversos autores,
como el emulador de Z80 de Lin Ke-Fong,
la librería VGA de Bitluni,
el driver de teclado de Michalhol,
y muchas más contribuciones.
Yo, por mi parte, añadí soporte
para el mando de la Wii y la posibilidad
de cargar y grabar instantáneas de juegos,
lo que permite guardar el estado de cualquier juego
que no fue diseñado para ello en su día.
El proyecto se abre con Visual Studio Code
con la extensión PlatformIO, y desde ahí
se puede subir a la ESP32 el ejecutable del emulador
mediante el comando Upload.
Otro comando, Upload File System Image
sube una partición de datos que contendrá
los juegos en formato .SNA que copiemos
al directorio /data/sna del proyecto.
Podemos encontrar miles de juegos de Spectrum
en la web WorldOfSpectrum.net,
pero por lo general no están en formato .SNA,
así que tendremos que convertirlos.

English: 
which in turn based their work on Pete Debenham's.
The project integrates code from various authors,
like Lin Ke-Fong's Z80 emulator,
Bitluni's VGA library,
Michalhol's keyboard driver,
and many more contributions.
What I did was to add support
for the Wii remote and the feature
of loading and recording game snapshots,
allowing to save the state of any game
which was not designed for it back in the day.
The project is opened with Visual Studio Code
with the PlatformIO extension installed,
from there the emulator executable
can be uploaded to the ESP32
using the Upload command.
Another command, Upload File System Image,
uploads a data partition that will contain
the games in .SNA format present
in the project's /data/sna directory.
We can find thousands of Spectrum games
on the WorldOfSpectrum.net website,
but usually they are not in .SNA format,
so we will have to convert them.

Spanish: 
Para ello, podemos usar el emulador FUSE
para cargar un juego en formato .TZX,
y guardarlo como instantánea con la extensión
.SNA.
Si queremos usar el mando de la Wii
tendremos que añadir para cada juego en particular,
un fichero de texto que tendrá
el mismo nombre que el juego,
pero extensión .TXT en lugar de .SNA.
Ese fichero de texto contendrá 16 caracteres,
todo lo que haya después se ignorara.
Los caracteres representan las teclas del
Spectrum,
y sus posiciones dentro del grupo de 16
representan a qué tecla del mando de la Wii
estamos asignando las teclas del Spectrum.
Por ejemplo, en el juego Manic Miner he asignado
izquierda y derecha en la cruceta a las teclas
Q y W, que son izquierda y derecha en el juego;
y la tecla 1 del mando a la tecla Z que es el salto.
Ya tengo el emulador completo funcionando
en la placa de prototipo,
sólo me queda la parte mas laboriosa:
montarlo dentro del teclado.
Lo primero es desmontar el teclado;
este es el espacio que queda disponible

English: 
For this, we can use the FUSE emulator
to load a game in .TZX format,
and save it as a snapshot with .SNA extension.
If we want to use the Wii remote
we will have to add for each particular game,
a text file that will have
the same name as the game,
but .TXT extension instead of .SNA.
That text file will contain 16 characters,
everything after that will be ignored.
The characters represent the Spectrum keys,
and their positions within the group of 16
represent which key on the Wii remote
we are assigning the Spectrum keys to.
For example, in Manic Miner I have assigned
left and right on the D-Pad to the Q and W keys
which are left and right in the game;
and the 1 key of the Wiimote to the Z key which is jump.
I already have the full emulator working
on the prototype board,
I only have the most laborious part left:
mount it inside the keyboard.
The first thing is to disassemble the keyboard;
this is the available space inside it

Spanish: 
en el interior para la ESP, el cableado y los conectores.
Monto un conector hembra USB grande y fácil
de soldar,
conectado a un micro USB macho que va pegado
con super glue,
para conectarle la ESP32 con las patas dobladas
para que quepa.
Sueldo los cables necesarios al conector VGA hembra,
y lo monto en su sitio, asegurándolo con
bridas y super glue.
Preparo el conversor de niveles lógicos,
y lo coloco en posición, asegurando los cables
con bridas y conectándolos a la ESP32.
Este es el resultado final, no es demasiado
limpio
pero funciona, y una vez cerrado no se ven
los cables.
El teclado es muy cómodo de usar,
mucho más que un Spectrum original.
Y eso es todo por hoy, espero que os haya gustado.
Si ha sido así, suscribíos a mi canal.
Os dejo información detallada en la descripción.
Nos vemos en el próximo vídeo.

English: 
for ESP, wiring and connectors.
I mount a large and easy to weld
USB female connector ,
connected to a male micro USB that is attached
with super glue,
for connecting the ESP32
with the leads bent so they fit.
I solder the needed cables
to the female VGA connector,
and put it in place, securing it with
cable ties and super glue.
I prepare the logic level converter,
and I put it in position, securing the cables
with ties and connecting them to ESP32.
This is the final result, it's not too polished
but it works, and once closed,
the cables cannot be seen.
The keyboard is very comfortable to use,
much more than an original Spectrum.
And that's all for today, I hope you liked it.
If so, please subscribe to my channel.
I have left detailed information in the description.
See you in the next video.
