From 5fb760200681acd32fad40fcb73b8b3d94009d4f Mon Sep 17 00:00:00 2001 From: jdg Date: Sun, 12 Sep 2021 19:48:58 +0200 Subject: [PATCH] First commit 22/02/1998 --- LEDS.CPP | 549 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ LEDS.EXE | Bin 0 -> 18110 bytes LEDS.FNT | Bin 0 -> 4096 bytes LEDS2.FNT | Bin 0 -> 4096 bytes README.md | 9 + 5 files changed, 558 insertions(+) create mode 100644 LEDS.CPP create mode 100644 LEDS.EXE create mode 100644 LEDS.FNT create mode 100644 LEDS2.FNT create mode 100644 README.md diff --git a/LEDS.CPP b/LEDS.CPP new file mode 100644 index 0000000..c461454 --- /dev/null +++ b/LEDS.CPP @@ -0,0 +1,549 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "alum_def.h" +//extern void Error( int code, char *MensajeError ); + + +char *ptr_char; + +char *VidRam = (char *)MK_FP( 0xA000, 0); +void far PutPixel(unsigned int x, unsigned int y, int c_elec ); + +typedef struct + { + int x, y; + char ndigitos; + char AX, AY; + char C1, C2, C3; + } p_graphics; + +typedef struct + { + int x, y; // Coordenadas iniciales de muestreo + char ndigitos; // n£mero de digitos a mostrar + char AX, AY; // factor de espaciado + char C1, C2, C3; // colores de fondo, texto, borde + + // Datos privados y uso interno exclusivamente + unsigned int Flen; // longitud de la frase actual + char BitByte; // bit del byte por el que va en el recorrido + char currByte; // byte actual dentro de la frase + + } p_Ampliada; + +int Numero_Digital( long numero, p_graphics *ND ); +void Fuente_Amplia( char *Frase, p_graphics *FA ); + + + /**************************************************************************\ +|* *| +|* Numero_Digital *| +|* *| +|* Descripcion: *| +|* Muestra un numero, con forma digital en pantalla, *| +|* escalandolo seg£n los factores indicados en p_graphics *| +|* ( 9 digitos como m ximo ) *| +|* *| +|* Entradas: *| +|* N£mero y estructura de muestreo *| +|* *| +|* Salidas: (ninguna) *| +|* *| + \**************************************************************************/ +/* +int Numero_Digital( long numero, p_graphics *ND ) +{ +// Son 9 digitos VARIABLES +// 0 +// _________ _________ _________ _________ _________ _________ _________ +// |\______ /| |\______ /| |\______ /| |\______ /| |\______ /| |\______ /| |\______ /| +// | | | | | | | | | | | | | | | | | | | | | | | | | | | | +//3 | | 1 | | 5 | | | | | | | | | | | | | | | | | | | | | | | | +// | /-----\ | | /-----\ | | /-----\ | | /-----\ | | /-----\ | | /-----\ | | /-----\ | +// | \-----/ | | \-----/ | | \-----/ | | \-----/ | | \-----/ | | \-----/ | | \-----/ | +//4 | | | | 6 | | | | | | | | | | | | | | | | | | | | | | | | +// | |_____| | | |_____| | | |_____| | | |_____| | | |_____| | | |_____| | | |_____| | +// |/_______\| |/_______\| |/_______\| |/_______\| |/_______\| |/_______\| |/_______\| +// 2 + + static char dnumero[9] = { -1, -1, -1, -1, -1, -1, -1, -1, -1 }; + static char Dn[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + static char vez = 0; + static p_graphics ND1; + + char dnum=0, i, j, digital; + int punto[10]; + int CONST = 0; + char DnTmp[2]; + char signo = 0; + static old_signo = 0; + + + // Si ha cambiado la posicion, el n§ de digitos, o el factor de escala + // habr  que recalcularlo todo. + if ( + ND1.x != ND -> x || ND1.y != ND -> y || + ND1.ndigitos != ND -> ndigitos || + ND1.AX != ND -> AX || ND1.AY != ND -> AY + ) + { + dnumero[0] = -1; dnumero[1] = -1; dnumero[2] = -1; + dnumero[3] = -1; dnumero[4] = -1; dnumero[5] = -1; + dnumero[6] = -1; dnumero[7] = -1; dnumero[8] = -1; + + Dn[0] = 0; Dn[1] = 0; Dn[2] = 0; + Dn[3] = 0; Dn[4] = 0; Dn[5] = 0; + Dn[6] = 0; Dn[7] = 0; Dn[8] = 0; + + //ndigitos1 = ndigitos; + ND1 = *ND; + vez = 0; + } + + // Miramos el signo del n£mero + if ( numero < 0 ) + { + numero *= -1; + signo = 1; + } + + if ( signo != old_signo ) vez = 0; + + setcolor(ND -> C3); + + // Miro todas las cifras que componen el n£mero + for( i=0; i < ND -> ndigitos; i++ ) + { + dnum = numero % 10; + digital = numero; + numero /= 10; + + // Si el n£mero pintado con anterioridad es distinto al actual, lo dibujamos + if ( dnumero[ ND -> ndigitos - 1 - i] != dnum || digital == 0 || vez == 0 ) + { + // digital = dnumero[5 - i]; + dnumero[ND -> ndigitos - 1 - i] = dnum; + //////// Esta parte del c¢digo imprime el digito en pantalla + CONST = 12*ND -> AX*(ND -> ndigitos - 1 - i); + DnTmp[1] = Dn[ND -> ndigitos - 1 -i]; + + // Antes de nada, eliminamos los cero a la izquierda + if ( digital == 0 && i != 0 ) { Dn[ND -> ndigitos - 1 -i] = 0; dnumero[ND -> ndigitos - 1 - i] = -1; } else + switch( dnum ) + { + case 0: + Dn[ND -> ndigitos - 1 -i] = 0x7D; // 0111 1101 + break; + case 1: + Dn[ND -> ndigitos - 1 -i] = 0x60; // 0110 0000 + break; + case 2: + Dn[ND -> ndigitos - 1 -i] = 0x37; // 0011 0111 + break; + case 3: + Dn[ND -> ndigitos - 1 -i] = 0x67; // 0110 0111 + break; + case 4: + Dn[ND -> ndigitos - 1 -i] = 0x6A; // 0110 1010 + break; + case 5: + Dn[ND -> ndigitos - 1 -i] = 0x4F; // 0100 1111 + break; + case 6: + Dn[ND -> ndigitos - 1 -i] = 0x5F; // 0101 1111 + break; + case 7: + Dn[ND -> ndigitos - 1 -i] = 0x61; // 0110 0001 + break; + case 8: + Dn[ND -> ndigitos - 1 -i] = 0x7F; // 0111 1111 + break; + case 9: + Dn[ND -> ndigitos - 1 -i] = 0x6F; // 0110 1111 + break; + } + + DnTmp[0] = Dn[ND -> ndigitos - 1 -i]; + for( j=0; j<7; j++ ) + { + if ( DnTmp[1]%2 != DnTmp[0]%2 || vez == 0 ) + { + if ( DnTmp[0]%2 ) + setfillstyle(SOLID_FILL, ND -> C1); + else + setfillstyle(SOLID_FILL, ND -> C2); + + switch( j ) + { + case 0: + punto[0] = 0*ND -> AX + CONST + ND -> x; punto[1] = 0*ND -> AY + ND -> y; + punto[2] = 10*ND -> AX + CONST + ND -> x; punto[3] = 0*ND -> AY + ND -> y; + punto[4] = 8*ND -> AX + CONST + ND -> x; punto[5] = 2*ND -> AY + ND -> y; + punto[6] = 2*ND -> AX + CONST + ND -> x; punto[7] = 2*ND -> AY + ND -> y; + punto[8] = 0*ND -> AX + CONST + ND -> x; punto[9] = 0*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + case 3: + punto[0] = 0*ND -> AX + CONST + ND -> x; punto[1] = 0*ND -> AY + ND -> y; + punto[2] = 2*ND -> AX + CONST + ND -> x; punto[3] = 2*ND -> AY + ND -> y; + punto[4] = 2*ND -> AX + CONST + ND -> x; punto[5] = 9*ND -> AY + ND -> y; + punto[6] = 1*ND -> AX + CONST + ND -> x; punto[7] = 10*ND -> AY + ND -> y; + punto[8] = 0*ND -> AX + CONST + ND -> x; punto[9] = 9*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + case 5: + punto[0] = 10*ND -> AX + CONST + ND -> x; punto[1] = 0*ND -> AY + ND -> y; + punto[2] = 10*ND -> AX + CONST + ND -> x; punto[3] = 9*ND -> AY + ND -> y; + punto[4] = 9*ND -> AX + CONST + ND -> x; punto[5] = 10*ND -> AY + ND -> y; + punto[6] = 8*ND -> AX + CONST + ND -> x; punto[7] = 9*ND -> AY + ND -> y; + punto[8] = 8*ND -> AX + CONST + ND -> x; punto[9] = 2*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + case 1: + int punto1[12]; + punto1[0] = 1*ND -> AX + CONST + ND -> x; punto1[1] = 10*ND -> AY + ND -> y; + punto1[2] = 2*ND -> AX + CONST + ND -> x; punto1[3] = 9*ND -> AY + ND -> y; + punto1[4] = 8*ND -> AX + CONST + ND -> x; punto1[5] = 9*ND -> AY + ND -> y; + punto1[6] = 9*ND -> AX + CONST + ND -> x; punto1[7] = 10*ND -> AY + ND -> y; + punto1[8] = 8*ND -> AX + CONST + ND -> x; punto1[9] = 11*ND -> AY + ND -> y; + punto1[10] = 2*ND -> AX + CONST + ND -> x; punto1[11] = 11*ND -> AY +ND -> y; + fillpoly( 6, punto1 ); + break; + case 4: + punto[0] = 1*ND -> AX + CONST + ND -> x; punto[1] = 10*ND -> AY + ND -> y; + punto[2] = 2*ND -> AX + CONST + ND -> x; punto[3] = 11*ND -> AY + ND -> y; + punto[4] = 2*ND -> AX + CONST + ND -> x; punto[5] = 18*ND -> AY + ND -> y; + punto[6] = 0*ND -> AX + CONST + ND -> x; punto[7] = 20*ND -> AY + ND -> y; + punto[8] = 0*ND -> AX + CONST + ND -> x; punto[9] = 11*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + case 6: + punto[0] = 9*ND -> AX + CONST + ND -> x; punto[1] = 10*ND -> AY + ND -> y; + punto[2] = 10*ND -> AX + CONST + ND -> x; punto[3] = 11*ND -> AY + ND -> y; + punto[4] = 10*ND -> AX + CONST + ND -> x; punto[5] = 20*ND -> AY + ND -> y; + punto[6] = 8*ND -> AX + CONST + ND -> x; punto[7] = 18*ND -> AY + ND -> y; + punto[8] = 8*ND -> AX + CONST + ND -> x; punto[9] = 11*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + case 2: + punto[0] = 2*ND -> AX + CONST + ND -> x; punto[1] = 18*ND -> AY + ND -> y; + punto[2] = 8*ND -> AX + CONST + ND -> x; punto[3] = 18*ND -> AY + ND -> y; + punto[4] = 10*ND -> AX + CONST + ND -> x; punto[5] = 20*ND -> AY + ND -> y; + punto[6] = 0*ND -> AX + CONST + ND -> x; punto[7] = 20*ND -> AY + ND -> y; + punto[8] = 2*ND -> AX + CONST + ND -> x; punto[9] = 18*ND -> AY + ND -> y; + fillpoly( 5, punto ); + break; + default: + break; + } + } + DnTmp[0] /= 2; + DnTmp[1] /= 2; + } + } + } + + if ( signo != old_signo ) + { + + if ( (old_signo = signo) == 1 ) + { + setfillstyle(SOLID_FILL, ND -> C1); + + int punto1[12]; + punto1[0] = 1*ND -> AX + ND -> x; punto1[1] = 10*ND -> AY + ND -> y; + punto1[2] = 2*ND -> AX + ND -> x; punto1[3] = 9*ND -> AY + ND -> y; + punto1[4] = 8*ND -> AX + ND -> x; punto1[5] = 9*ND -> AY + ND -> y; + punto1[6] = 9*ND -> AX + ND -> x; punto1[7] = 10*ND -> AY + ND -> y; + punto1[8] = 8*ND -> AX + ND -> x; punto1[9] = 11*ND -> AY + ND -> y; + punto1[10] = 2*ND -> AX + ND -> x; punto1[11] = 11*ND -> AY +ND -> y; + fillpoly( 6, punto1 ); + } + } + + vez = 1; + return 0; +} +*/ + + +//////////////////////////////////////////////////////////////////////////////////// +void far PutPixel(unsigned int x, unsigned int y, int c_elec ) +{ + if ( x < 320 && y < 200 ) + *(VidRam + (x + y*320) ) = c_elec; +} + + +void LeeFuentes(char *file) +{ +FILE *fich; + /* Reservamos 4 Kb. para cargar la fuente en memoria */ + + /* Abrimos el fichero de la fuente */ + + if ((fich=fopen(file,"rb"))==NULL) { + printf("\a\nArchivo %s no encontrado.\n",file); +// Error(0, "No se encuentra el archivo de fuentes"); + } + + fseek(fich, SEEK_SET, 0); /* Nos colocamos al principio del fichero */ + fread(ptr_char,1,4096,fich); /* Cargamos en memoria 4096 bytes del fichero */ + fclose(fich); /* Cerramos el fichero */ +} + + + + + + /* + + +#define TAMx 8 +#define TAMy 8 +void Fuente_Amplia( char *Frase, p_Ampliada far *FA ) +{ + int i, j, k; // Variables de avance + int c_elec; // Color en el momento de imprimir + int PosX, PosY; // Posicion fisica final + char LCaract; // Caracter de linea a tratar + + if ( FA->Flen != _fstrlen( Frase ) ) // Reseteamos las variables de control interno + { + // Obtenemos la longitud de la frase. ( En d¡gitos ) + FA -> Flen = _fstrlen( Frase ); + // Contador de digito actual a cero + FA -> BitByte = 0; + // Posicion dentro de la frase + FA -> currByte = 0; + } + + // Avance horizontal de bit's ( avance de digitos ) + for ( i = 0; i < ( TAMx * (FA -> ndigitos) ); i++ ) + { + k = ( (unsigned char)Frase[ ( (i+FA->BitByte)/TAMx + FA -> currByte ) % FA->Flen ] ) << 4; + LCaract = ( (char)0x01 << (7 - (i+FA->BitByte)%TAMx) ); + PosX = FA -> x + FA->AX * i; // Posicion f¡sica horizontal + // Avance vertical de bit's + for ( j = 0; j < TAMy; j ++ ) + { + PosY = FA -> y + FA->AY * j; // Posicion f¡sica vertical + + if ( ptr_char[ k + j ] & LCaract ) + c_elec = FA->C2; + else + c_elec = FA->C1; + + putpixel ( PosX, PosY, c_elec ); + } + } + // Tenemos en cuenta el avance dentro de la frase + if ( ( FA -> BitByte ++ ) >= 7 ) + { + FA -> BitByte = 0; FA -> currByte ++; + if ( FA -> currByte >= FA -> Flen ) + FA -> currByte = 0; + } + +} + +#undef TAMy +#undef TAMx +*/ + +#define TAMx 8 +#define TAMy 16 +void Fuente_Amplia3( char *Frase, p_Ampliada far *FA ) +{ + int i, j, k; // Variables de avance + int c_elec; // Color en el momento de imprimir + int PosX, PosY; // Posicion fisica final + char LCaract; // Caracter de linea a tratar + + if ( FA->Flen != _fstrlen( Frase ) ) // Reseteamos las variables de control interno + { + // Obtenemos la longitud de la frase. ( En d¡gitos ) + FA -> Flen = _fstrlen( Frase ); + // Contador de digito actual a cero + FA -> BitByte = 0; + // Posicion dentro de la frase + FA -> currByte = 0; + } + + // Avance horizontal de bit's ( avance de digitos ) + for ( i = 0; i < ( TAMx * (FA -> ndigitos) ); i++ ) + { + k = ( (unsigned char)Frase[ ( (i+FA->BitByte)/TAMx + FA -> currByte ) % FA->Flen ] ) << 4; + LCaract = ( (char)0x01 << (7 - (i+FA->BitByte)%TAMx) ); + PosX = FA -> x + FA->AX * i; // Posicion f¡sica horizontal + // Avance vertical de bit's + for ( j = 0; j < TAMy; j ++ ) + { + PosY = FA -> y + FA->AY * j; // Posicion f¡sica vertical + + if ( ptr_char[ k + j ] & LCaract ) + c_elec = FA->C2; + else + c_elec = FA->C1; + + PutPixel ( PosX, PosY, c_elec ); + } + } + // Tenemos en cuenta el avance dentro de la frase + if ( ( FA -> BitByte ++ ) >= 7 ) + { + FA -> BitByte = 0; FA -> currByte ++; + if ( FA -> currByte >= FA -> Flen ) + FA -> currByte = 0; + } + +} +#undef TAMy +#undef TAMx + +/////ÜÜ///////////////////////////////////////////////////////////////////////////// +////Û///////////////////////////////////////////////////////////////////////////////// +/////ßÜ/////Ü/////////////////////////////////////////////////////////////////////// +//////ß///Ü////ß/Ü////////////////////////////////////////////////////////////////// +///////ß/Ü///Ü////////////////////////////////////////////////////////////////////// +////////Ü//ß////ß/////////////////////////////////////////////////////////////////// +/////////ß////Ü///////////////////////////////////////////////////////////////////// +///////////ß//////////////////////////////////////////////////////////////////////// +#define TAMx 8 +#define TAMy 7//16 +void FuenteAmplia( char *Frase, p_Ampliada far *FA ) +{ + int i, j, k; // Variables de avance + int c_elec; // Color en el momento de imprimir + int PosX, PosY; // Posicion fisica final + int LCaract; // Caracter de linea a tratar + + if ( FA->C3 == -1 || FA->Flen != _fstrlen( Frase ) ) // Reseteamos las variables de control interno + { + // Obtenemos la longitud de la frase. ( En d¡gitos ) + FA -> Flen = _fstrlen( Frase ); + // Contador de digito actual a cero + FA -> BitByte = 0; + // Posicion dentro de la frase + FA -> currByte = 0; + } + + // Avance horizontal de bit's ( avance de digitos ) + for ( i = 0; i < ( TAMx * (FA -> ndigitos) ); i++ ) + { + k = ( (unsigned char)Frase[ ( (i+FA->BitByte)/TAMx + FA -> currByte ) % FA->Flen ] ) << 4; + LCaract = ( (char)0x01 << (7 - (i+FA->BitByte)%TAMx) ); + PosX = FA -> x + FA->AX * i; // Posicion f¡sica horizontal + // Avance vertical de bit's + for ( j = 0; j < TAMy; j ++ ) + { + PosY = FA -> y + FA->AY * j; // Posicion f¡sica vertical + + if ( ptr_char[ k + j ] & LCaract ) + c_elec = FA->C2; + else + c_elec = FA->C1; + + PutPixel ( PosX, PosY, c_elec ); + } + } + // Tenemos en cuenta el avance dentro de la frase + if ( ( FA -> BitByte ++ ) >= 7 ) + { + FA -> BitByte = 0; FA -> currByte ++; + if ( FA -> currByte >= FA -> Flen ) + FA -> currByte = 0; + } + +} +#undef TAMy +#undef TAMx + + + +void main(void) +{ + p_Ampliada P; + int ok = 0; + unsigned delayT; + + P.x = P.y = 0; + P.ndigitos = 1; + P.AX = P.AY = 1; + P.C1 = EGA_DARKGRAY; + P.C2 = EGA_RED; + + if ( ( ptr_char = new char [4096] ) == NULL ) + return; + + // Cambiamos a 320x200 + asm mov al, 0x13 + asm mov ah, 0x00 + asm int 0x10 + + + LeeFuentes("leds.fnt"); + + ok = 0; + delayT = 1; + while( !ok ) + { + if ( kbhit() ) + { + switch( getch() ) + { + case 0: + switch( getch() ) + { + case 75: + P.AX--; if ( P.AX < 1 ) P.AX = 1; + break; + case 77: + P.AX++; if ( P.AX > 40 ) P.AX = 40; + break; + case 72: + P.AY--; if ( P.AY < 1 ) P.AY = 1; + break; + case 80: + P.AY++; if ( P.AY > 40 ) P.AY = 40; + break; + } + break; + case '1': + P.ndigitos--; if ( P.ndigitos < 1 ) P.ndigitos = 1; + break; + case '2': + P.ndigitos++; if ( P.ndigitos > 40 ) P.ndigitos = 40; + break; + case '3': + delayT--; if ( delayT < 1 ) delayT = 1; + break; + case '4': + delayT++; if ( delayT > 40 ) delayT = 40; + break; + case 27: + ok = 1; + break; + } + memset( VidRam, 0, 64000 ); + } + FuenteAmplia( "Esto es una prueba para ver la relaci¢n del texto y el tama¤o de la muestra", &P ); + delay(delayT); + }; + + // Volvemos al modo texto + asm mov al, 0x03 + asm mov ah, 0x00 + asm int 0x10 + + delete [] ptr_char; + +} \ No newline at end of file diff --git a/LEDS.EXE b/LEDS.EXE new file mode 100644 index 0000000000000000000000000000000000000000..a3dae629a45cebfe239867deacbbc77aef982066 GIT binary patch literal 18110 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 literal 0 HcmV?d00001 diff --git a/LEDS.FNT b/LEDS.FNT new file mode 100644 index 0000000000000000000000000000000000000000..f0b651ec1fb8d9f4a8929902628ad1ee161d841c GIT binary patch literal 4096 zcmZuzy=xpt6dx%NIpl44P5LM+5pQfE|2TO7N2Gq>~R&5^efv%mM=yziMk#%#)- z|Ni{V(eq4mv-({dr^U<*QVR!ZAQe)r;4KsoGv(G=N z^5=61&?Zhdu(>S+L^iCuV0|)1l{7y-y*xAH$wwT>m`DmYhzc9Kq`j>$E-LpH+M7>G zm&$`^Qj&3H^8x}O@gyLmasa98kI(h4#gT0bV!H{mjn$&9r+gM572-!wlx zJ)I;d=MccWC=kzuNQE#4Ljm(f&Sx3Jd5BBYubw|Ga=HIl^bx~Z26x6E zOdpVm=aviQB=tTMaT1F&+ciNH zoB$G_iq9NqcCsg^n5hd7?Rh-q{GN{(`~#W$PGQo2#-RU|xjzBNc8g#;sSh0HU-`FY zo?4vGI5+bN&6eK`^e=^=f_RU%PIBcy3T3yK2)a)1V_a+7`!nCy?apt?-`;s~{W=Cpdf zmV>a>X^+~S$A||#_{9Z}W?UTpe06Z}LPNIhIHBi7h-H82fd_2WSM{Id2iS^#oUE0S zp$(3+mHh1Ou{nSX>t^5<)tPI3_yqu;C-Xt6$K$b)!OxYIl@*E~{5Aag&X)%tYM#Ph z{bnve__)#eU^lwMSHtcNtSOkX!-Jf zEm!MpAN8B~?(2NidY^CU{c7Ffw*1O`uavxIS4;a*zma47O7F_(t9WW-ud##rdcTfe zVHiWp-{vO9tMhC077NL@;cqSNM|+ES{N?&C_Y3P+FOiN0Ec=H0j@RDKG{@OLJUkp}1Z!t7_+Fcn?9>B7 zdCTc) zdAsc+4tEqGW|?{rJ5JwmSRb+HtT`URfSfgg*RNf3V1pq*L-^_;Nn=DFy>{UbrO~Sh n-ZK24a|rqmDs9x1 literal 0 HcmV?d00001 diff --git a/LEDS2.FNT b/LEDS2.FNT new file mode 100644 index 0000000000000000000000000000000000000000..d88e1cdcc448ec2c84fcbb79df1d1db5907ee5f5 GIT binary patch literal 4096 zcmZu!Pm9}D5PzhglW?{-(U{Gpha5#0Hlm0%gnorydJ>zW<{-+RTtkJDz2pn@((S#M zeuseBEsq?;_GS!r&7SN_2n&Uc4@T~9{=6s2WNb^CH}mHIjGm1-gzECo%gc9HmzR}L zs{LZWzuD~fiW^fjfHFC9JCBmGi$-a>*=(+&ROwM#VRPhhEQ2Ky>Yib9Lkb9ZHO*hV z$Ynb(-dw$VcXgxm!~b6(IVZX z3*~<^y}REw+xxre8zw&r2FGX3+3_HFr0gj~M^WW0CUpRVFT?A_V)5$}0!B-lC55#` z653K2_(~xY6yZ>L5>UmlrgWlq^kFp$n^39D6K72p3pZb<0F}=8v!W@Uwe+JTDNCmw z%Sc|CwCQUZ`3bp6q2H)IaP{jxM*->lqva?n?e(+_-rCYRV6JT##hHC8+mfP4#!KXD z%s5h$2|=&mWr#vqh@+4pYCX);eX7xB9z@40bFyG^yTNp$p&adwM*-QV`8K7sx3k&W zx^zX!1hN2<9?*r|s!ZTP8U%sk4~J<{H!%5F6g5c3ZqU+`47deoIW*WWJ_|qeTlzUV zJy(z)YJF3T!P%PcaOW`T48KtL!{i3lz_?`_BHAwfVP#lO|TD`l$FA zQlTGnHMIS{&WmC)fzq|m?=uFk&wgy083|Q+cKy(-Zd;t(BPbHt&;F4JwU2XQ?QB(s z1L9yh`KbCp&yq0k`KqcPdiJt#x@bHVFI>YhKAWM3L_aJk5;Tdkmtx5=Q2!hImXdev z>MxaciDRW3Ot6b&=;u``?GuJfr)-Lz&s;HW!6lHyXS#t6OiCE)CHExjC{xAnpMQ31}sqd4ACN=}Df z9=q3x2Wxll4{)Ibr~o`aY7rIC=1EGX3PRUXHO*7)rvY5Opa5}o(qQ0brYi%{h$p%b ze7y8}^np9vi8IpAXy-8Ch}5;|+K<}n7~gIK6iha!>Oe;my#+iNA|m%kI*IA$4Sq8*qfvSZwkPxp(sli}m=ln$LeG zx-n-(T{jewTSmoR$`D73k_r1-TlIW=eGQ&~!Y7buP8C7{=;nv=-Hjj7yZ#a0vmf=< z=`Ub@;IjU-D9%hJrqPv-14cu~t8t7Wludm+X_4NcQ>MzLq4t+Yym>6O!|iWD_!LWu z=eK{1g2%)n-9U#J*?{XwUgswsLw<9t2>#`F{m=J*^*{gq(*GcMpM!00aT|I3RNz7H zr)ovh!w>l%0?+UG+@1F~2lR))zwMRJ<7^k?cf6-ZZ=c#tkz`O@&f#v+n7yvM+f(W1-B zqN`|yiN-@qaUIV(|704Hx{pFX#&PzHB=YNn*DCx4Ye&o%LG{n#zsji_#u<(GEFP+S znP!-|itB0Fw+to-|GjWEp~q)G#4sV@aOm*C6Pl=p(Dfe^scMhg(2606uK>?OXNkY- m@b-boD*ntVG%gk3zxX}Q-uKI=6ljHYp8f|evf)Vp literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..435019a --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#LEDS + + +*22/02/1998* + +ToDo: wwtcf? + + +![screenshot](/LEDS.png "Screenshot")