Usando una fuente de texto en IoT

Una de las características de los dispositivos que se usan para IoT es la limitación de recursos que tiene. No tienen un sistema operativo disponible y todo lo que queramos que haga hay que programarlo prácticamente de cero. Eso incluye cosas tan peregrinas como definir las fuentes de texto que se utilizarán para escribir en pantalla. Esto es algo que, generalmente, damos por hecho en cualquier otro sistema que programamos, pero que ofrece la oportunidad de ver un poco mejor cómo funciona la informática por dentro.

En principio las pantallas en las que querramos utilizar estas fuentes (en las que queramos escribir algo) son bastante pequeñas, la que vemos en la siguiente imagen, por ejemplo, es de 128×64 pixels (SSD1306):

¿Cómo hacemos para escribir un caracter en una pantalla de estas características? Quitando los comandos propios de inicialización, limpieza y demás, lo único que hacemos es indicar qué pixel queremos que se ilumine y cual no (si hay interés ya desarrollaremos un poco más en profundidad los comandos que se le mandan) y, para ahorrar ciclos y ancho de banda, hay que enviarle los datos en bytes completos (8 bits) y cada bit representa un pixel que se ilumina o no.

Hay software ya desarrollado para convertir fuentes ttf en código c que se puede usar con ciertas librerías, pero vamos a escoger el camino difícil, supongamos que queremos utilizar los primeros 95 caracteres ASCII empezando por el espacio. Serían estos:

Quitando el 127 que no nos interesa porque no es imprimible, una vez decididos los caracteres que queremos imprimir tenemos que decidir el tamaño que queremos utilizar. En este caso queremos que tengan una altura de 8 pixels y, como van a ser de ancho fijo, tendrán una anchura de 8 pixels igualmente. Un carácter se representaría entonces de esta manera:

Y su representación en bits de la primera fila sería 00011000 o lo que es lo mismo 0x18 en hexadecimal. Esta letra, traducida a bytes quedaría: 0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66,0x66,0x00 y con esta información ya sabríamos qué bytes mandar a la pantalla cuando tuviésemos que escribir la letra.

Hacer este proceso para cada letra sería muy pesado, más teniendo en cuenta que son 95 caracteres, pero como nosotros somos programadores os voy a contar un método para extraer estos datos de una mejor manera. Vamos a generar una imagen y vamos a pintar allí las letras que queremos. Para ello abriremos el programa gráfico favorito que tengamos (el mío es gimp) y crearemos una imagen justo del tamaño para que quepan todas nuestras letras (ni más ni menos). En este caso son 95*8 = 760 y 8 de altura, con el fondo negro.

Una vez creada esa imagen, creamos un texto en la fuente que queramos y escribimos los caracteres que queremos:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Ajustamos para que quepan todos (quitamos alisado y hints varios) y quedará algo así:

Luego cambiamos el tipo de imagen a indexada con 2 colores (solo blanco y negro) y lo exportamos a formato raw:

Esto lo que hace es generarnos un archivo .data que contiene 1 byte por pixel que, como hemos indexado solo contendrá ceros o unos… Y ahora toca programar.

El objetivo es obtener una ristra de bytes juntando los ceros y unos agrupándolos de 8 en ocho. Luego veremos cómo usarlos. Lo más sencillo es hacer un scrip en python, así que escribimos algo así:

def convert_to_hex(byte_data):
    # Agrupamos los datos de 8 en 8
    byte_data = [byte_data[i:i+8] for i in range(0, len(byte_data), 8)]
    # Convertimos cada byte a su representación en hexadecimal
    resu = []
    for i in range(len(byte_data)):
        byte = sum([byte_data[i][j] << j for j in range(8)])
        # Añadimos el valor en hexadecimal a la lista resu
        resu.append(f'0x{byte:02X}')

    return resu

Y ahora solo nos queda leer de un archivo y escribirlo en otro como código c:

def read_binary_file(file_path):
    with open(file_path, 'rb') as file:
        return file.read()

def write_hex_file(hex_data, output_path):
    with open(output_path, 'w') as file:
        # Separamos los valores por comas y ponemos un salto de linea cada 16 valores
        file.write ('static const char font_8x8[] = {\n\t')
        slice_size = 16
        for i in range(0, len(hex_data), slice_size):
            file.write(', '.join(hex_data[i:i+slice_size]))
            file.write(',\n\t')
        file.write('};')

Lo juntamos todo en una función principal pasándole como parámetro el archivo de entrada y el de salida:

def main(input_file, output_file):
    binary_data = read_binary_file(input_file)
    hex_data = convert_to_hex(binary_data)
    write_hex_file(hex_data, output_file)

Y ya podemos ejecutarlo, el resultado sería algo así:

static const char font_8x8[] = {
	0x00, 0x0C, 0x36, 0x36, 0x0C, 0x00, 0x1C, 0x06, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
	0x3E, 0x0C, 0x1E, 0x1E, 0x38, 0x3F, 0x1C, 0x3F, 0x1E, 0x1E, 0x00, 0x00, 0x18, 0x00, 0x06, 0x1E,
	0x3E, 0x0C, 0x3F, 0x3C, 0x1F, 0x7F, 0x7F, 0x3C, 0x33, 0x1E, 0x78, 0x67, 0x0F, 0x63, 0x63, 0x1C,
	0x3F, 0x1E, 0x3F, 0x1E, 0x3F, 0x33, 0x33, 0x63, 0x63, 0x33, 0x7F, 0x1E, 0x03, 0x1E, 0x08, 0x00,
	0x0C, 0x00, 0x07, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x07, 0x0C, 0x30, 0x07, 0x0E, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x07, 0x6E, 0x00,
	0x1E, 0x36, 0x36, 0x3E, 0x63, 0x36, 0x06, 0x0C, 0x0C, 0x66, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x63,
	0x0E, 0x33, 0x33, 0x3C, 0x03, 0x06, 0x33, 0x33, 0x33, 0x0C, 0x0C, 0x0C, 0x00, 0x0C, 0x33, 0x63,
	0x1E, 0x66, 0x66, 0x36, 0x46, 0x46, 0x66, 0x33, 0x0C, 0x30, 0x66, 0x06, 0x77, 0x67, 0x36, 0x66,
	0x33, 0x66, 0x33, 0x2D, 0x33, 0x33, 0x63, 0x63, 0x33, 0x63, 0x06, 0x06, 0x18, 0x1C, 0x00, 0x0C,
	0x00, 0x06, 0x00, 0x30, 0x00, 0x36, 0x00, 0x06, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x0C, 0x3B, 0x00, 0x1E,
	0x36, 0x7F, 0x03, 0x33, 0x1C, 0x03, 0x06, 0x18, 0x3C, 0x0C, 0x00, 0x00, 0x00, 0x18, 0x73, 0x0C,
	0x30, 0x30, 0x36, 0x1F, 0x03, 0x30, 0x33, 0x33, 0x0C, 0x0C, 0x06, 0x3F, 0x18, 0x30, 0x7B, 0x33,
	0x66, 0x03, 0x66, 0x16, 0x16, 0x03, 0x33, 0x0C, 0x30, 0x36, 0x06, 0x7F, 0x6F, 0x63, 0x66, 0x33,
	0x66, 0x07, 0x0C, 0x33, 0x33, 0x63, 0x36, 0x33, 0x31, 0x06, 0x0C, 0x18, 0x36, 0x00, 0x18, 0x1E,
	0x06, 0x1E, 0x30, 0x1E, 0x06, 0x6E, 0x36, 0x0E, 0x30, 0x66, 0x0C, 0x33, 0x1F, 0x1E, 0x3B, 0x6E,
	0x3B, 0x3E, 0x3E, 0x33, 0x33, 0x63, 0x63, 0x33, 0x3F, 0x0C, 0x18, 0x0C, 0x00, 0x00, 0x0C, 0x00,
	0x36, 0x1E, 0x18, 0x6E, 0x00, 0x06, 0x18, 0xFF, 0x3F, 0x00, 0x3F, 0x00, 0x0C, 0x7B, 0x0C, 0x1C,
	0x1C, 0x33, 0x30, 0x1F, 0x18, 0x1E, 0x3E, 0x00, 0x00, 0x03, 0x00, 0x30, 0x18, 0x7B, 0x33, 0x3E,
	0x03, 0x66, 0x1E, 0x1E, 0x03, 0x3F, 0x0C, 0x30, 0x1E, 0x06, 0x7F, 0x7B, 0x63, 0x3E, 0x33, 0x3E,
	0x0E, 0x0C, 0x33, 0x33, 0x6B, 0x1C, 0x1E, 0x18, 0x06, 0x18, 0x18, 0x63, 0x00, 0x00, 0x30, 0x3E,
	0x33, 0x3E, 0x33, 0x0F, 0x33, 0x6E, 0x0C, 0x30, 0x36, 0x0C, 0x7F, 0x33, 0x33, 0x66, 0x33, 0x6E,
	0x03, 0x0C, 0x33, 0x33, 0x6B, 0x36, 0x33, 0x19, 0x07, 0x00, 0x38, 0x00, 0x00, 0x0C, 0x00, 0x7F,
	0x30, 0x0C, 0x3B, 0x00, 0x06, 0x18, 0x3C, 0x0C, 0x00, 0x00, 0x00, 0x06, 0x6F, 0x0C, 0x06, 0x30,
	0x7F, 0x30, 0x33, 0x0C, 0x33, 0x30, 0x00, 0x0C, 0x06, 0x00, 0x18, 0x0C, 0x7B, 0x3F, 0x66, 0x03,
	0x66, 0x16, 0x16, 0x73, 0x33, 0x0C, 0x33, 0x36, 0x46, 0x6B, 0x73, 0x63, 0x06, 0x3B, 0x36, 0x38,
	0x0C, 0x33, 0x33, 0x7F, 0x1C, 0x0C, 0x4C, 0x06, 0x30, 0x18, 0x00, 0x00, 0x00, 0x3E, 0x66, 0x03,
	0x33, 0x3F, 0x06, 0x33, 0x66, 0x0C, 0x30, 0x1E, 0x0C, 0x7F, 0x33, 0x33, 0x66, 0x33, 0x66, 0x1E,
	0x0C, 0x33, 0x33, 0x7F, 0x1C, 0x33, 0x0C, 0x0C, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x36, 0x1F,
	0x66, 0x33, 0x00, 0x0C, 0x0C, 0x66, 0x0C, 0x0C, 0x00, 0x0C, 0x03, 0x67, 0x0C, 0x33, 0x33, 0x30,
	0x33, 0x33, 0x0C, 0x33, 0x18, 0x0C, 0x0C, 0x0C, 0x3F, 0x0C, 0x00, 0x03, 0x33, 0x66, 0x66, 0x36,
	0x46, 0x06, 0x66, 0x33, 0x0C, 0x33, 0x66, 0x66, 0x63, 0x63, 0x36, 0x06, 0x1E, 0x66, 0x33, 0x0C,
	0x33, 0x1E, 0x77, 0x36, 0x0C, 0x66, 0x06, 0x60, 0x18, 0x00, 0x00, 0x00, 0x33, 0x66, 0x33, 0x33,
	0x03, 0x06, 0x3E, 0x66, 0x0C, 0x33, 0x36, 0x0C, 0x6B, 0x33, 0x33, 0x3E, 0x3E, 0x06, 0x30, 0x2C,
	0x33, 0x1E, 0x7F, 0x36, 0x3E, 0x26, 0x0C, 0x18, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x0C, 0x63,
	0x6E, 0x00, 0x18, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x01, 0x3E, 0x3F, 0x3F, 0x1E, 0x78, 0x1E,
	0x1E, 0x0C, 0x1E, 0x0E, 0x0C, 0x06, 0x18, 0x00, 0x06, 0x0C, 0x1E, 0x33, 0x3F, 0x3C, 0x1F, 0x7F,
	0x0F, 0x7C, 0x33, 0x1E, 0x1E, 0x67, 0x7F, 0x63, 0x63, 0x1C, 0x0F, 0x38, 0x67, 0x1E, 0x1E, 0x3F,
	0x0C, 0x63, 0x63, 0x1E, 0x7F, 0x1E, 0x40, 0x1E, 0x00, 0x00, 0x00, 0x6E, 0x3B, 0x1E, 0x6E, 0x1E,
	0x0F, 0x30, 0x67, 0x1E, 0x33, 0x67, 0x1E, 0x63, 0x33, 0x1E, 0x06, 0x30, 0x0F, 0x1F, 0x18, 0x6E,
	0x0C, 0x36, 0x63, 0x30, 0x3F, 0x38, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x1F, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
	};

Y ya estaría… ¿Cómo usaríamos esto en nuestra aplicación IoT? Pues básicamente incluiríamos la cabecera font_8x8.h y cuando necesitásemos localizar un carácter ASCII simplemente tendremos que restarle 32 al caracter, multiplicarlo por el número de caracteres de nuestra fuente (95) y ese sería el primer byte del caracter dentro del array. Como vamos a necesitar todas las líneas del caracter podemos hacer una función que las recupere de esta manera:

char getcharslicefrom8x8font(char c, int rowInChar)
{
    return font_8x8[(c - 32) + (rowInChar)*95];
}

Para escribir una cadena completa en una línea habría que localizar la posición inicial de la línea, recuperar todos los bytes de cada caracter que queramos escribir y mandarlos a esa línea de la pantalla (así explicado simplificadamente).

Tenéis todo el código de la conversión de bitmap a c en este repositorio: https://github.com/yoprogramo/font_to_c

Happy coding!

UPDATE: Ya se puede encontrar la fuente así creada en los repositorios de un par de proyectos muy interesantes: https://github.com/fhoedemakers/pico-infonesPlus/ y https://github.com/fhoedemakers/pico-smsplus

Medio siglo

Hoy (ayer para cuando salga este post) cumplo 50 años, no es que quiera que me felicitéis ni nada, la verdad a mi los cumpleaños solo me sirven para medir el tiempo… Y resulta que llevo medio siglo ya en este mundo. Si miramos un poco atrás, a finales del siglo XIX la esperanza media de vida era de 48 años y menos si nos echamos un poco más para atrás. Así que si yo fuese un habitante de la tierra de hace doscientos años estaría ya al final de mi vida útil.

Esto da que pensar, aunque considero que todavía me quedan muchísimas cosas que hacer y mucho que aportar todavía, quizá este pequeño hito (y el hecho de que Google se haya caído a nivel mundial) me sirvan para recordar un poco cómo han cambiado las cosas desde hace medio siglo hasta ahora. De hecho, simplemente viendo cómo han cambiado mis hábitos ya se puede uno hacer una idea de lo mucho que ha cambiado nuestro entorno en unas pocas décadas.

Lo más importante, para mi, es el hecho de contar con internet. Si, cuando yo estudiaba no había internet, de hecho yo fui uno de los pioneros en tener correo electrónico ya en 1988 (estaba en un grupo de investigación de la facultad) y pasé gran parte de mis estudios en la facultad de informática asistiendo al despliegue cada vez mayor de la red de redes. Hasta la llegada de la web (no confundir con internet, que se tardaron unos añitos en inventar el http, html y los navegadores) cuando querías estar informado de algo tenías que recurrir a la biblioteca (si, con sus fichitas en cartulina y eso), a los documentales de la tele (si, alguno se veía entonces también) o a las revistas especializadas. Tengo que decir que yo no era un gran fan de la biblioteca y sin embargo devoraba las revistas de informática (y hasta conseguí ser el editor de la revista del club de informática de mi facultad.

El problema con internet ha sido que la información que se encuentra se ha vuelto demasiado abundante y muy poco contrastada. Las fake news y el dar pábulo a cualquier cantamañanas ha convertido la mayor y mejor tecnología que el ser humano haya desarrollado hasta el momento en un arma de destrucción masiva. Una pena.

Otra cosa que ha cambiado, y mucho, mis hábitos y los de todo el mundo es la llegada del teléfono móvil. Tuve que esperar a 1996 para tener mi primer teléfono móvil y eso me cambió la vida. Nunca más quedarse tirado en la carretera sin poder avisar a nadie, nunca más no saber dónde esta alguien a quien esperas, etc… Todo ventajas, eso si, el precio de la época no era de lo mejor que te podías encontrar y el GPRS que era lo mejor que podías conseguir en datos tampoco es que fuese demasiado útil para transferir datos, pero nada que un SMS no pudiese arreglar. Después ya vinieron los smartphones, el 3G, el 4G y ahora el 5G… Y todo el mundo con su móvil en el bolsillo enganchado a internet.

Los ordenadores, que me deslumbraron desde que mi padre se compró su primer VIC-20, que él usaba para jugar al ajedrez y que yo programaba con sus 3KB de memoria, se han convertido actualmente en una commodity. No hay evolución real en su arquitectura sino que seguimos la ley de moore, frenada por la avaricia empresarial o la oportunidad comercial. He tenido un commodore VIC20, un amstrad cpc 64, un PC compatible con un NECV20 y todos los siguientes procesadores intel y amd (incluso cyrix), pero al final ya todo se resume en una arquitectura fija donde cambia lo comprimidos que están los elementos y el coste de lo que queramos gastarnos. El formato: portatil, sobremesa, da igual, quien no tiene hoy en día un ordenador se queda sin poder hacer muchas cosas… Pero todo cambiará con la computación cuántica, ¿o no?

En estos años he vivido momentos históricos: la llegada de la democracia, la caída del muro de Berlín, crisis importantes: la burbuja .com, las subprime y ahora la covid-19 (entre otras), donde parece que siempre se avanza para encontrarse un obstáculo mayor. No me puedo quejar de cómo he superado estas crisis, pero lo que si me han ayudado es a averiguar un poco mejor quienes son buenas personas y quienes simplemente están por el interés… Aunque últimamente casi empiezo a pensar que merecemos la extinción como especie por nuestra cerrazón.

He sido aficionado a pocas cosas, una de ellas – la fotografía – ha cambiado demasiado para mi gusto. Estuve muchos años con una cámara reflex completamente manual (una Zenit 12) con un objetivo de 45mm aprovechando cada foto (revelarlas era caro de narices), cuando tuve un poco de dinero me compré una DSLR Nikon D15 que me dió muchísimas satisfacciones hasta que me cargué la película reflectante del visor intentando limpiarla; pero con el advenimiento de las cámaras mejores y el almacenamiento casi ilimitado de fotografías digitales ya no me merece la pena sacar la D90 por la que la sustituí y me tengo que conformar con hacer los miles de fotos que todo el mundo saca con su móvil en la mano. Ahora parece que solo usan cámaras «profesionales» los youtubers o instragrammers que, aunque no tienen ni idea de hacer fotografía, a base de captar adeptos han conseguido un material que saca las mejores imágenes por ellos.

En fin, no sabemos lo que nos deparará el futuro y solo nos queda aferrarnos a las cosas que nos ofrecen algo, un sentimiento, una evocación, una posibilidad de desarrollo y no soltarla hasta que encontremos otra que lo supere… Así que, ¡vamos a por el otro medio siglo!

Run ZX 2018: encuentro con el pasado y presente, de la microinformática de 8 bits

Me he permitido la osadía de copiar el título del post de la información que ponían a nuestra disposición los organizadores del evento Run ZX 2018, pero es que es la mejor manera de definir este tipo de eventos. Ayer estuve, junto con mi hijo en este evento de retroinformática dedicado al ZX Spectrum (y todos los trastos invención de Sir Clive Sinclair) y, la verdad, lo disfruté un montón, ¡muchas gracias chicos!

En principio mi único objetivo era intentar interesar a mi hijo en la programación, yendo al taller de creación de videojuegos con scratch, que estuvo muy bien, pero se quedó corto (otra horita más le hubiese venido al pelo).

Allí estábamos varios padres con sus hijos (la mayoría de mi edad o similar) y otros interesados en esto de hacer juegos retro… Todo muy ameno y con una dificultad muy asequible, aunque, como digo, se quedó corto y luego me quedé un rato al medio día terminando el juego con mi hijo (al menos en lo de generar interés estuvo bien).

La sección de charlas me la perdí, pero el programa era muy interesante (si eres tan «nostálgico» como yo) y la exposición tenía piezas muy interesantes, no solo de los ordenadores ZX que ya conocía (incluso tengo alguno) sino de los aparatos previos de Sinclair (radio en miniatura, calculadoras, etc.) y, además, una impresionante colección de carátulas del difunto Azpiri todas ellas muy impresionantes.

La segunda parte, dedicada a crear un juego conversacional con el parser DAAD que duró el doble de horas se volvió a quedar muy, muy corta, en parte por que era la primera vez que se daba y había herramientas muy beta que no se habían probado adecuadamente y, en parte, porque es un tema muy árduo de contar en tan poco tiempo. Conseguimos compilar la aventura de ejemplo (que no es poco) y nos tuvimos que ir.

Pero, en suma, yo disfruté como un enano, reviviendo mis tiempos mozos y disfrutando la experiencia con mi hijo que, en el fondo, supongo que empezaría a descubrir las razones por las que su padre compra cosas tan viejas de vez en cuando.

Gracias de nuevo, espero que haya muchos más.

Año nuevo, consola vieja

Bueno, en realidad no es una «consola» son muuuchas consolas en una. Ya os conté anteriormente como había construido mi mini máquina aracade.Esta vez, viendo que se habían vuelto a poner de moda las versiones «mini» de las consolas retro (que, por cierto, estoy intentando coleccionar) decidí construirme la mía… No sería mucho más barato, pero si que tendría el control de todo lo que metería en la misma. Este es el resultado:

Estuve tentado de imprimir también la carcasa en 3D con mi impresora.. Pero sabía que el resultado iba a ser peor y quería algo que fuese, como mínimo, familiar. La consola es capaz de ejecutar juegos de NES, SNES, Megadrive, Master system, PSX, Neo Geo, Game Boy, GBA, Game Gear y Arcades… Además, he incluido que se puedan ejecutar programas del CPC 464 y de C64 y VIC-20… Vamos, todo lo que puede dar de si una Raspberry Pi 3.

Así que aquí os dejo la lista de «ingredientes» para que los vayáis preparando:

También se puede hacer con una SD de 8Gb, pero entonces podrás meter menos juegos. El resto de lo necesario supongo que ya lo tenéis (cable HDMI,cargador y cable de móvil microusb)

Cuando las tengáis continuamos… No quiero que nos precipitemos… Así tenemos proyecto para el año nuevo.

Por cierto… ¡Feliz 2018!

Retroinformática… La nostalgia del viejo informático

Hoy estreno una nueva sección, bueno, no una sección, porque no tengo de eso, pero si una nueva etiqueta que añadir a las que ya tiene este blog: «retroinformática». Para todos aquellos de vosotros que no sepáis de qué va la cosa, os lo resumo muy fácil: «deleitarse con la historia y los viejos cacharros informáticos».

En una entrada anterior (la de la pantalla de cartón) ya describía como construir una pantalla para un ordenador completamente obsoleto y en la entrada de la máquina arcade os mostraba cómo montarte una máquina de videojuegos «retro» en casa. Así que algunas pistas ya teníais.

Hoy os voy a contar algo un poco más prosaico, cómo conseguir ejecutar cualquier programa en un CPC 6128 sin tener necesidad de tenerlo grabado en un disco de 3″ a la vieja usanza… Eso si, nada te impide seguir coleccionando los discos si quieres.

El cacharro que hay que comprar (si, hay que comprarlo, se podría construir con los esquemas, pero es demasiada complicación por el momento y tenemos un amable polaco que nos lo hace por una cantidad de dinero muy razonable):

img_0569Lo conseguí aquí: http://www.sellmyretro.com/offer/details/Amstrad-CPC-6128-USB-floppy-emulator-11507?lang=es_ES

El proceso, tal como indica en su página, es bastante sencillo.

Para alimentar el aparato se necesitan 5V, con un conector similar al que tiene de entrada el CPC6128 (y el 464), inicialmente utilicé un cargador que tenía por ahí y posteriormente simplemente me construí otro conector que salía de la fuente de alimentación del monitor y así tenía menos cables por el medio. Una vez todo montado luce así:

img_0571Solo quedaba un problema, y es convertir los dsk a hfe (el formato que utiliza este firmware). Para la gente que tiene windows o mac no hay problema, hay una versión compilada para ellos aquí…. Para los que no (yo uso ubuntu) te tienes que descargar las fuentes de aqui: http://sourceforge.net/p/hxcfloppyemu/code/HEAD/tree/ y compilarlo, lo que te dejará tres archivos:

hxcfe, libusbhxcfe.so y libhxcfe.so

Dado que no lo explican en ningún sitio, yo he creado un script para convertir dsk a hfe y es este:


#!/bin/bash
HFE=`echo $1 | sed s/dsk/hfe/g`
echo "Convirtiendo $1 en $HFE"
hxcfe -finput:$1 -foutput:$HFE -conv

Una vez convertidos y puestos en su sitio los .hfe podemos usarlo de la siguiente manera:

img_0572

Y podemos ver la lista de todos los directorios hasta que lleguemos al que queremos que sea nuestro disco virtual para luego ejecutarlo:

img_0573

Y con esto y un bizcocho…. Me voy a jugar con mis viejos juegos…