From 255bc1b3721b1f988ead8232f2e370516b5f8aaa Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 8 Sep 2021 21:04:26 +0200 Subject: [PATCH] First commit 11/11/1991 --- EGAVGA.BGI | Bin 0 -> 5554 bytes EPROM-II.CPP | 2118 ++++++++++++++++++++++++++++++++++++++++++++++++++ EPROM-II.DSK | Bin 0 -> 4738 bytes EPROM-II.EXE | Bin 0 -> 95062 bytes EPROM-II.H | 86 ++ EPROM-II.PRJ | Bin 0 -> 4918 bytes EPROM.DAT | 73 ++ EPROM.JDF | 183 +++++ EPROM_JD | Bin 0 -> 197 bytes EPROM_JD.TMP | Bin 0 -> 349 bytes EP_2.CPP | 447 +++++++++++ EP_2.EXE | Bin 0 -> 24469 bytes LITT.CHR | Bin 0 -> 5131 bytes NONAME00.CPP | 33 + R.BAT | 1 + RATON.C | 574 ++++++++++++++ README.md | 5 + 17 files changed, 3520 insertions(+) create mode 100644 EGAVGA.BGI create mode 100644 EPROM-II.CPP create mode 100644 EPROM-II.DSK create mode 100644 EPROM-II.EXE create mode 100644 EPROM-II.H create mode 100644 EPROM-II.PRJ create mode 100644 EPROM.DAT create mode 100644 EPROM.JDF create mode 100644 EPROM_JD create mode 100644 EPROM_JD.TMP create mode 100644 EP_2.CPP create mode 100644 EP_2.EXE create mode 100644 LITT.CHR create mode 100644 NONAME00.CPP create mode 100644 R.BAT create mode 100644 RATON.C create mode 100644 README.md diff --git a/EGAVGA.BGI b/EGAVGA.BGI new file mode 100644 index 0000000000000000000000000000000000000000..800163160dcf3473e5e18a35738a1385ffc999c7 GIT binary patch literal 5554 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 literal 0 HcmV?d00001 diff --git a/EPROM-II.CPP b/EPROM-II.CPP new file mode 100644 index 0000000..1ce24c3 --- /dev/null +++ b/EPROM-II.CPP @@ -0,0 +1,2118 @@ +/////////////////////// +/// JD. /// +/// /// +/// FuTuRe ViSiOn /// +////////////////////////////////////////////////////////////////////////////// +/// Nombre: Eprom-II.CPP /// +/// Modulo: Principal /// +/// Descripcin: Programador de Eprom's con ampliacin del numero /// +/// disponible de las mismas sin necesidad de /// +/// recompilar nada. /// +/// /// +/// Autor: Jos David Guilln Dominguez /// +/// Fecha: XX - XX - 1995 /// +/// /// +/// Comentario: -- Primera utilizacin de mi libreria ( v. BETA ) /// +/// con proposito de aplicacin final. /// +/// /// +/// Compilador Borland C++ 3.0 /// +////////////////////////////////////////////////////////////////////////////// + + + +// Librerias +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "..\..\jd_lib\make_bot.h" // Fuciones de MAKE_BOTON +#include "EPROM-ii.h" + +// Main +// +// ( Sin comentario ) +// + +int main(void){ + + if( carga_botones("Eprom.JDf") != 1 ) // Carga botones del fichero "botones.p1" + return 1; + + FILE *fichero; + + if( Lee_Eproms(fichero) != 1 ) // Carga las Eproms disponibles. + return 1; + + InicializaPc(); // No tengo ni idea de lo que estaba + // inicializando aqui. + // Ya lo he mirado: + // Inicializo los Campos... + + Initialize( 9, 2 ); // Inicializa el Modo Grfico + Menu_de_Edicion(); // Inicializa la Edicin + +farfree(S_Eprom); // Liberamos la memoria de los +restorecrtmode(); // distintos tipos de Eprom. +return 0; + +} + +// Menu de Edicion +// +// Editar y llevar el control de los ficheros para Eprom +// + +void Menu_de_Edicion(void){ + + CurrRowEprom1 = 1; CurrColEprom1 = 3; + CurrTopLineEprom = 1; + + int ok = 0; + + Imprime_Estaticos( 1, "Eprom.JDf" ); // Imprime botones estaticos 'Seccion 1' + Imprime_Secuencia(1); // Imprime secuencia 1. + Imprime_Estaticos( 2, "Eprom.JDf" ); // Imprime Textos ( 1 ), secuencia 1 + + Imprime_Eprom_Actual(); + + + Fuente( 2, 6 ); + + Abre_Ficha_Eprom(); + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + +do{ // Bucle infinito + + switch( Comprueba_Secuencia( 1 ) ) { // Iniciamos comprobacion + + case 0: // No se pulso ningun BOTON + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + CompruebaLineasEprom(); + EditCursorEprom(0); + break; + + case -2: // No se pulso ningun BOTON + // pero hay una tecla disponible... + key = getch(); + if ( isprint(key) || isspace(key) ){ + EditCursorEprom(0); + if(key!=13) ungetch(key); + Edit_Item_Eprom(); + EditCursorEprom(0); + } + break; + case -1: // Hay una tecla especial en BUFFER + EditCursorEprom(1); + key = getch(); + switch( key ){ + // Flecha Arriba + case 72: + Mueve_Arriba_Eprom(); + break; + // Flecha Izquierda + case 75: + case 15: + CurrColEprom1--; + if ( CurrColEprom1<1 ) CurrColEprom1=4; + break; + // Flecha Derecha + case 77: + case 9: + CurrColEprom1++; + if ( CurrColEprom1>4 ) CurrColEprom1=1; + break; + // Flecha Abajo + case 80: + Mueve_Abajo_Eprom(); + break; + // Buscar F2 + case 60: + // BuscarEprom(); + break; + // Imprimir Compras F5 + case 63: + // Imprimir_Eprom(); + break; + // F9 --> AADIR + case 67: + case 82: + AddRecordEprom(); + Eprom1.Direccion = 0; + PutLineEprom(); + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + break; + // F10 -> BORRAR + case 68: + case 83: + DeleteRecordEprom(); + break; + // INICIO + case 71: + CurrColEprom1 = 1; + break; + // FIN + case 79: + CurrColEprom1 = 4; + break; + // RePg + case 73: + // CurrRow = 1; + if( CurrTopLineEprom > /*28*/25 ) { CurrTopLineEprom -= /*28*/25; } else { CurrTopLineEprom = 1; } + if( CurrTopLineEprom < 1 ) { CurrTopLineEprom = 1; } + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + break; + // AvPg + case 81: + // CurrRow = 1; + CurrTopLineEprom += /*28*/25; + if ( (CurrTopLineEprom+CurrRowEprom1) > Eprom1_inx.Fin) { CurrTopLineEprom = Eprom1_inx.Fin; CurrRowEprom1 = 1; } + if (CurrTopLineEprom==0) CurrTopLineEprom = 1; + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + break; + default: + BEEP(); + break; + } + EditCursorEprom(0); + break; + // Escoger EPROM + case 1: + Escoge_Eprom(); + break; + // Direccin incial a continuar + case 2: + if ( Modifica_Direccion == 1 ){ + Modifica_Direccion = 0; + setcolor(0); + setfillstyle(SOLID_FILL, 0); + bar(617, 103, 628, 112); + }else{ + Modifica_Direccion = 1; + setcolor(4/*58*/); + setfillstyle(SOLID_FILL, 4/*58*/); + bar(617, 103, 628, 112); + } + break; + // Imprimir Datos de Eprom + case 3: + Imprimir_Eprom(0,0); + break; + // Cargar Fichero + case 4: + Salvar_Cargar(2); + break; + // Salvar Fichero + case 5: + Salvar_Cargar(1); + break; + // Leer Datos de Eprom + case 6: + break; + // Cargar Datos en Eprom + case 7: + break; + // Salir + case 8: + ok = 1; + break; + } + +}while(!ok); + +fclose(Eprom); + +} + + + + + + + + + + +// +// Inicializa las estructructuras +// internas de boton... +// ---------------------------------- +// Como las de *.JDF pero INTERNAS +// ---------------------------------- +// + +void InicializaPc(void){ + PC[0].up = 50; PC[0].down = 440; + PC[0].left = 10; PC[0].right = 122; + + PC[1].up = 50; PC[1].down = 440; + PC[1].left = 132; PC[1].right = 295; + + PC[2].up = 50; PC[2].down = 440; + PC[2].left = 315; PC[2].right = 398; + + PC[3].up = 50; PC[3].down = 440; + PC[3].left = 408; PC[3].right = 535; +} + +// +// CARGA LAS EPROM'S DEL DISCO... +// +// FORMATO *.DAT diseado por J.D. +// ---------------------------------- +// + +int Lee_Eproms(FILE *fichero) +{ + char ch, buffer[15]; + int temp_num, temp_b; + long numero; +/* int SiZe_BoToN = 0, inc_Botones = -1; */ + int EpromActual = 0; + + if ( (fichero=fopen("Eprom.Dat","r"))==NULL ) exit(1); + + + ch=fgetc(fichero); //Lee el primer caracter + while (ch!=EOF) { //Lee hasta fin de fichero + if (ch=='*') //Linea con comentario + while (ch!=EOL && ch!=EOF) ch=fgetc(fichero); + + if (ch=='N') { //Numero de secuencias + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF) { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + N_Eprom = numero; + if ( (S_Eprom = (struct Eprom_Structura far *)farrealloc(S_Eprom, sizeof( struct Eprom_Structura )*N_Eprom )) == NULL) { + restorecrtmode(); + printf("\nNo Hay suficiente Memoria, para cargar los tipos de Eprom\n\n"); + exit (1); + } + + } + + if (ch=='%') { //Numero de Botones en la secuencia + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].TP = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].FI = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].NP = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].DM = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].BD = numero; + + numero=0; + ch=fgetc(fichero); + while (ch!=EOL && ch!=EOF && ch!=',') { + if (ch>='0' && ch<='9') numero=numero*10+ch-48; + ch=fgetc(fichero); + } + S_Eprom[EpromActual].ID = numero; + + + numero=0; + ch=fgetc(fichero); + strcpy(buffer, "\0"); + while (ch!=EOL && ch!=EOF && ch!='.' && (numero+1)<12+1) { + + ch=fgetc(fichero); + if(ch!='.') { buffer[numero] = ch; + numero++; + } + } + buffer[numero] = '\0'; + _fstrcpy(S_Eprom[EpromActual].ID_TEXT, (char near *)buffer); + + EpromActual++; + + } + + if (ch!=EOF) ch=fgetc(fichero); + } + + return OK; +} + +void BEEP(void){ + + sound(440); + delay(50); + nosound(); + +} + +//////// Funcion diseada para la introducion lineal de caracteres Grficos +//////// para el programa CATALOGO 4.0, por Jos David Guilln + +int InputCadenaG_l(char *s, int numalp, int lmax, int cc, int cf, struct boton Campo, int RoW) +{ + + char buf[81]; // Buffer de linea + int ls; // longitud cadena + char *s1; // puntero a cadena inicial + int i, c, ok; + + s1 = s; // inicio cadena + + setcolor(cf); // pone color a 0 para borrar + setfillstyle(SOLID_FILL, cf); + bar(Campo.left+4, Campo.up+5+RoW*15, Campo.right-4, Campo.up+4+RoW*15 + 16); + + + setcolor(cc); // devuelve el color a su estado + + outtextxy( Campo.left+4, Campo.up+/*3*/3+RoW*/*9*//*14*/15, s ); + + ls = strlen ( s ); // Longitud de actual + + if ( ls < lmax ) { + setcolor(4); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+3+RoW*/*9*//*14*/15, ""); + } + + s += ls; // se coloca en el final + + do{ + c = getch(); // obtiene tecla + + ok = ( c == 13 || c == 0); // 13 = INTRO || Especiales + + if ( c == 8 && ls > 0 && !ok ) { // 8 = Back Space + ls--; + s--; + + *s = '\0'; + + setcolor(cf); + setfillstyle(SOLID_FILL, cf); + bar(Campo.left+4, Campo.up+5+RoW*15, Campo.right-4, Campo.up+4+RoW*15 + 16); + setcolor(cc); + outtextxy( Campo.left+4, Campo.up+3+RoW*/*9*//*14*/15, s1 ); + setcolor(4); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+/*3*/2+RoW*/*9*//*14*/15, ""); + setcolor(cc); + + } else { + if ( !numalp && c >= 32 && c <= 254 /* isprint(c) */ && ls < lmax) { + + *s++ = c; + ls++; + + *s = '\0'; + setcolor(cf); + setfillstyle(SOLID_FILL, cf); + bar(Campo.left+4, Campo.up+5+RoW*15, Campo.right-4, Campo.up+4+RoW*/*9*//*14*/15 + /*9*/16); + setcolor(cc); + outtextxy( Campo.left+4, Campo.up+3+RoW*/*9*//*14*/15, s1 ); + + if ( ls < lmax ) { + setcolor(4); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+3+RoW*/*9*//*14*/15, ""); + setcolor(cc); + } + + + } else { + if ( numalp && isdigit(c) && ls < lmax) { + *s++ = c; + ls++; + + *s = '\0'; // Cero final + setcolor(cf); + setfillstyle(SOLID_FILL, cf); + bar(Campo.left+4, Campo.up+5+RoW*15, Campo.right-4, Campo.up+4+RoW*/*9*//*14*/15 + /*9*/16); + setcolor(cc); + + outtextxy( Campo.left+4, Campo.up+3+RoW*/*9*//*14*/15, s1 ); + + if ( ls < lmax ) { + setcolor(4); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+3+RoW*/*9*//*14*/15, ""); + setcolor(cc); + } + + + } else BEEP(); + } + } + + }while(!ok); + + ok = 1; + *s = ' '; + while( ok ) { + if(*s==' ') { *s = '\0'; s--; + } else { s++; ok = 0; } + } + + *s = '\0'; + + while(kbhit()) getch(); // Vacia Buffer impidiendo falsas + // pulsaciones... + + return ls; +} +//////// Funcion diseada para la introducion lineal de caracteres Grficos +//////// para el programa CATALOGO 4.0, por Jos David Guilln +//////// readactada para la introducion dependiente de la fuente en el +//////// programa EPROM_II. + +int InputCadenaG_l2(char *s, int numalp, int lmax, int cc, int cf, struct boton Campo, int RoW) +{ + + char buf[81]; // Buffer de linea + int ls; // longitud cadena + char *s1; // puntero a cadena inicial + int i, c, ok; + + s1 = s; // inicio cadena + + setcolor(cf); // pone color a 0 para borrar + setfillstyle(SOLID_FILL, cf); + + bar(Campo.left+3, Campo.up+3+(RoW-1)*10+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); + + setcolor(cc); // devuelve el color a su estado + + outtextxy( Campo.left+4, Campo.up+2+(RoW-1)*10, s ); + + ls = strlen ( s ); // Longitud de actual + + if ( ls < lmax ) { + setcolor(4); + outtextxy( Campo.left+4, Campo.up+/*3*/2+(RoW-1)*10/*14*//*15*/, s1 ); + } + + s += ls; // se coloca en el final + + do{ + c = getch(); // obtiene tecla + + ok = ( c == 13 || c == 0); // 13 = INTRO || Especiales + + if ( c == 8 && ls > 0 && !ok ) { // 8 = Back Space + ls--; + s--; + + *s = '\0'; + + setcolor(cf); + setfillstyle(SOLID_FILL, cf); +// bar(Campo.left+3, Campo.up+3+(RoW-1)*12/*14*//*12*/+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); + bar(Campo.left+3, Campo.up+3+(RoW-1)*10+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); + setcolor(cc); + outtextxy( Campo.left+4, Campo.up+/*3*/2+(RoW-1)*10/*14*//*15*/, s1 ); + setcolor(4); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+/*3*/2+(RoW-1)*/*9*//*14*/10, ""); + setcolor(cc); + + } else { + if ( !numalp && c >= 32 && c <= 254 /* isprint(c) */ && ls < lmax) { + + *s++ = c; + ls++; + + *s = '\0'; + setcolor(cf); + setfillstyle(SOLID_FILL, cf); + bar(Campo.left+3, Campo.up+3+(RoW-1)*10+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); +// bar(Campo.left+3, Campo.up+3+(RoW-1)*12/*14*//*15*/+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); + setcolor(cc); + outtextxy( Campo.left+4, Campo.up+/*3*/2+(RoW-1)*10/*14*//*15*/, s1 ); + + if ( ls < lmax ) { + setcolor(4); +// outtextxy( Campo.left+2, Campo.up+/*3*/2+(RoW-1)*12/*14*//*15*/, s ); + outtextxy( Campo.left+4+textwidth( s1 ), Campo.up+/*3*/2+(RoW-1)*/*9*//*14*/10, ""); + setcolor(cc); + } + + + } else { + if ( numalp && isdigit(c) && ls < lmax) { + *s++ = c; + ls++; + + *s = '\0'; // Cero final + setcolor(cf); + setfillstyle(SOLID_FILL, cf); +// bar(Campo.left+3, Campo.up+3+(RoW-1)*10/*14*//*15*/+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); + bar(Campo.left+3, Campo.up+3+(RoW-1)*10+2, Campo.right-3, Campo.up+3+(RoW-1)*10/*14*//*15*/ + /*9*/10); +// bar(Campo.left+2, Campo.up+3+RoW*/*9*/14+2, Campo.right-2, Campo.up+3+RoW*/*9*/14 + /*9*/16); + setcolor(cc); + outtextxy( Campo.left+4, Campo.up+/*3*/2+(RoW-1)*10/*14*//*15*/, s1 ); +// outtextxy( Campo.left+2, Campo.up+/*3*/2+RoW*/*9*//*14*/15, s1 ); + + if ( ls < lmax ) { + setcolor(4); + outtextxy( Campo.left+4, Campo.up+/*3*/2+(RoW-1)*10/*14*//*15*/, s1 ); +// outtextxy( Campo.left+2+textwidth( s1 ), Campo.up+/*3*/+RoW*/*9*//*14*/15, ""); + setcolor(cc); + } + + + } else BEEP(); + } + } + + }while(!ok); + + ok = 1; + *s = ' '; + while( ok ) { + if(*s==' ') { *s = '\0'; s--; + } else { s++; ok = 0; } + } + + *s = '\0'; + + while(kbhit()) getch(); // Vacia Buffer impidiendo falsas + // pulsaciones... + + return ls; +} + +// +// Imprime la Emprom dentro del Boton +// +void Imprime_Eprom_Actual(void){ + + setcolor(0); + setfillstyle(SOLID_FILL, 0); + bar(552, 42, 628, 53); + + Fuente( 2, 4 ); + setcolor(63); + outtextxy(555, 42, S_Eprom[CurrEprom].ID_TEXT); + +} + +// +// Cambia de Fuente y tamao +// + +void Fuente( int Font, int size){ + + /* select the registered font */ + settextstyle( Font, HORIZ_DIR, size); + settextjustify(LEFT_TEXT, RIGHT_TEXT); + +} + +// +// Escoge una de las eproms del Archivo +// E P R O M . D A T +// + +void Escoge_Eprom(void){ + +char buffer[80]; +int acabar = 0, key; +int CurrRowCE=1, CurrTopLineCE = 0; + + Imprime_Estaticos( 3, "Eprom.JDf" ); // Imprime Textos ( 1 ), secuencia 1 + +sprintf(buffer, " % 3d", N_Eprom); +setcolor(2); +outtextxy(175, 157, buffer); +setcolor(0); +outtextxy(176, 158, buffer); +setcolor(63); + + PrintEprom_CE_WholeScreen(CurrTopLineCE); + +do{ + EditCursorEprom_CE(0, CurrRowCE, CurrTopLineCE); + while(!kbhit()); + key = getch(); + if(key == 13 ) { CurrEprom = CurrRowCE + CurrTopLineCE - 1; acabar = 1; } + else + if(key == 0 ) { + EditCursorEprom_CE(1, CurrRowCE, CurrTopLineCE); + switch(getch()){ + // Flecha ARRIBA + case 72: + if( (CurrRowCE+CurrTopLineCE)!=1 ){ + if(CurrRowCE == 1) { CurrTopLineCE--; PrintEprom_CE_WholeScreen(CurrTopLineCE); } + else CurrRowCE--; + } + break; + // Flecha ABAJO + case 80: + if( (CurrRowCE+CurrTopLineCE) EPROM +// + +int Escribe_Eprom(void){ + +char buffer[80]; +struct Eprom_s *Eprom2; + + struct byte_de_long { unsigned char P3; unsigned char P2; + unsigned char P1; unsigned char P0; + }; + union lngchr{ long Numero; struct byte_de_long Byte; } Division; + ////////////////////////////// + // long --> FF FF FF FF --> 3 34 65 59 + // P0 P1 P2 P3 Dec.89 101 52 3 + ////////////////////////////// Hex.59 65 34 3 + +int TP, cont; + +if( (Eprom2 = (struct Eprom_s *)farmalloc( sizeof(struct Eprom_s) * 100 )) == NULL ) { + return Operacion_Fallida; +} + +//////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +//////// TP --> case, escoge la tension de la eprom actual a la que le +//////// corresponde un cdigo en Hex. a enviar a la placa. ( TP ) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////// +switch( S_Eprom[CurrEprom].TP ){ + case 250: + TP = 0x1; + break; + case 215: + TP = 0x0; + break; + case 125: + TP = 0x4; + break; + default: + return Operacion_Fallida; // Si la tensin es incorrecta, no programa +} + + +cont = 0; +longitud = 0; +Carga_Cien_Elementos(Eprom2); + +for(int i=0; i100) { + cont=0; + Carga_Cien_Elementos(Eprom2); +} + +} + +// Termina operacion + outportb( 0x303, (0) ); +/* + char TP; char FI; char NP; + char DM; char BD; long ID; + char ID_TEXT[15]; + +}; + +struct Eprom_Structura far *S_Eprom; +*/ +// struct Eprom_s { long Direccion; long Dato; }; +return 1; + +} + +// +// Manda el programa de +// EPROM ---> DISCO +// + +int Leer_en_Eprom(void){ + + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + + char buffer[80]; + struct Eprom_s *Eprom2; + + struct byte_de_long { unsigned char P3; unsigned char P2; + unsigned char P1; unsigned char P0; + }; + union lngchr{ long Numero; struct byte_de_long Byte; } Division; + ////////////////////////////// + // long --> FF FF FF FF --> 3 34 65 59 + // P0 P1 P2 P3 Dec.89 101 52 3 + ////////////////////////////// Hex.59 65 34 3 + + int TP, cont; + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +fclose(Eprom); // Cerramos el archivo para poder borrarlo +remove("Eprom_JD.TMP"); // Y lo borramos, para reiniciarlo | +Abre_Ficha_Eprom(); // <<<<---<<<---<<--<--------------- +////////////////////////////////////////////////////////////////////////////// + CurrRowEprom1 = 1; // Inicializamos todo, para asegurar total + CurrColEprom1 = 3; // capacidad de correccion de errores, sobre + CurrTopLineEprom = 1; // la marcha... +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +outport( 0x303, 0x19 ); + +for(int i=0; i< pow(2, ( (S_Eprom[CurrEprom].DM)) ); i++) { + + // Tension + outport( 0x303, TP ); + // Direccin + Division.Numero = Eprom2[cont].Direccion; + outportb( 0x300, Division.Byte.P1 ); + outportb( 0x301, Division.Byte.P0 ); + // Dato + Division.Numero = Eprom2[cont].Dato; + outportb( 0x302, Division.Byte.P0 ); + // Impulso + outportb( 0x303, (TP + 16) ); + + // + // Retardo_____----_____ + // + // Barra_de_estado(); + delay(S_Eprom[CurrEprom].FI); + // while( ( clock() - Retrazo ) / CLK_TCK) / 1000) <= 50 ); + + fseek(Eprom, (long)LSJ + LSI + ( LSC * i ), SEEK_SET); + fwrite(&Eprom1, LSC, 1, Eprom); + +} + + +// Termina operacion + outportb( 0x303, (1) ); + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +PrintWholeScreenEprom(); // Imprimimos el contenido de la EPROM leida +GetLineEprom(); // Obtenemos la primera Linea +EditCursorEprom(0); // Y la marcamos... +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +return 1; // Todo ha ido bien... + +} + +// +// Carga 100 datos a memoria y los +// indexa a un puntero a la estructura.. +// + +void Carga_Cien_Elementos(struct Eprom_s *Datos){ + +int LSJ = sizeof(struct JD); +int LSI = sizeof(struct Eprom_inx); +int LSC = sizeof(struct Eprom_s); +int contador; + +contador = 0; + + do{ + fseek(Eprom, (long)LSJ + LSI + ( LSC * longitud ), SEEK_SET); + fread(&Datos[contador], LSC, 1, Eprom); + longitud++; + }while(contador<100 && longitud <= Eprom1_inx.Fin); + + +} + + + + + + +// +// Men SALVAR <---> CARGAR +// +void Salvar_Cargar(int S_C){ + + int ok = 0, open_file = 1, cont = 0; + int LSJ = sizeof(struct JD); + + + CurrRowFile=1; CurrTopFile = 0; + CurrColFile=1; CurrRowCom = 1; + + strcpy(Archivo, ArchivoDatos); + + PC[1].up =/*155*/153; PC[1].down = 170; + PC[1].left = 270; PC[1].right = 465; + + PC[2].up = 201; PC[2].down = 249; + PC[2].left = 270; PC[2].right = 465; + +//******* Salvar ---> 1 +//******* Cargar ---> 2 + + Imprime_Estaticos( 4, "Eprom.JDf" ); // Imprime botones estaticos 'Seccion 1' + + + Lee_Archivos_Presentes(S_C); + + setcolor(63); + + Fuente( 2, 4 ); + + + + PrintWholeScreenFile(); + CurrColFile=2; + EditCursorFile(1); + CurrColFile=3; +if(S_C==2) { + LeeCabecera(&Archivo_list[0]); +PrintWholeScreenCabecera(); +} else + PrintWholeScreenFile(); + CurrColFile=1; + EditCursorFile(0); + + +do{ // Bucle infinito + + switch( Comprueba_Secuencia( 2 ) ) { // Iniciamos comprobacion + + case 0: // No se pulso ningun BOTON + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + + case -2: // No se pulso ningun BOTON + // pero hay una tecla disponible... + key = getch(); + if ( isprint(key) || isspace(key) ){ + EditCursorFile(0); + if(CurrColFile == 1 ) { + strcpy(Archivo, &Archivo_list[13*(CurrRowFile + CurrTopFile - 1)] ); + cont = 0; + while( Archivo[cont] != '.' ) cont++; + Archivo[cont] = '\0'; + CurrColFile=2; + EditCursorFile(1); + CurrColFile=1; + } else { + if(key!=13) ungetch(key); + Edit_Item_File(); + } + + EditCursorFile(0); + } + break; + case -1: // Hay una tecla especial en BUFFER + EditCursorFile(1); + key = getch(); + switch( key ){ + // Flecha Arriba + case 72: + if(CurrColFile == 1) { + if( (CurrRowFile + CurrTopFile) != 1 ) + if(CurrRowFile == 1) { CurrTopFile--; PrintWholeScreenFile(); } + else CurrRowFile--; + if(S_C==2) { + LeeCabecera(&Archivo_list[13*(CurrRowFile + CurrTopFile - 1)]); + CurrColFile=3; + PrintWholeScreenCabecera(); + CurrColFile=1; } + + } else if(CurrColFile == 3) { + CurrRowCom--; + if(CurrRowCom<1) CurrRowCom = 4; + } + break; + // Flecha Izquierda + case 75: + case 15: + CurrColFile--; + if ( CurrColFile<1 ) CurrColFile=3; + break; + // Flecha Derecha + case 77: + case 9: + CurrColFile++; + if ( CurrColFile>3 ) CurrColFile=1; + break; + // Flecha Abajo + case 80: + if(CurrColFile == 1) { + if( (CurrRowFile + CurrTopFile) < N_Files ) + if(CurrRowFile == 12) { CurrTopFile++; PrintWholeScreenFile(); } + else CurrRowFile++; + if(S_C==2) { + LeeCabecera(&Archivo_list[13*(CurrRowFile + CurrTopFile - 1)]); + CurrColFile=3; + PrintWholeScreenCabecera(); + CurrColFile=1; } + + } else if(CurrColFile == 3) { + CurrRowCom++; + if(CurrRowCom>4) CurrRowCom = 1; + } + break; + } + EditCursorFile(0); + break; + // Aceptar + case 1: +// ******* Salvar ---> 1 +// ******* Cargar ---> 2 + if(S_C==1) { + if(open_file == 1){ + rewind(Eprom); + fwrite(&cabecera, LSJ, 1, Eprom); + fclose(Eprom); + open_file = 0; + } +// +// Copia el fichero *.TMP a *.PDE +// + strcat(Archivo, ".PDE"); + fcopy( "Eprom_JD.TMP", Archivo ); + + if ( Abre_Ficha_Eprom() == 1 ) { open_file = 1; ok = 1; } + + } else { + if(open_file == 1){ + fclose(Eprom); + open_file = 0; + } + if( strcmp( Archivo, " < NUEVO > ") == 0 ){ remove("Eprom_JD.TMP"); + CurrRowEprom1 = 1; + } else { + +// +// Copia el fichero *.PDE a *.TMP +// + strcat(Archivo, ".PDE"); + fcopy( Archivo, "Eprom_JD.TMP"); + } + + if ( Abre_Ficha_Eprom() == 1 ) ok = 1; + + } + break; + // Direccin incial a continuar + case 2: + if(open_file == 0 ){ // remove("Eprom_JD.TMP"); + CurrRowEprom1 = 1; + } + ok = 1; + break; + default: + BEEP(); + break; + } + +}while(!ok); + + free(Archivo_list); + + InicializaPc(); + Imprime_Estaticos( 2, "Eprom.JDf" ); // Imprime Textos ( 1 ), secuencia 1 + Imprime_Eprom_Actual(); + Fuente( 2, 6 ); + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + +} + +// +// Busca en el disco, archivos con el +// formato *.PDE >>Programador de Eprom +// +void Lee_Archivos_Presentes(int add_new){ + +struct ffblk ffblk; +int done; + +N_Files=0; + +if(add_new==2) { + N_Files++; + if( ( Archivo_list = (char *)realloc( Archivo_list, ( (sizeof(char) )*N_Files ) ) ) == NULL) return; + strcpy( &Archivo_list[ 13*(N_Files - 1)], " < NUEVO > "); +}else { + N_Files++; + if( ( Archivo_list = (char *)realloc( Archivo_list, ( (sizeof(char) )*N_Files ) ) ) == NULL) return; + strcpy( &Archivo_list[ 13*(N_Files - 1)], ""); +} + + +done = findfirst("*.PDE",&ffblk,0); + +while (!done) + { + N_Files++; + if( (Archivo_list = (char *)realloc( Archivo_list, ((sizeof(char)*13)*N_Files) ) ) == NULL ) return; + if(done==0) strcpy( &Archivo_list[ 13*(N_Files - 1)], ffblk.ff_name); + done = findnext(&ffblk); + } + + +} + +// +// Imprime en Pantalla mientras quede +// datos en el DISCO, o Espacio en +// Pantalla.n Pantalla mientras quede +// + +void PrintWholeScreenFile(void){ + + +char buffer[80]; + +//int TP, FI, NP, DM, BD; +int CurrRowCE; + +if(CurrColFile==1) { + + setcolor(0); setfillstyle(SOLID_FILL, 0); + bar( 177, 177, 263, 323); + setcolor(63); + + for(CurrRowCE = 1; CurrRowCE < (12+1); CurrRowCE++) + + if ( (CurrTopFile + CurrRowCE ) <= N_Files ) { + + + sprintf(buffer, "%13s", &Archivo_list[13*(CurrTopFile + CurrRowCE - 1)] ); + outtextxy( 177, ( 178 + (CurrRowCE - 1)*10), buffer); + } +} else if(CurrColFile==3){ + + setcolor(0); setfillstyle(SOLID_FILL, 0); + bar( 272, 202, 463, 248); + setcolor(63); + + for(CurrRowCE = 1; CurrRowCE < (4+1); CurrRowCE++) { + + sprintf(buffer, "%s", cabecera.Comentario[(CurrRowCE-1)] ); + outtextxy( 275, ( 204 + (CurrRowCE - 1)*10), buffer); + } + +} + +} + +// +// Imprime en Pantalla mientras quede +// datos en el DISCO, o Espacio en +// Pantalla.n Pantalla mientras quede +// + +void PrintWholeScreenCabecera(void){ + + +char buffer[80]; + +//int TP, FI, NP, DM, BD; +int CurrRowCE; + + setcolor(0); setfillstyle(SOLID_FILL, 0); + bar( 272, 202, 463, 248); + setcolor(63); + + for(CurrRowCE = 1; CurrRowCE < (4+1); CurrRowCE++) { + + sprintf(buffer, "%s", cabecera2.Comentario[(CurrRowCE-1)] ); + outtextxy( 275, ( 204 + (CurrRowCE - 1)*10), buffer); + } + + +} + +// +// Realza los datos de EPROMS a ser +// editados cuando sean sealados por +// el cursor. +// + +void EditCursorFile(int SH){ + +char buffer[80]; + + if (!SH) { setcolor(63); setfillstyle(SOLID_FILL, 63); } + else + { setcolor(0); setfillstyle(SOLID_FILL, 0); } + +if(CurrColFile==1) { + + bar( 177, 178+ ( CurrRowFile-1 )*10 + 2, 263, 178 + ( CurrRowFile - 1 )*10+10 ); + + if(!SH) setcolor(0); else Texto_Normal + + sprintf(buffer, "%13s", &Archivo_list[13*(CurrTopFile + CurrRowFile - 1)] ); + outtextxy( 177, ( 178 + (CurrRowFile - 1)*10), buffer); +} else if(CurrColFile==2){ + + bar(272, 157, 463, 168); + + if(!SH) setcolor(0); else Texto_Normal +if(strlen(Archivo)<11) + sprintf(buffer, " %8s.PDE", Archivo ); +else + sprintf(buffer, " %13s", Archivo ); + outtextxy( 280, 156, buffer); +// & 155, 270, 465, 170, 0, 56, 63, 1, 2 +} else if(CurrColFile==3) { + + bar( 273, 204+ ( CurrRowCom-1 )*10 + 2, 462, 204 + ( CurrRowCom - 1 )*10+10 ); + + if(!SH) setcolor(0); else Texto_Normal + + sprintf(buffer, "%s", cabecera.Comentario[(CurrRowCom-1)] ); + outtextxy( 275, ( 204 + (CurrRowCom - 1)*10), buffer); + +} + + + +} + +// +// Edita el Dato seleccionado por el +// cursor, en carga y descarga de FILE +// + +void Edit_Item_File(void){ + + char buffer[80]; + +switch (CurrColFile) { + case 2: +// sprintf( buffer, "%s", Archivo); + InputCadenaG_l2( Archivo, 0, 8, 63, 57, PC[1], 1); + break; + case 3: +// sprintf( buffer, "%s", cabecera.Comentario[(CurrRowCom-1)]); + InputCadenaG_l2( cabecera.Comentario[(CurrRowCom-1)], 0, 30, 63, 57, PC[2], CurrRowCom); + break; + default: + return; + } + +} + + + + + + + + +// Abre_Ficha_Eprom +// +// Abre el archivo contenido en ArchivoDatos, y comprueba que sea +// del formato adecuado y la versin 1.1 +// + +int LeeCabecera(char *fichero){ + +//// +// Comprueba apertura correcta de Indice, y Datos y creacin... // +//// + + int LSJ = sizeof(struct JD); + fclose(EpromC); + + if ( (EpromC = fopen( fichero, "rb"))==NULL) { + + strcpy(cabecera2.Comentario[0], "\0"); + strcpy(cabecera2.Comentario[1], "Fichero no se puede abrir"); + strcpy(cabecera2.Comentario[2], "\0"); + strcpy(cabecera2.Comentario[3], "\0"); + return (-1); + + } + + if ( fread(&cabecera2, LSJ, 1, EpromC) != 1 ) { + restorecrtmode(); + printf("NO SE PUDO LEER EN EL FICHERO: INDICE, temporal"); + exit(1); + } + + if(cabecera2.esc != 27 || cabecera2.pt != 7 || cabecera2.ef != 26 ) { + strcpy(cabecera2.Comentario[0], "\0"); + strcpy(cabecera2.Comentario[1], "Fichero no compatible"); + strcpy(cabecera2.Comentario[2], "\0"); + strcpy(cabecera2.Comentario[3], "\0"); + return (-1); + // Cabecera no valida ((ERROR LEYENDO ESTRUCTURAS)) + } + + return 1; +} + + + +//// +// // +// // +// // +// // +// // +// // +//// + + // Mueve Abajo Eprom // + // // + // Realizar el Scroll Vertical hacia abajo y la gestin de la // + // rectificacin al paso. ( Direccin --> ON ) // + //// + +void Mueve_Abajo_Eprom(void){ + + int CurrRecord = CurrTopLineEprom + CurrRowEprom1 - 1; + int OldDir = Eprom1.Direccion; + + if (CurrRowEprom1==25) { + if ( (CurrRecord - 1) >= Eprom1_inx.Fin) { BEEP(); EditCursorEprom(0); } + else { + +// CurrTopLineEprom++; + CurrRowEprom1=1; + CurrTopLineEprom += /*28*/25; + if ( (CurrTopLineEprom+CurrRowEprom1) > Eprom1_inx.Fin) { CurrTopLineEprom = Eprom1_inx.Fin; CurrRowEprom1 = 1; } + if (CurrTopLineEprom==0) CurrTopLineEprom = 1; + if ( Modifica_Direccion == 1 ) { Eprom1.Direccion = OldDir+1; + PutLineEprom(); +// PrintLineEprom(); + } + PrintWholeScreenEprom(); + GetLineEprom(); + + + } + } else { + if( (CurrRecord - 1) >= Eprom1_inx.Fin) { BEEP(); EditCursorEprom(0); } + else { CurrRowEprom1++; + + GetLineEprom(); + if ( Modifica_Direccion == 1 ) { Eprom1.Direccion = OldDir+1; + PutLineEprom(); + PrintLineEprom(); + } + + } + } + +} + +// Mueve Arriba Eprom +// +// Realizar el Scroll Vertical hacia arriba y la gestin de la +// rectificacin al paso. ( Direccin --> ON ) +// + +void Mueve_Arriba_Eprom(void){ + int CurrRecord = CurrTopLineEprom + CurrRowEprom1 - 1; + int OldDir = Eprom1.Direccion; + + if (CurrRowEprom1==1) { + if ((CurrRecord - 1) <= 0) { BEEP(); EditCursorEprom(0); } + else { +// CurrTopLineEprom--; + CurrRowEprom1=25; + if( CurrTopLineEprom > /*28*/25 ) { CurrTopLineEprom -= /*28*/25; } else { CurrTopLineEprom = 1; } + if( CurrTopLineEprom < 1 ) { CurrTopLineEprom = 1; } + if ( Modifica_Direccion == 1 ) { Eprom1.Direccion = OldDir-1; + PutLineEprom(); +// PrintLineEprom(); + } + PrintWholeScreenEprom(); + GetLineEprom(); + } + + } else { + if( (CurrRecord - 1) <= 0) BEEP(); + else { CurrRowEprom1--; + GetLineEprom(); + if ( Modifica_Direccion == 1 ) { Eprom1.Direccion = OldDir-1; + PutLineEprom(); + PrintLineEprom(); + } + + } + } + +} + + +// EditCursorEprom +// +// Edita, (resalta o no), el cursor, (Barra situada sobre el campo) +// + +void EditCursorEprom(int ShowHide) { + + char Buffer[80]; + int x, x2, y = 50; + + setcolor(7); + setfillstyle(SOLID_FILL, 7); + bar(12, 457, 545, 470); + + if (!ShowHide) { setcolor(63); setfillstyle(SOLID_FILL, 63); } + else + { setcolor(0); setfillstyle(SOLID_FILL, 0); } + + switch( CurrColEprom1 ){ + case 1: x = 10; x2 = 122; break; + case 2: x = 132; x2 = 295; break; + case 3: x = 315; x2 = 398; break; + case 4: x = 408; x2 = 535; break; + default: break; + } + + bar( (x+4), y+2+(CurrRowEprom1-1)*15+4, x2-4, y+4+((CurrRowEprom1)-1)*15+16); + + + if(!ShowHide) setcolor(0); else Texto_Normal + + switch(CurrColEprom1){ + case 1: + sprintf(Buffer, "% 10lX", Eprom1.Direccion); + outtextxy( x+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + outtextxy( 15, 455, "Direccin ( HEXADECIMAL ) "); + break; + case 2: + sprintf(Buffer, "% 15lu", Eprom1.Direccion); + outtextxy( x+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + outtextxy( 15, 455, "Direccin ( DECIMAL ) "); + break; + case 3: + sprintf(Buffer, "% 7X", Eprom1.Dato); + outtextxy( x+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + outtextxy( 15, 455, "Dato ( HEXADECIMAL ) "); + break; + case 4: + sprintf(Buffer, "% 12u", Eprom1.Dato); + outtextxy( x+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + outtextxy( 15, 455, "Dato ( DECIMAL ) "); + break; + } + +} + + +// PrintLineEprom +// +// Imprime una linea con todos los datos de la Eprom. +// + +void PrintLineEprom(void){ + + char Buffer[80]; + int x, x2, y = 50; + setcolor(0); + setfillstyle(SOLID_FILL, 0); +for(int i=1; i<=4; i++){ + switch( i ){ + case 1: x = 10; x2 = 122; break; + case 2: x = 132; x2 = 295; break; + case 3: x = 315; x2 = 398; break; + case 4: x = 408; x2 = 535; break; + default: break; + } + bar( (x+4), y+2+(CurrRowEprom1-1)*15+2, x2-4, y+4+((CurrRowEprom1)-1)*15+16); +} + + Texto_Normal + + sprintf(Buffer, "% 10lX", Eprom1.Direccion); + + sprintf(Buffer, "% 10lX", Eprom1.Direccion); + outtextxy( 10+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + sprintf(Buffer, "% 15lu", Eprom1.Direccion); + outtextxy(132+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + sprintf(Buffer, "% 7X", Eprom1.Dato); + outtextxy(315+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + sprintf(Buffer, "% 12u", Eprom1.Dato); + outtextxy(408+4, (y+2)+(CurrRowEprom1-1)*15, Buffer ); + +} + +// PrintWholeScreen +// +// Imprime Datos solo si caben en la pantalla de visualizacin. +// + +void PrintWholeScreenEprom(void){ + +int tmp = CurrRowEprom1; + +int x, x2, y=50, y2=440; + +setcolor(0); +setfillstyle(SOLID_FILL, 0); + +for(int i=1; i<=4; i++){ + switch( i ){ + case 1: x = 10; x2 = 122; break; + case 2: x = 132; x2 = 295; break; + case 3: x = 315; x2 = 398; break; + case 4: x = 408; x2 = 535; break; + default: break; + } bar( x+4, y+3, x2-4, y2-3); + +} + + + + for(CurrRowEprom1 = 1; CurrRowEprom1 < (/*28*/25+1); CurrRowEprom1++) + + if ( (CurrTopLineEprom + CurrRowEprom1 - 1) <= (Eprom1_inx.Fin + 1) ) { + GetLineEprom(); + PrintLineEprom(); + } + +CurrRowEprom1 = tmp; + +} + +// Edit_Item_Eprom +// +// Edita, el campo actual. (Modifica borrando lo anterior.) +// + +void Edit_Item_Eprom(void){ + + char buffer[80], *endptr; + long Fecha; + +struct Eprom_Structura { + + char TP; char FI; char NP; + long DM; char BD; long ID; + char ID_TEXT[15]; + +}; + + switch (CurrColEprom1) { + case 1: + // sprintf(buffer, "%lX", Eprom1.Direccion); + do{ + strcpy( buffer, "\0"); + InputCadenaG_l( buffer, 0, 6, 63, 57, PC[0], CurrRowEprom1-1); + Eprom1.Direccion = strtol(buffer, &endptr, 16); + }while(*endptr!=NULL || Eprom1.Direccion > pow(2, ( (S_Eprom[CurrEprom].DM)) ) ); + // pow(2, ( (S_Eprom[CurrEprom].DM)/8) ) + PutLineEprom(); + PrintLineEprom(); + break; + + case 2: // sprintf( buffer, "%lu", Eprom1.Direccion); + do{ + strcpy( buffer, "\0"); + InputCadenaG_l( buffer, 1, 9/*( ( (S_Eprom[CurrEprom].BD)/8) * 3)*/, 63, 57, PC[1], CurrRowEprom1-1); + Eprom1.Direccion = atol(buffer); + }while( Eprom1.Direccion > pow(2, ( (S_Eprom[CurrEprom].DM) ) ) ); + PutLineEprom(); + PrintLineEprom(); + break; + + case 3: + // sprintf( buffer, "%X", Eprom1.Dato); + strcpy( buffer, "\0"); + do{ + InputCadenaG_l( buffer, 0, ( ( (S_Eprom[CurrEprom].BD)/8) * 2), 63, 57, PC[2], CurrRowEprom1-1); + Eprom1.Dato = strtol(buffer, &endptr, 16); + }while(*endptr!=NULL || Eprom1.Dato > pow(2, S_Eprom[CurrEprom].BD ) ); + PutLineEprom(); + PrintLineEprom(); + if ( (CurrTopLineEprom + CurrRowEprom1 - 2) >= Eprom1_inx.Fin) + AddRecordEprom(); + else Mueve_Abajo_Eprom(); + break; + case 4: + sprintf( buffer, "%u", Eprom1.Dato); + { + strcpy( buffer, "\0"); + InputCadenaG_l( buffer, 1, ( ( (S_Eprom[CurrEprom].BD)/8) * 3), 63, 57, PC[3], CurrRowEprom1-1); + Eprom1.Dato = atoi(buffer); + }while(Eprom1.Dato > pow(2, S_Eprom[CurrEprom].BD )); + PutLineEprom(); + PrintLineEprom(); + if ( (CurrTopLineEprom + CurrRowEprom1 - 2) >= Eprom1_inx.Fin) + AddRecordEprom(); + else Mueve_Abajo_Eprom(); + break; + + default: + return; + } + + PrintLineEprom(); + +} + +// +// +// +// +// +// +// +// + + // Imprimir_Eprom // + // // + // Imprime el programa completo. // + //// + +void Imprimir_Eprom(int desde, int hasta){ + + +int LSJ = sizeof(struct JD); +int LSI = sizeof(struct Eprom_inx); +int LSC = sizeof(struct Eprom_s); + +int lprint = 3, Curr_Eprom = 0; + +if( Comprueba_Impresora()==0 ) return; + +fprintf( stdprn, "\n\r"); + + + fprintf( stdprn, " Direccion Dato \n\r"); + fprintf( stdprn, "\n\r"); + + while( (Curr_Eprom <= Eprom1_inx.Fin) ){ + + fseek(Eprom, (long)LSJ + LSI + ( LSC * Curr_Eprom ), SEEK_SET); // Se coloca + fread(&Eprom1, LSC, 1, Eprom); // Y lee + + fprintf( stdprn, " %10lX %15lu %7X %12u", + Eprom1.Direccion, Eprom1.Direccion, Eprom1.Dato, Eprom1.Dato); + + lprint++; + if (lprint==55) { lprint = 3; + fprintf( stdprn, " Direccion Dato \n\r"); + fprintf( stdprn, "\n\r"); + } + + Curr_Eprom++; + } + + + fprintf( stdprn, "\n\r"); + fprintf( stdprn, " Registrese y obtengan la ultima y mas novedosa versin del software y hardware."); + fprintf( stdprn, "\n\r"); + + fputc(12, stdprn); + + +} + +// +// Comprueba a nivel de BIOS si hay una +// impresora conectada en LPT1 -> DX = 0 +// + +int Comprueba_Impresora(void){ + + unsigned int tmp; + union REGS Impresora_in, Impresora_out; + struct byte { + int a : 1; + int b : 1; + int c : 1; + int d : 1; + int e : 1; + int f : 1; + int g : 1; + int h : 1; + }; + union bits { + char ch; + struct byte bit; + } Imp_out; + + Impresora_in.h.ah = 0x02; + Impresora_in.x.dx = 0x0; + + int86(0x17, &Impresora_in, &Impresora_out); + + return ( Impresora_out.h.ah ? 1 : 0 ); + +} + +// +// +// +// +// +// +// +// + +// Abre_Ficha_Eprom +// +// Abre el archivo contenido en ArchivoDatos, y comprueba que sea +// del formato adecuado y la versin 1.1 +// + +int Abre_Ficha_Eprom(void){ + +CurrRowEprom1 = 1; +CurrTopLineEprom = 1; + +//// +// Comprueba apertura correcta de Indice, y Datos y creacin... // +//// + + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + + if ( (Eprom = fopen( ArchivoDatos, "r+b"))==NULL) { + + FILE *fa; int i; + + if ( (fa = fopen( ArchivoDatos, "wb" ) )!=NULL ) { + + Poner_a_cero_estructura_actual_Eprom(); + Eprom1_inx.Fin = 0; + rewind(fa); + + fwrite(&cabecera, LSJ, 1, fa); fseek(fa, (long)LSJ, SEEK_SET); + fwrite(&Eprom1_inx, LSI, 1, fa); fseek(fa, (long)LSJ+LSI, SEEK_SET); + fwrite(&Eprom1, LSC, 1, fa); + + if (fclose(fa) == EOF ) exit(1); + } + + if ( (Eprom = fopen( ArchivoDatos, "r+b"))==NULL) { + restorecrtmode(); + printf("NO SE PUDO ABRIR EL FICHERO INDICE EN LA 2 PASADA"); + exit(1); + } + } + rewind(Eprom); + if ( fread(&cabecera, LSJ, 1, Eprom) != 1 ) { + restorecrtmode(); + printf("NO SE PUDO LEER EN EL FICHERO: INDICE"); + exit(1); + } + + if(cabecera.esc != 27 || cabecera.pt != 7 || cabecera.ef != 26 ) { + return -1; + // Cabecera no valida ((ERROR LEYENDO ESTRUCTURAS)) + } + + + fseek(Eprom, (long)LSJ, SEEK_SET); + if ( fread(&Eprom1_inx, LSI, 1, Eprom) != 1 ) { + restorecrtmode(); + printf("NO SE PUDO LEER EN EL FICHERO: INDICE"); + exit(1); + } + fseek(Eprom, (long)LSJ+LSI, SEEK_SET); + if ( fread(&Eprom1, LSC, 1, Eprom) != 1 ) { + restorecrtmode(); + printf("NO SE PUDO LEER EN EL FICHERO: DATOS"); + exit(1); + } + + return 1; +} + + +// DeleteRecordEprom +// +// Borra una linea de datos del fichero. +// + +void DeleteRecordEprom(void) { + +unsigned int CurrRecord; + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + +CurrRecord = CurrTopLineEprom + CurrRowEprom1 - 1; + + if ( (Eprom1_inx.Fin == 0) ) BEEP(); else { + + Eprom1_inx.Fin -= 1; + + unsigned int p = CurrRecord - 1; + + while( p <= Eprom1_inx.Fin ) { + + fseek(Eprom, (long)LSJ + LSI + ( LSC * ( p + 1 ) ), SEEK_SET); // Se coloca + fread(&Eprom1, LSC, 1, Eprom); // Y lee + + fseek(Eprom, (long)LSJ + LSI + ( LSC * p ), SEEK_SET); // Se coloca + fwrite(&Eprom1, LSC, 1, Eprom); // Y escribe + + p++; + }; + + fseek(Eprom, (long)LSJ, SEEK_SET); + fwrite(&Eprom1_inx, LSI, 1, Eprom); // Acualiza n de registros + +/* */ if ((CurrRecord - 1) == Eprom1_inx.Fin + 1) CurrRowEprom1--; +/* */ +/* */ PrintWholeScreenEprom(); +/* */ GetLineEprom(); + EditCursorEprom(0); + +// PrintLineEprom(); + } +} + + +// AddRecordEprom +// +// Aade una linea de datos del fichero. +// + +void AddRecordEprom(void){ + +unsigned int CurrRecord= CurrTopLineEprom + CurrRowEprom1 - 1; + + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + double long ExP = 1; + + for(int i=1; i <= ((S_Eprom[CurrEprom].DM)/8); i++ ) ExP = ExP * 256; + +if(CurrRecord < ExP ) { + + long avance = Eprom1_inx.Fin /*+ 1*/; + + while( avance >= (CurrRecord-1) ) { + + fseek(Eprom, (long)LSJ + LSI + ( LSC * avance ), SEEK_SET); // Se coloca + fread(&Eprom1, LSC, 1, Eprom); // Y lee + + fseek(Eprom, (long)LSJ + LSI + ( LSC * (avance + 1) ), SEEK_SET); // Se coloca + fwrite(&Eprom1, LSC, 1, Eprom); // Y escribe + + avance--; + }; + + Eprom1_inx.Fin++; + + fseek(Eprom, (long)LSJ, SEEK_SET); + fwrite(&Eprom1_inx, LSI, 1, Eprom); // Acualiza n de registros + + Eprom1.Direccion ++; + Eprom1.Dato = 0; + + fseek(Eprom, (long)LSJ + LSI + ( LSC * ( CurrTopLineEprom + CurrRowEprom1 - 1) ), SEEK_SET); // Se coloca + fwrite(&Eprom1, LSC, 1, Eprom); // Y escribe + + CurrRowEprom1++; + + if (CurrRowEprom1>25) { + CurrTopLineEprom += /*28*/25; + if ( (CurrTopLineEprom+CurrRowEprom1) > Eprom1_inx.Fin) { CurrTopLineEprom = Eprom1_inx.Fin; CurrRowEprom1 = 2; } + if (CurrTopLineEprom==0) CurrTopLineEprom = 1; + PrintWholeScreenEprom(); + GetLineEprom(); + EditCursorEprom(0); + } else { + GetLineEprom(); + PrintLineEprom(); + } + + EditCursorEprom(0); + + + } + +} + +// PutLineEprom +// +// Guarda la actual linea de datos. +// + +void PutLineEprom(void){ + + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + + int CurrRecord = CurrTopLineEprom + CurrRowEprom1 - 1; + +fseek(Eprom, (long)LSJ + LSI + ( LSC * CurrRecord ) - LSC, SEEK_SET); // Se coloca +fwrite(&Eprom1, LSC, 1, Eprom); // Y escribe + +} + +// GetLineEprom +// +// Obtiene la actual linea de datos. +// + +void GetLineEprom(void){ + + int LSJ = sizeof(struct JD); + int LSI = sizeof(struct Eprom_inx); + int LSC = sizeof(struct Eprom_s); + + int CurrRecord = CurrTopLineEprom + CurrRowEprom1 - 1; + +fseek(Eprom, (long)LSJ + LSI + ( LSC * CurrRecord ) - LSC, SEEK_SET); // Se coloca +fread(&Eprom1, LSC, 1, Eprom); // Y lee + + +} + +// +// +// +// +// +// +// +// + +// +// Copia un archivo +// + + +int fcopy(char *origen, char *destino) { + + + FILE *in, *out; + char ch; + + if((in=fopen(origen, "rb"))==NULL){ + return (-1); + } + if((out=fopen(destino, "wb"))==NULL) { + return (-1); + } + + while(!feof(in)) putc(getc(in),out); + + fclose(in); + fclose(out); + + return 1; +} + +// Poner_a_cero_es... +// +// Inizializa las estructuras de datos de la cabecera y siguientes. +// + +void Poner_a_cero_estructura_actual_Eprom(void){ + + cabecera.esc = 27; strcpy(cabecera.color, "[31;40m"); + strcpy(cabecera.prog, "Jos David Guilln Dominguez"); + cabecera.nl = 13; cabecera.rt = 10; +// strcpy(cabecera.autor, " 6 / Mayo / 1995 "); + cabecera.pt = 7; cabecera.ef = 26; + + strcpy(cabecera.Comentario[0], "\0"); + strcpy(cabecera.Comentario[1], "\0"); + strcpy(cabecera.Comentario[2], "\0"); + strcpy(cabecera.Comentario[3], "\0"); + + Eprom1.Direccion = 0; + Eprom1.Dato = 0; + + +} + +// CompruebaLineasEprom +// +// Comprueba la pulsacin del raton sobre una linea y se posiciona. +// + +void CompruebaLineasEprom(void){ + // Check una pulsacion sobre un campo, y se situa, si es posible + int ok_p=0, inc=0, md=0; + int oldr, oldc; +// Anclar_Raton(); + + do{ + inc++; + if(x_raton >= (PC[(inc)-1].left+2) && x_raton <= (PC[inc-1].right-2) ) { ok_p=1; md = 1; + oldc=inc; } + if(inc==4) ok_p=1; + }while(!ok_p); + if(md==1){ + inc=0; ok_p=0; md = 0; + do{ + inc++; + if( (y_raton >= (PC[(oldc)-1].up+4+(inc-1)*15+2)) && (y_raton <= (PC[oldc-1].up+4+(inc-1)*15+16)) ) { ok_p=1; oldr=inc; md = 1;} + if(inc==25) ok_p=1; + }while(!ok_p); + } + int newc; + + if( (md==1) && ((CurrColEprom1!=newc) || (CurrRowEprom1!=oldr)) ) + { + + if( (CurrTopLineEprom + oldr - 2 )<= Eprom1_inx.Fin ){ + EditCursorEprom(1); + if(oldc!=CurrColEprom1 || oldr!=CurrRowEprom1){ + CurrColEprom1 = oldc; + CurrRowEprom1 = oldr; + GetLineEprom(); + } else EditCursorEprom(0); + } + } + + } diff --git a/EPROM-II.DSK b/EPROM-II.DSK new file mode 100644 index 0000000000000000000000000000000000000000..9d3aa63089a4a7479f81353c1460cc65009168e3 GIT binary patch literal 4738 zcmc&&O>Y}T7=Fe{6VuZ43ka!bYZaPSE^(R$klH|#jXzqqj_uZ)iZ*s#XT2c?CmU_n zApt5OaYsnK!ma!WZb%#uLLhMiao`8gBODNi^31N+?rywplUicOuV?1nnR&lw-dVL_ zE*g<|ByOx)`lc00)#`fWD8&B5!{R8gw~7Y(0bIadmSp}$Zf-1{j>YqN2)s-^pktQ0u(v9W9O>!Y8NoJFC`P>a9LuD6Jaf$CX(-k4! zHfUE$?)WJ6c!eN|ZeS997{F;d$4fYdHM5~FR$>-?sM)L<8no(|(Xg6TWPAf3;s}i& z!ah!mY#6m_BpTBq*u+O7F{u)NJ25S<=Tdks9452 zOnt@J(4kjr7Lxo+Tl$LKDBCS%(bUVSnzmdiC)Z44g@n{a!!lO&b*Qt=M%KmHh_cE! zFcwzrPDyg~fxgA+dko$1f${_=8%O3gDZayt!`rM5^Aej*srEl*f=w z#`X15XKV}~VcNFbBt62LPpA~Bn$OrCz<%xsFCt3i zyoq;k374VbJF`uh>h^!>3O9OFVe~3@}1L_}m}8d$KS%Gca>v z=0rat$A1`cHNSHe$@u0)zFx;v+>|p0N+!Lt`IVVIDICBK+ zgT#lQ9I`6+V7*`QXC?Fh-$9{$b?P~=sCP|Dz|@u7YKU-h{#~-iHDz~ zlL(#xF8A&FEOBQk$5MbCT?2`SX5nU8O}?u(?eZsA`>g|&hr~T3725+Sm5d)5;yVr3 zGp%gNp!KWUJV3xC&ZGz2*@-+&yQJc|{4Luk!{qD`!CPj?vxMN)yIH-xx_4E74}rY@ z|Emw%S?WHYUfL1>x4P=xn^;M8GhL+f@SuBxi@vsP;UVHB^v-p{I5WUxo8T{}h&we9 z<}n^{4h6j7DcI%BGX&PWn$9!>%Mt<=g1_7*?zRZxIfMtIcOmDe?e-PwP3fw)<*rT< zaEWm8Wcy!UlH^{QXo5@Gtrg-G`pB-1T4xiBXVS@RQ`w1-zy*T8B#BFg+S!2rL~oyg z^a#)6u7p-5(P{3WP0=%v9bu=32iWS7c!Ku&XOGKLyABZ_q8)o>t?Oi6TFqNd;yNS* z`|SAdz2ZRTO>$rHmuX_AyKpe21w~EAE!e&G`aIUT)^G9pzD)3!4dS+#!uF1m{7`V9 z110wZLeReU)AX+PC|BCDo0R=R8Gqa+r(kX_A$SMhxlVU0X&8TtU*V)|_wa?dKe{Hf z5Z+guns@(MC4Ox_-};i_3b~^%HLjvDA}>N*->yScL#cVRv`IdhbW6W}5AybbM~{I2 E060(pOaK4? literal 0 HcmV?d00001 diff --git a/EPROM-II.EXE b/EPROM-II.EXE new file mode 100644 index 0000000000000000000000000000000000000000..f804f31ec69cfcb9bab705b7f97298cd3c90b4bb GIT binary patch literal 95062 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 Estandar <-- +}; + +struct Eprom_Structura { + + char TP; char FI; char NP; + char DM; char BD; long ID; + char ID_TEXT[15]; + +}; + +struct Eprom_inx { long Fin; }; + +struct Eprom_s { unsigned long Direccion; unsigned int Dato; }; + +struct JD cabecera; +struct JD cabecera2; +struct Eprom_s Eprom1; +struct Eprom_inx Eprom1_inx; +struct Eprom_Structura far *S_Eprom; +struct boton { int left; int up; int right; int down; } PC[4]; + + +// Prototipos + +void EditCursorEprom_CE(int SH, int CurrRowCE, int CurrTopLineCE); +void Carga_Cien_Elementos(struct Eprom_s *Datos); +void Poner_a_cero_estructura_actual_Eprom(void); +void Imprimir_Eprom(int desde, int hasta); +void Lee_Archivos_Presentes(int add_new); +void PrintEprom_CE_WholeScreen(int tmp); +void PrintWholeScreenCabecera(void); +void EditCursorEprom(int ShowHide); +void Fuente( int Font, int size); +void PrintWholeScreenEprom(void); +void PrintWholeScreenFile(void); +void CompruebaLineasEprom(void); +void Imprime_Eprom_Actual(void); +void Mueve_Arriba_Eprom(void); +void Mueve_Abajo_Eprom(void); +void DeleteRecordEprom(void); +void Salvar_Cargar(int S_C); +void EditCursorFile(int SH); +void Salvar_Cargar(int S_C); +void Edit_Item_Eprom(void); +void Menu_de_Edicion(void); +void PrintLineEprom(void); +void AddRecordEprom(void); +void Edit_Item_File(void); +void PutLineEprom(void); +void GetLineEprom(void); +void InicializaPc(void); +void Escoge_Eprom(void); +void BEEP(void); + +int Leer_en_Eprom(void); +int Abre_Ficha_Eprom(void); +int Comprueba_Impresora(void); +int Lee_Eproms(FILE *fichero); +int LeeCabecera(char *fichero); +int fcopy(char *origen, char *destino); +int InputCadenaG_l(char *s, int numalp, int lmax, int cc, int cf, struct boton Campo, int RoW); + + +// V. Globales + +int CurrRowFile, CurrColFile, CurrTopFile, + CurrRowCom, N_Files; +int N_Eprom = 0; int CurrEprom = 0; +int CurrRowEprom1 = 1, CurrColEprom1 = 1, CurrTopLineEprom = 1; +int key, Modifica_Direccion = 0; +long longitud = 0; + +char ArchivoDatos[]="Eprom_JD.TMP", Archivo[13];; +char *Archivo_list; + + +FILE *Eprom, *EpromC; + diff --git a/EPROM-II.PRJ b/EPROM-II.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..66a232d391e4736ab9a1f398a7afeb55b525c4df GIT binary patch literal 4918 zcmeI0S!^3s6o${lcH$4O6Ni?q&Ug|G-efzX0z>dJ4WUiOOzf~b z0m>o}P(b3Dt?Wx#pMX3=7Z6J~-grmsJ7qZkxJ6XN9XlC{gt$t+{P)~*&$)Aa$8#s? zvX)atNla+!wMxDu4vcP5#7+_xE^Zh2Pm7Yu5uKla zpMhU6%eBMKZ2HQGu(yrP`+)t%Iu1Y{Wa*;Mn0ERV^WIp*fq!FVI|Td=n+}k`1Kdck zF~|-$fM(cQ7#&VVVF5#IWl$S%0MP0Zv8tG^lo=TEivibO@+- zC*)FK8ADhObTMqFLx~JJ12_|K!*&*MHc!^4&SBeXBh2O|mRB%@D}k$k9FPYJfC6j+ zMu2M=GzN?VDs0z5O#o$J61MB1Zh*QGxCyu!xP?Iv0JoxB0j7Xy;5OiP;0^|Dg}M{C z3*Ebcd(gcXxDU7=*akcVJPbSn*j)?<&f`OX)=#uXaFD;3C;M5f@%f0> z3R4ZnvfRB#=%Q7}jM{7J5is@WGxa#v)MK5g$9hwb^GrR?H}$x{)Z;=^kBdw_Ht@#H z7rNDQN%T&VSk%f&F6$|%`D1=o)(!^${p}eNoP6)}1^W2PWY#^tbpc%D0G8&-SbM#V zMU(h0_DG2Y4H}OMUFZ9mn)zA#W%l!~R{GRQmBFN(s3YizrWEUNtJ|e}e6{F~%Fz{p zo|U3I7EfIkOo;A8G9FE&MYqJAXlif;7UyTNa#9^Fh^st#vF-%N$#JJHRMN≦uov zjODf{TCL3KU@BT`Y%X?hbff6KJS=+SqTA}&b6L+^=j_s{TER+4$(2V&YFCg-g}Ek~ zeV$w1D93`)=wY(xq z>R7RM6_b*M_2W=(s{>lQyt<=(z~6=8v7)M##K>q)%W9+9@fwrE(S)VvTesB#Ypna9 zHh-w&8U25oR|R@0#P66k+P>|_dUsXKQI zAEg|e2ki?!Q2jNRjH66 N de Eprom's que se pueden programar +* +* + +* +* +* Sintaxis operativa: +* +* % [TP], [FI], [NP], [DM], [BD], [ID], [ID_TEXT]. +* +* TP -------> Tensin de programacin +* FI -------> Frecuencia de impulso (en micro-segundos). +* NP -------> N de patillas +* DM -------> Direccin mas alta ( en Bit's ) +* BD -------> N de Bit's del dato +* ID -------> Cdigo nmerico identificativo de la Eprom +* ID_TEXT --> Texto indicativo del tipo de Eprom (12 dig + '.') +* +* + +N24 + +% 50, 50, 72, 8, 8, 50312345, Jos David . + +% 50, 50, 72, 16, 16, 23425000, 123PC18 DX/2. + +% 50, 50, 72, 11, 8, 50312340, JD FUTURE 01. + +% 50, 50, 72, 16, 8, 50312345, MICRO CHIPPP. + +% 50, 50, 72, 16, 16, 50312345, Eprom 'HOLA'. + +% 50, 50, 72, 16, 16, 50312345, JD F.V . + +% 50, 50, 72, 16, 16, 50312345, Sol Negro . + +% 50, 50, 72, 16, 8, 50312345, CAPTAIN ZAP . + +% 50, 50, 72, 16, 8, 50312345, Eprom 8 . +% 50, 50, 72, 16, 8, 50312345, Eprom 9 . +% 50, 50, 72, 16, 8, 50312345, Eprom 10 . +% 50, 50, 72, 16, 8, 50312345, Eprom 11 . +% 50, 50, 72, 16, 8, 50312345, Eprom 12 . +% 50, 50, 72, 16, 8, 50312345, Eprom 13 . +% 50, 50, 72, 16, 8, 50312345, Eprom 14 . +% 50, 50, 72, 16, 8, 50312345, Eprom 15 . +% 50, 50, 72, 16, 8, 50312345, Eprom 16 . +% 50, 50, 72, 16, 8, 50312345, Eprom 17 . +% 50, 50, 72, 16, 8, 50312345, Eprom 18 . +% 50, 50, 72, 16, 8, 50312345, Eprom 19 . +% 50, 50, 72, 16, 8, 50312345, Eprom 20 . +% 50, 50, 72, 16, 8, 50312345, Eprom 21 . +% 50, 50, 72, 16, 8, 50312345, Eprom 22 . +% 50, 50, 72, 16, 8, 50312345, Eprom 23 . diff --git a/EPROM.JDF b/EPROM.JDF new file mode 100644 index 0000000..f14df38 --- /dev/null +++ b/EPROM.JDF @@ -0,0 +1,183 @@ +* +* +* Este es el interfaz de rutinas Grficas del programador de Eprom's +* +* lenguaje de interfaz grficos ( JDf ) creado por JD FuTuRe ViSiOn +* +* Por Favor, no modifique el cdigo original. +* +* + +* +* +* Rutinas creadas y totalmente escritas en C estandar. +* +* Libreria BETA ya disponible, Grandes rendimientos GRAFICOS a muy bajo +* +* coste de produccion. ( Precio de la libreria: 1_FUENTE EN C, CPP, ASM ) +* +* + + +1 +************ Toda la Pantalla ********** +& 0, 0, 640, 480, 57, 56, 63, 2, 2 +************ Barra de Ayuda ********** +& 450, 5, 635, 475, 7, 63, 56, 2, 2 + + + + +2 +************ Azul Tapa ********** +& 10, 301, 309, 445, 57, 57, 57, 2, 2 + +************ Direccion ********** +& 10, 5, 300, 445, 7, 63, 56, 1, 2 + +& 15, 10, 122, 40, 0, 56, 63, 1, 2 +& 15, 132, 295, 40, 0, 56, 63, 2, 2 + +& 50, 10, 122, 440, 0, 56, 63, 2, 2 +& 50, 132, 295, 440, 0, 56, 63, 2, 2 + +************ Dato ********** +& 10, 310, 540, 445, 7, 63, 56, 1, 2 + +& 15, 315, 398, 40, 0, 56, 63, 2, 2 +& 15, 408, 535, 40, 0, 56, 63, 2, 2 + +& 50, 315, 398, 440, 0, 56, 63, 2, 2 +& 50, 408, 535, 440, 0, 56, 63, 2, 2 + +************ Letras ********** +| 10, 17, 2, 6, 0, 63, Hex., +| 132, 17, 2, 6, 0, 63, Dec., + +| 315, 17, 2, 6, 0, 63, Hex., +| 440, 17, 2, 6, 0, 63, Dec., + +| 545, 15, 2, 6, 0, 63, Eprom, +| 545, 22, 2, 6, 0, 1, , + | 546, 16, 2, 6, 0, 0, Eprom, + | 546, 23, 2, 6, 0, 63, , + +& 40, 550, 630, 55, 0, 63, 56, 1, 1 + +| 549, 75, 2, 5, 0, 63, Direccin, +| 549, 82, 2, 5, 0, 1, , + | 550, 76, 2, 5, 0, 0, Direccin, + | 550, 83, 2, 5, 0, 63, , + +& 100, 615, 630, 115, 0, 63, 56, 1, 1 +| 545, 195, 2, 6, 0, 63, Cargar, +| 545, 202, 2, 6, 0, 1, , + | 546, 196, 2, 6, 0, 0, Cargar, + | 546, 203, 2, 6, 0, 63, , + +| 545, 237, 2, 6, 0, 63, Grabar, +| 545, 244, 2, 6, 0, 1, , + | 546, 238, 2, 6, 0, 0, Grabar, + | 546, 245, 2, 6, 0, 63, , + +| 545, 286, 2, 5, 0, 63, Leer Eprom, +| 545, 293, 2, 5, 0, 1, , + | 546, 287, 2, 5, 0, 0, Leer Eprom, + | 546, 294, 2, 5, 0, 63, , + + +| 545, 335, 2, 5, 0, 63, Enviar, +| 545, 350, 2, 5, 0, 63, Datos a, +| 544, 356, 2, 5, 0, 1, , +| 545, 365, 2, 5, 0, 63, Eprom, + | 546, 336, 2, 5, 0, 0, Enviar, + | 546, 351, 2, 5, 0, 0, Datos a, + | 545, 357, 2, 5, 0, 63, , + | 546, 366, 2, 5, 0, 0, Eprom, + +| 545, 400, 2, 6, 0, 63, Salir, +| 545, 407, 2, 6, 0, 1, , + | 546, 401, 2, 6, 0, 0, Salir, + | 546, 408, 2, 6, 0, 63, , + +| 545, 140, 2, 6, 0, 63, Imprimir, +| 545, 147, 2, 6, 0, 1, , + | 546, 141, 2, 6, 0, 0, Imprimir, + | 546, 148, 2, 6, 0, 63, , + +3 +& 150, 170, 470, 330, 7, 63, 56, 2, 2 + & 155, 245, 290, 170, 0, 56, 63, 1, 2 + + +& 175, 175, 465, 190, 0, 56, 63, 2, 2 + +& 195, 175, 465, 325, 0, 56, 63, 2, 2 + +| 175, 152, 2, 6, 0, 63, Eprom de [ ], +| 176, 153, 2, 6, 0, 0, Eprom de [ ], + +| 175, 176, 2, 4, 0, 63, TP FI NP DM BD Numero ID Tipo de Eprom, + + +4 + +& 150, 170, 470, 330, 7, 63, 56, 2, 2 + +& 155, 270, 465, 170, 0, 56, 63, 1, 2 + +& 175, 175, 265, 325, 0, 56, 63, 2, 2 + +****** Comentario 4 * 30digitos +& 200, 270, 465, 250, 0, 56, 63, 2, 2 + +& 295, 270, 365, 325, 7, 63, 56, 2, 2 +& 295, 370, 465, 325, 7, 63, 56, 2, 2 + + + +**** Versin ShareWare +| 260, 250, 2, 6, 0, 1, Versin ShareWare, +| 260, 265, 2, 4, 0, 2, V. Completa: Software 5.000 ptas. +| 260, 275, 2, 4, 0, 2, Placa 15.000 ptas. + +| 175, 152, 2, 6, 0, 63, Archivo: , +| 176, 153, 2, 6, 0, 0, Archivo: , + +| 275, 300, 2, 6, 0, 63, Aceptar , +| 276, 301, 2, 6, 0, 0, Aceptar , + | 275, 302, 2, 6, 0, 63, _, + | 276, 303, 2, 6, 0, 0, _, + +| 370, 300, 2, 6, 0, 63, Cancelar , +| 371, 301, 2, 6, 0, 0, Cancelar , + | 370, 302, 2, 6, 0, 63, _, + | 371, 303, 2, 6, 0, 0, _, + +| 270, 180, 2, 6, 0, 63, Comentario: , +| 271, 181, 2, 6, 0, 0, Comentario: , + +*| 175, 176, 2, 4, 0, 63, TP FI NP DM BD Numero ID Tipo de Eprom, + +#2 +!1,8 +$ 10, 545, 635, 60, 7, 56, 63, 2, 1, 00, 18 +$ 70, 545, 635, 120, 7, 56, 63, 2, 1, 00, 32 + +******** Modificar cdigo de chequeo ****************** +$ 130, 545, 635, 180, 7, 56, 63, 2, 1, 00, 23 + +$ 190, 545, 635, 222, 7, 56, 63, 2, 1, 00, 46 +$ 232, 545, 635, 265, 7, 56, 63, 2, 1, 00, 34 + +$ 275, 545, 635, 325, 7, 56, 63, 2, 1, 00, 38 +$ 335, 545, 635, 385, 7, 56, 63, 2, 1, 00, 30 +$ 395, 545, 635, 445, 7, 56, 63, 2, 1, 00, 31 + +!2,2 + +$ 295, 270, 365, 325, 7, 63, 56, 2, 2, 00, 30 +$ 295, 370, 465, 325, 7, 63, 56, 2, 2, 00, 46 + + + diff --git a/EPROM_JD b/EPROM_JD new file mode 100644 index 0000000000000000000000000000000000000000..af3d5c1744ff8c997121d43a7af2daaa150a4992 GIT binary patch literal 197 zcmZvVF%H5o3`M;mA#nj%yt08{V~vE=D=;8Kk~VD;mzZ>5>`^!=sVa5C()a)JlkMH@ zbiAAo0VC-Ybv7UPTbuQ23+xGvV2&8G85sM-b)rDAn%}0BzTJu~baAooz@oys{|==ZB(g87(St0t)vtUiuGCy)$M2 literal 0 HcmV?d00001 diff --git a/EPROM_JD.TMP b/EPROM_JD.TMP new file mode 100644 index 0000000000000000000000000000000000000000..d62027af90d1a03719c58178272e88e66cc9ccbf GIT binary patch literal 349 zcmb`>yAFad7>3~=K~WUXXO|{;0iHHjqKOya;?xLglR^^+4vgG5HlL1+c6jsTOWJgG z+i#DDO+*)!7R={w5wLS6q%30Qt4PGpEX=9$xQ@NNiZtU=OEt8jW>L RnqZmgdNf1l*uOt3%MTKg9U%Y! literal 0 HcmV?d00001 diff --git a/EP_2.CPP b/EP_2.CPP new file mode 100644 index 0000000..c9d52c2 --- /dev/null +++ b/EP_2.CPP @@ -0,0 +1,447 @@ +#include +#include +#include +#include +#include +#include + +#define DIBUJA 1 +#define DEPRIME 2 +#define Dibuja_Todos 3 +#define COMPRUEBA 4 +#define STD_BY 5 + +void Edit_Item(void); +void espera_soltar(void); +void espera_pulsar(void); +void activa_raton(void); +void desactiva_raton(void); +void inicializa_raton_texto(void); +void Pantalla_Leer(void); +void Pantalla_Escribir(void); +void dibuja_pantalla(void); +struct Boton_Texto{ + char x; char y; + char Texto[80]; + + int ID_T1; + int ID_T2; +}; + +int Funcion_Botones(int Funcion, int nBotones, struct Boton_Texto *Boton_Texto); + + struct byte_de_long { unsigned char P3; unsigned char P2; + unsigned char P1; unsigned char P0; + }; + union lngchr{ long Numero; struct byte_de_long Byte; } Division; + ////////////////////////////// + // long --> FF FF FF FF --> 3 34 65 59 + // P0 P1 P2 P3 Dec.89 101 52 3 + ////////////////////////////// Hex.59 65 34 3 +int boton_izq; int boton_der; +int x_raton, y_raton, RATON = 1; +int SWAP = 0; +int Dir, Dato; + +void main(void){ + +struct Boton_Texto BT[6]; +int devolver = 0, i; + +BT[0].x = 58; BT[0].y = 3; strcpy( BT[0].Texto, " P. &Leer "); BT[0].ID_T1 = 76; BT[0].ID_T2 = 0; +BT[1].x = 58; BT[1].y = 6; strcpy( BT[1].Texto, " Iniciar Lec&tura "); BT[1].ID_T1 = 84; BT[1].ID_T2 = 0; + +BT[2].x = 58; BT[2].y = 9; strcpy( BT[2].Texto, " P. &Escribir "); BT[2].ID_T1 = 69; BT[2].ID_T2 = 0; +BT[3].x = 58; BT[3].y =12; strcpy( BT[3].Texto, " Iniciar E&scritura "); BT[3].ID_T1 = 83; BT[3].ID_T2 = 0; + +BT[4].x = 58; BT[4].y =15; strcpy( BT[4].Texto, " &C R E D I T O S "); BT[4].ID_T1 = 67; BT[4].ID_T2 = 0; +BT[5].x = 58; BT[5].y =18; strcpy( BT[5].Texto, " S&ALIR de PDE ... "); BT[5].ID_T1 = 65; BT[5].ID_T2 = 0; + + inicializa_raton_texto(); + if( RATON ) desactiva_raton(); + dibuja_pantalla(); + _setcursortype(_NOCURSOR); + Pantalla_Leer(); +// while( !kbhit() ); +// Pantalla_Escribir(); + +while(devolver != 6) { + devolver = Funcion_Botones(STD_BY, 6, BT); + switch(devolver){ + case 1: Pantalla_Leer(); SWAP = 0; break; + case 2: + Pantalla_Leer(); SWAP = 0; + _setcursortype(_NORMALCURSOR); + Edit_Item(); + _setcursortype(_NOCURSOR); + + break; + case 3: Pantalla_Escribir(); SWAP = 1; break; + case 4: + Pantalla_Escribir(); SWAP = 1; + _setcursortype(_NORMALCURSOR); + Edit_Item(); + _setcursortype(_NOCURSOR); + + break; + case 6: break; + default: + while( kbhit() ) getch(); + break; + } + +} + + textbackground(BLACK); + _setcursortype(_NORMALCURSOR); +clrscr(); + +} + + +void dibuja_pantalla(void){ + + int i; + clrscr(); + highvideo(); + + window(1, 1, 80, 25); + textcolor(9); + textbackground(7); + for(i=0; i<27; i++) // "-.-.-.-.-.-.-.-.-.-.-.-." + cprintf(" "); + + textcolor(BLACK); + gotoxy(1,25); + cprintf("Utilidad para "); textcolor(RED); + cprintf("PDE _ EPROM2.EXE"); textcolor(BLACK); + gotoxy( (80-22), 25); cprintf("Jos David & Francisco"); + +} + +void Pantalla_Leer(void){ + highvideo(); + textcolor(BLACK); + textbackground(7); + gotoxy(3,3); cprintf(""); + gotoxy(17,3); cprintf(""); + gotoxy(3,4); cprintf(" Leer "); + textcolor(WHITE); cprintf(""); textcolor(BLACK); + gotoxy(17,4); cprintf(" Escribir "); + textcolor(WHITE); cprintf(""); textcolor(BLACK); + gotoxy(3,5); cprintf(" Ŀ"); + gotoxy(3,6); cprintf(" "); + gotoxy(3,7); cprintf(" Direccin: "); + gotoxy(3,8); cprintf(" "); + gotoxy(3,9); cprintf(" "); + gotoxy(3,10); cprintf(" "); + gotoxy(3,11); cprintf(" "); + textcolor(RED); + gotoxy(5,11); cprintf("Dato Leido:"); + textcolor(BLACK); + gotoxy(3,12); cprintf(" "); + gotoxy(3,13); cprintf(""); + + textcolor(WHITE); + gotoxy(4,3); cprintf(""); + gotoxy(18,3); cprintf(""); + + gotoxy(14,5); cprintf(""); + gotoxy(46,6); cprintf(""); + gotoxy(46,7); cprintf(""); + gotoxy(46,8); cprintf(""); + gotoxy(46,9); cprintf(""); + gotoxy(46,10); cprintf(""); + gotoxy(46,11); cprintf(""); + gotoxy(46,12); cprintf(""); + gotoxy(46,13); cprintf(""); + +} + + +void Pantalla_Escribir(void){ + highvideo(); + textcolor(BLACK); + textbackground(7); + gotoxy(3,3); cprintf(""); + gotoxy(17,3); cprintf(""); + gotoxy(3,4); cprintf(" Leer "); + textcolor(WHITE); cprintf(""); textcolor(BLACK); + gotoxy(17,4); cprintf(" Escribir "); + textcolor(WHITE); cprintf(""); textcolor(BLACK); + gotoxy(3,5); cprintf(" Ŀ"); + gotoxy(3,6); cprintf(" "); + gotoxy(3,7); cprintf(" Direccin: "); + gotoxy(3,8); cprintf(" "); + gotoxy(3,9); cprintf(" Dato: "); + gotoxy(3,10); cprintf(" "); + gotoxy(3,11); cprintf(" "); + textcolor(RED); + gotoxy(5,11); cprintf("Dato escrito:"); + textcolor(BLACK); + gotoxy(3,12); cprintf(" "); + gotoxy(3,13); cprintf(""); + + textcolor(WHITE); + gotoxy(4,3); cprintf(""); + gotoxy(18,3); cprintf(""); + + gotoxy(4,5); cprintf(" "); + gotoxy(46,6); cprintf(""); + gotoxy(46,7); cprintf(""); + gotoxy(46,8); cprintf(""); + gotoxy(46,9); cprintf(""); + gotoxy(46,10); cprintf(""); + gotoxy(46,11); cprintf(""); + gotoxy(46,12); cprintf(""); + gotoxy(46,13); cprintf(""); + +} + + +int Funcion_Botones(int Funcion, int nBotones, struct Boton_Texto *Boton_Texto){ + + char i, DEVOLVER = -1; + int longitud, key; + + switch( Funcion ) { + case DIBUJA: + highvideo(); + textcolor(BLACK); + textbackground(11); + gotoxy(Boton_Texto[nBotones].x, Boton_Texto[nBotones].y); + DEVOLVER = 0; + longitud = strlen( Boton_Texto[nBotones].Texto ); + while( DEVOLVER <= longitud ) { + if( Boton_Texto[nBotones].Texto[DEVOLVER] == '&' ) { + DEVOLVER ++; + textcolor(RED); + cprintf("%c", Boton_Texto[nBotones].Texto[DEVOLVER]); + textcolor(BLACK); + } else cprintf("%c", Boton_Texto[nBotones].Texto[DEVOLVER]); + DEVOLVER ++; + } + + // cprintf("%s", Texto); + + textbackground(7); // SALIR + cprintf(""); // + gotoxy(Boton_Texto[nBotones].x+1, Boton_Texto[nBotones].y+1); + for(i = 0; i < longitud; i ++ ) // + cprintf(""); // + break; + case DEPRIME: + highvideo(); + textcolor(BLACK); + textbackground(11); + gotoxy(Boton_Texto[nBotones].x, Boton_Texto[nBotones].y); + DEVOLVER = 0; + longitud = strlen( Boton_Texto[nBotones].Texto ); + textbackground(7); + while( DEVOLVER <= (longitud+1) ) { + if( Boton_Texto[nBotones].Texto[DEVOLVER] == '&' ) { + DEVOLVER ++; + } + cprintf(" "); + DEVOLVER ++; + } + textbackground(11); + gotoxy(Boton_Texto[nBotones].x+1, Boton_Texto[nBotones].y+1); + DEVOLVER = 0; + while( DEVOLVER <= longitud ) { + + if( Boton_Texto[nBotones].Texto[DEVOLVER] == '&' ) { + DEVOLVER ++; + textcolor(RED); + cprintf("%c", Boton_Texto[nBotones].Texto[DEVOLVER]); + textcolor(BLACK); + } else cprintf("%c", Boton_Texto[nBotones].Texto[DEVOLVER]); + DEVOLVER ++; + } +// cprintf("%s", Texto); // + // + break; + case Dibuja_Todos: + for( i=0; i < nBotones; i++) + Funcion_Botones( DIBUJA, i, Boton_Texto); + break; + case COMPRUEBA: + if( bioskey(1)!=0 ) { + key = toupper( getch() ); + for( i=0; i < nBotones && DEVOLVER <= -1; i++){ + if( key == Boton_Texto[i].ID_T1 ) { + if( key == 0 ) { + key = toupper( getch() ); + if( key == Boton_Texto[i].ID_T2 ){ + DEVOLVER = (i + 1); + Funcion_Botones( DEPRIME, (DEVOLVER-1), Boton_Texto); + delay(150); + //sleep(1); + Funcion_Botones( DIBUJA, (DEVOLVER-1), Boton_Texto); + } else DEVOLVER = -2; + } else + { DEVOLVER = (i + 1); + Funcion_Botones( DEPRIME, (DEVOLVER-1), Boton_Texto); + delay(150); + //sleep(1); + Funcion_Botones( DIBUJA, (DEVOLVER-1), Boton_Texto); + } + } + } + if( DEVOLVER == -1 ) + { ungetch(key); } + + if( DEVOLVER == -2 ) + { ungetch(0); ungetch(key); DEVOLVER = -1; } + + } else if( RATON ) { + for( i=0; i < nBotones && DEVOLVER == -1; i++) { + longitud = strlen( Boton_Texto[i].Texto ); + if ( (x_raton+1) >= Boton_Texto[i].x && (x_raton+1) <= ( Boton_Texto[i].x + longitud -1) && + y_raton == (Boton_Texto[i].y-1) ) { DEVOLVER = (i + 1); + Funcion_Botones( DEPRIME, (DEVOLVER-1), Boton_Texto); + if( RATON ) activa_raton(); + espera_soltar(); + if( RATON ) desactiva_raton(); +// delay(150); + Funcion_Botones( DIBUJA, (DEVOLVER-1), Boton_Texto); + } + } + } + break; + case STD_BY: + Funcion_Botones(Dibuja_Todos, 6, Boton_Texto); + do{ + if( RATON ) activa_raton(); + if( RATON ) espera_pulsar(); else while( bioskey(1)==0 ); + if( RATON ) desactiva_raton(); + DEVOLVER = Funcion_Botones(COMPRUEBA, 6, Boton_Texto); + }while(DEVOLVER==-1 && bioskey(1)==0 ); + + } + return DEVOLVER; +} + +void inicializa_raton_texto(void) +{ + union REGS ent, sal; + + ent.x.ax = 0; + int86(0x33, &ent, &sal); /* averigua si hay ratn conectado */ + + if(sal.x.ax==0) { RATON = 0; return; } + + ent.x.ax = 15; + ent.x.cx = 8; + ent.x.dx = 16; + int86(0x33, &ent, &sal); /* fija la razn mickey/pixel */ + + ent.x.ax = 7; + ent.x.cx = 0; + ent.x.dx = 639; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. horizontal */ + + ent.x.ax = 8; + ent.x.cx = 0; + ent.x.dx = 199; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. vertical */ + + ent.x.ax = 4; + ent.x.cx = 320; + ent.x.dx = 100; + int86(0x33, &ent, &sal); /* fija la posicin del ratn */ + + ent.x.ax = 1; + int86(0x33, &ent, &sal); /* muestra el puntero del ratn */ +} +void activa_raton(void) +{ + union REGS ent, sal; + + ent.x.ax = 1; + int86(0x33, &ent, &sal); +} + +void desactiva_raton(void) +{ + union REGS ent, sal; + + ent.x.ax = 2; + int86(0x33, &ent, &sal); +} + +void espera_pulsar(void) +{ + union REGS ent, sal; + + do{ + if(bioskey(1)!=0) break; + ent.x.ax = 3; + int86(0x33, &ent, &sal); /* lee posicin y estados del botn */ + }while((sal.x.bx & 3)==0); + boton_izq=sal.x.bx & 1; + boton_der=(sal.x.bx >> 1) & 1; + x_raton= (sal.x.cx >> 1) / 4; // / 8 + y_raton= (sal.x.dx)/8; // /8 +} + +void espera_soltar(void) +{ + union REGS ent, sal; + + do{ + ent.x.ax = 3; + int86(0x33, &ent, &sal); /* lee posicin y estados del botn */ + }while((sal.x.bx & 3)!=0); + boton_izq=sal.x.bx & 1; + boton_der=(sal.x.bx >> 1) & 1; + x_raton=sal.x.cx >> 1; + y_raton=sal.x.dx; +} + + +void Edit_Item(void){ + +char buffer[80]; +char *endptr; + + if( !SWAP ) { + + do{ + strcpy( buffer, "\0"); + gotoxy(16,7); textcolor(RED); + cprintf(" "); + gotoxy(16,7); + cscanf("%10s", buffer ); + + Dir = strtol(buffer, &endptr, 16); + }while(*endptr!=NULL); + + // LEER + } else { + // ESCRIBIR + + textcolor(RED); + gotoxy(16,7); + do{ + strcpy( buffer, "\0"); + gotoxy(16,7); textcolor(RED); + cprintf(" "); + gotoxy(16,7); + cscanf("%10s", buffer ); + Dir = strtol(buffer, &endptr, 16); + }while(*endptr!=NULL); + + do{ + strcpy( buffer, "\0"); + gotoxy(16,9); textcolor(RED); + cprintf(" "); + gotoxy(16,9); + cscanf("%10s", buffer ); + Dato = strtol(buffer, &endptr, 16); + }while(*endptr!=NULL); + + + } + +} diff --git a/EP_2.EXE b/EP_2.EXE new file mode 100644 index 0000000000000000000000000000000000000000..93e43243bc364a981f55e5dfa038273a0d552c39 GIT binary patch literal 24469 zcmeHv3tUvy{_one_v{(=3^Su5z7aF0l;WtIEJY0!2Vda`IEW^Mh=L;6FauTyW7A1t zEB5-Ub?ju?J5O0rp_U;Ss2w{#I_9H?X^%aQ6{&#=&c5HZ_Y9)dJ?Gxfy`OtO_j5O{ zy}#?Xe(UvHzqQtHJ)C=HH8YK9&dAjWEl7cnH>rR{P>`}sG{OqgK3OY3g&9PqRruQa*Ib`3dl#@k@=o@uU(dVs7x9CP-gb!>H$ zRUCUFY=ulT#rltk###yATilVKlj46aW_`ah;@9kn%BV`@wT3+Z5Q#ZfT~{+D{lI{% zBR^cJJ}mywR*OXHlxT5vvDLh&`RF}iJ8y{jXZwZMykkGpN0cOa#x5tUGoe)H8Cy=G zoOjkTvvz98fdS4TH4DY4&-6giHIsHSl++_(%j0AcGMNmIKsgD>D9R$Hh8*Z!8M%T~ zn!H4)a~W$BQ0JXXiM3J3#Qmt`z3T-5*-LK`c|^s4%4}#5&(%z;vS|(s*lr>_{zQB%6IDy@I540xY7Qhlm(+5KCkvizQma)wIq>9? zT3+!igeRZWl0mEYSD)CilsPbp93VFbV6gJcnM*Lj- zD*kI%FRSNn*=4d;O=pJx7{9le6L*V8ybZknO#J7rKH>=k(<;lnOJ|j{G&=tttDKI{ zhYd9(m_!dH38VF{g^ZK8RxM=I1it%&1e(+Y>KbYily+&@9z}MHA+gm_qDDF^*RsSe zoiY)^ChX-j#1Yrh_-OmpQH_sYy~;-AZ6J|r9t~WzOHapn_vo7*O%6;WO^@0Ggfu>y z5&&0ffRD<1gL0(>>{7AH^+F>rVkHuTZX617T5ldnngy;JQcUx)PWOu6BhhK)K|A zF)Hr_k!g-;GPq{S=BT`8%H;qTqj1??nn0RtuYkw)+Neg`>s_Pr zcqVdWDdeb8fha^J#0Yo zPey0>Eq;@ql}6qo*#;Zx+%10M4e;)@2)wml26&f(_f+4^eGPB2JJ^regX}r>EIU&? z=aBaIl?L}))N7G_5wnPq_S}wQEeeyq?3=MjC!On?5!d23MCJ8mq{&gQyE`iq@$D(v@X)SD(xjks#j>BO3$mbR~YFHg=Us+rCHZ7(%%$6 zk$NIU4zWvB&i5GUksxQF4>;=?$ra@MsZYitEz-P4<=n$avy~7Yw2><97e=xvG#zMz zR9ciq8m`dvpmkAcQ#DeQLJI@!>L8`k%QTXp&;-zYD(yv$)Y6yM&j8xLRN7&UbXuWt z(!D5=0eZ4i4Usj{UL}M`;}K#+oafaL0}CP2bizSfqtfnTrDqhHS&9HRi)JZSL*}!R zM+spUb(OMI+EP|3P-xmkCTXflD`TZu3XNYBE8VHm{>Dm)3QY&vK$W(Mm4+%bJ!oc? zwwaasDzq@r+HO`P@B%C86`BCr4=U{?R=U_nl|Za?M5VpLN~aW>5qux1wAWba9||oT zwAWSIR#vK|G*yf8dP9qb^rk915^t(SUX||+R(ec{OSPy-rEO!SGKEI9XpTyIo0aku znpryC3%aoj^;i5vI^0XuqG2j$9V?9ua@JDLf3Q+)knSM_&#SZ#w9*?2%>ddOm9|SOJ)_X57CoTS>a^0M z3XN(}u1c%dN={0f+pw1-#E~wR@Qt>BEM{^TmAMkuSH~#>v%w^3dqTyUdO)1g(Ho(XWElnRu5hXx$=-GqbdW~Enq(~=kLy&mMzqra4*dQKV zd{{~61XA);XsqsG0b2k9oZBPgH{n%DnhkbLa$4!bp58q?%5!Ir41e?=@il3s|Dt?I zkg~)#m9Ihn=+y%{yI(6kh#;NHo3|sBgHbm z4}-$lNEBsjBo)oh$bT!Ev(ZY5zbBfy7+R)FC}nYEhX0n|R7?>Ni~2<6eX5medniRw zDkpwEKEA&EQYh~ zqYV;`gg(e6dMZjxzS2WiG4+N-+gNtmH$ej`-#r8KIqPE>>E8Z!X@)tY($-F+``#xs zW``b%Nh$HRb{Fg0NWA6k#GNJG2L1sG{|$_3V04cJF;KS(>K-gbV8bLkEQO2hC`R5o zA`R%3aa|B29j8Hls@DPkoqrJh-B9$?J#UQu3=Qh2;PNm}c|fjUeRs(exOH+#yYyyM z20Q_G7iiR$C?wD>ZH&r5hO+N7qF7ZB#eUdesQ=rc`d`<*$_6VsbX|?BbQ{FTT>@03 z;-MP@*rrLru(GV{!_Xln#q)K7JLwOqy1xze37LBLGZN8+JS&(RB=;O;y`k!;$r#z6 zrE)5B!~>lZjAqo-w340i8~p^jaHT7B!POGVrB5&y#O0(hG%i|Gk);6U0}At7v=jNU zM%mXeDJ(}=Z`ftn9KJW2z*KD}uyAds?07ZX7sW|77;J*K{1kDAHSw@tiSMtJ%Z%4W zJzg!A>-i%oKNxhBfhO2ep}8)>Ut#i41{zsqXu3Xy&w>mbWk_IS?01inM zegOFGA!)ay*|H1p``r?|rS4jZZb<9LzM-_-r~fc5H6b;XGy+}6D!`4Q`lwc2WIP1x zQja;)BE8xN8jcnp)g?m-ipo2tl?oyd9F_N_R(ifG4YnYtoi;7jCp!>T*itX-$!w=< zKlf|Cg9P!fSYR(9y$qUOR9dN45V^OF%3BBewu!7UizU6EjbNoq#?od|IABkf0OPO8?j~^#S^z*>fbC!j@3yknx$Ktz2zWv1Gip|Owh@Z<1t8aQkUk8%(?YEL1J-r zb~`1#BrAp}a<+p+DNlg{7^FylksBzaq0$3#!yHqp=dz{PA|5+(>d5Jq;6-ujg{ zFtozg#0T`UTsfkG)XFj{t)Z2M1UZNFfh;zLD77RJHq(ItPYm)9MG)R|H#ySzJ>`O! zsrROwNZO}QtR>7W8ULrP03ehERV+=ZoTk$>xB`k zB5Y>_e>3$`j2ZCan&huqkF%e)Cy%J&ZWD?*Zj_(Z*tpkD|Fn&~rV|}T(I#YNir>wx zHw9Y;bE{m!qcLg)V&8^;*>-839Bet1_t2RYFCW#*S8K*s*-%hUOxBAI9@|D5zt%2& z5qNrTgJazjf58aRdghGw@z(Fz-RoMiVo<5Hwwb>@gagZ-rH3p9iGj5+?0 zTNAJ9S$fpRCET8JefuHbg%`W+yYNE)EXYew3+FvI#F36213GG6!D7G9o^nfzO^$Zy zt$W6JZ5FP9b5*+u(BZ=4Dzy3 zo)2e-G48l0g_FzrdOo7K`;D9xr+rVdYTQ)W!NV|-ldt$U#W%S&s#JRi)%P&#t6(uG z%QCXZlpAf`x}mbfxZWU_^{RSycGz&)+twXM@_1G;lIQeX@5_;W(^yZk%=nLZe;&HB zyal}bApX`L7+Z_~BZTPv+wtc7@8GTR|J}1d{@VXCaJ2t<(RL-~FvP&PX8NDnr6+#l zE`j)UyDY@7iEC+XipI?3m1ns)ngB+JOLTm@Vi#>KgX9XkBPbE2#id%-yC=e1euFLjGS;_AUl`K7dA77P(o@MKN+hLm!-wsA83okuR(@^T?x?LeLuR%@FQIyQ7M(I$Su0q|i zuqPEYda_(AC%04_39wVSNM);Vz_DJ2D@}t`=sDyT&!aQlJR00$-C9Gc4vLrFVvqd1UB}$C z|L}ME#Ye4MM-$iJ(Q{q5j=tS}$~r2d^rY1T@4u{Dht#{i(HuPZvG;QV#=u_pMgJk+ z8w47x)E%V^mUu;ba@nlkDQLzz@hjx^6V2_D!{0r!=;*p9U3x^axb%Lr@(ojxsC&)- z;csPQi!W(et}+W}{W_2<$5xRwa3U9O@k6xhgn&cz*2S zjP_jRor34bXlEo)aTm|W!lBdZpXOiww`1x&mpK=&W|HAcm6c((p{@u0TN2@lcrapd zNyH@nT(K;-&YY!*ebx^Y}U5kxp&=&=AQ$06`IjM!fqsJlWFVaqB-C!?!Su z`|Bs=WK&tr=ops{iqIRTHub0eCfcZ&7BL_u8_zhrmv1hO^IXk zzdp+7WvO3vKa;9zJ;ds^Yv*VL{E?) zH+q(P7(5u)dY~vzN~Z!(I$v4m7uK~dFtW|vuDFNN*igyNbyhgv3p`nT+#kEH^_%r8 z_qU#ATf6OE-}R__2Iar?claL#|KS@8D}KJtQ!W#iuJr__-V+3qj|kI{>9?mmLd?8k zt?cKIgeLBgD>OFQgLT(oT6YccA5|NkngFXC_LOke%D&ds(=^uAX`FTSy?k{8Hg&ga zNxbPZeeqr5@k3{tRvy(8BJSQ1L0Zp>#~N2o(#b)eHc@Bq2$)s5(xDqi<2mUEE=NN>nY9k&{( ze`a~~6u_gWxW{gZNVw%Sn#PKA>#&2=Wc!Iu>gViuoyE*PC4IXr53f7_M(d%;Sq&pr zX_ErU=iG6rGgA09k1mp9F5yUEk!(+wON_Lc946EnDt4Ap6Jg4KTC;1Btec%N2ZjKJ zmF4YXdHbFcUa<$d!XD@nOts=i>1Ek3`MzT-OPVn*4sv}D=D2;8$>(t{5lvPl|Jr1` zB+JT-?$=ni4*ym>C?50pqdjf+6?dz8?o61stq11w$JF`!N`K#@tmi5zz2r>}F#dm1 z_#>dkzlXxpp7LK~TtL4-2*(-59w9fF1^e83T4k#&i#3%ttIfWFPnOb_rJ@@wiaKS{KRcT zHy~1JuXi;oZI@v096EGLJb38Tp;K%*CN9U^PSz!lgRWLk!vz{ zrlz1n4zvYeg#}(Ej4KSL2$B-~FkU%*EsvAGhs;V@kguM&dWw!qhQsAur0=m79do;z znH+PdoUL@6r#_dV%JwU)+=%JcRa$TPd4lzWnxUM0UaDyqTcP@5=A~LK&2o$uYqP2a zZJzcbcR1y)K*u?c;h~SGeVI$^X`kipf`&+#I@McvUbCDA;s`SNJPHEMH2V2%(bAIk zsqx1vT0lx5F2lB=(!K3fwl>MpE;`Pmn7732k2ztj;zr-@(vObDz#Zd;RU+NlK6&cO z{bzLGzpefBWx%d6$E{mK{g9RVx1Vk{oGcF$KS3U0VDa74js}7%snR!eNZ+pu%D&c4 zhS<)rwx6t(S};M)bV*6pCM^s%6IKAt)iymUzip7TqmA}_cdMuToP9Yf)wJon3+5-U%#-Zs{W12 z--5mceKCY>N)|BmIk+jUXYJ3=5N5OWSPxBM>(QYiQ-!(poVs?=IMO%S!C8roSTUJ9 zGaKu?k4yOW_|{@U+&u}MvYEYf)mt7QZtlX1{`egy*wuBbPsTU6x?DMTaIdosui~~B z+fM)D@85~=_crm^wP3N~^|sUBv}4UgmvjQnd3asb0`5Sh3#J#xxVoV0h0{vIB7+xW z``m_YynT~Ruy0C&n*=vmpzA*Ays0YECRB|`5^6N>6X_^J$Lmc~gqxREIXKVhwL<;o zDT1;7rW!1Ix~uXevE~RU_zGIPeq^f~yt|1LG zqh@T!m5$>Xo_692^R$~?83!!>`$ucgaangSdoAgGz%sfwh6d|O5~yLe>-YnfS^krw z6WpJ_W2xzSz~X7MxW?6X?K1r20ZT3E`c5?csF8+vOe+b4NCc7meUXrwY*)LqOcv^9 zA;Yncke)8hwuJt38*0qbQd}K~AQ?4!Xxx0+^KHc{>r`PC8jLCoRi|kJxTeUftjWSC zewyHl*aQlZ?vg={lMzfqJY%N`Y)LozNhmhbkFLW8+B{tePH=JCdif2?Z5HdMM@XP< z^F2y{&J|rtns=O)shyNA*rm+@=#Ej^OFtn)YO`JC1%Yhyv$dplORCVs&kzXNMm8r2 zn{5Jy1y0^PN!WA`{Z3YU3N#F>Wo5Cgnqsy0#n@{n#Mq^%pS^o5!CfG_C)jM4el})g zU@Hz{)2ZliL60u-!gM=ID;-lB8gT5BYJtABvv zp*#i}3$*UQJW--j{Ww{xqus5lFi@4;j(Y$gLXriye*rVDRV6aNGx(!@U|yvq4` zT!WZj_HCxx^|2SWQx==!4r3;d+hGBZ$_-0tri|5b4$ z21TY+?;J=^Xq^4Lh3&+f8DPW<*b@|w#T|}!1f0j*TJ$*QA=+~qI^QdcjgS0jkn7Is z6V*`~>j!$cRmI%@YI|6Qw(#m4gp?Ebu-#BSL=D2i?~Zl)J-J|5&B7%L)TY!es= z!DqMnX`mmzPRyHfmAiC9cRu*j4$JBx{4T!2n#7w|OA*8{&MME$vL}4eeS2fR*>L?C* z^2E9t02ON(RDH4m<)sB}h<(0c5Y%VD>LVMkR398c`A4iq)YXw3sXp?o5{E`^P$JS4 zXeezUM>HLhgIz(8gk4&Mts@S*d9H{Z77}xi z-bzD!dx|uJ2F$X@oviu-yMO*8r<8zHyL1-~m@`I}T|IHx4zjL9Ce^t1Mo49(2A97G zwt}B-_??&mO(^DF$kE+1Ry6ItE;Oo^xDleY5P2r@Na+ zP79|M)q&ii0nh-4U0uZ!)h9+Gv*NyDBv0axxSJ)bj9st~1ODDpiR|x=^7t*K7o~v# zF-or#1r_L!b84(OqG^x=?|p+DQn8Gxz!p6MtB67TQ zbzMSr-Rffr)yLvwSb+OiTqc$hb~~{g`iA~pc#-aMmsnQUX^Dk0($6vf5hY9M>QyQ% zD#F-!bQM>k*v4L}ZW4cqX|`65fKF0b@ph_>Sg0Oh4~3K(m*XnY$NXA+^aMTh9h#DO zRA~*BojsOHyG|PkWueH}&np7Pv5;QO#6E_ieb9)eL9tu*4Kkc`jiPdQjSUKXtRnEc zLIOw1B5umX?{%6=b>b1^2H8%)s#Mw&@OMwKO9=tw<~KkOZlVQ(v^!*rd|`#~wwMtQ z5pUz&Z}CTdiXZWm;O;8gcvy8?)<7FYLKo192>V`)d>q#kSlk1RuZL}VoA5{4sHD(ST3j22Bu zI%;i*^iQcYJh-VjTUO>Cm~D!|h9Y~<>7QRi;ts#XNz(T$FH$vRZCp2OPG2#XnJcvD zS0(x#vP^9~hZu=#q#_ZMd5pHwvF|G#0gU*eB1pNC^Iz9855ORjQl!#)WFVsIm9{ID zj!SY0j=bBYgO~+fuZURj!Fs|_>lwQaCY8|0oJuF=Ri$WGVj?fYfMS7)i_RGWs_lL5t}>;6z70Z zrpZESAMEgs;%$Pn>nMJbP-?7l$W^~62HW6PS~x{cu)DE>Kntg1uN%9>g0z{1H0jLu zCumztQv$UV`^qII>?Wi;q}wj0V1^Dz30M{c4xM6bM(jHZ<L?P6)mRp;Mudp^zzc$gdHqq#vZ)7UVgvvC&avE28 zucngg@8U7~fA{SyRXCw$MR(EG7!C~B5Ss1jEg`WSd*vK$hIFZ)28uLLsi28A0|r)y zkv*6qHpMiG4ik`cg$cG(s(7@rJOJZ`A@L=q<%0NmWeN4lvUtTm7-@8hwB$S$H)Q>_;Cl_dZ8!H_>C>;k~Mn!3%gIJ`X|A{tZJfA9bn4j40p;n=)9@2d> zG#FLAf#o7ta@2znX$)A}{WHDg7qOXu8Y_p~SM1VU870z7S1!;#x+jyjig$W#yoT<} zxcY%FpdJ=Uci`Bv>I9u?6+J`2?T-*SBM}}!1_=u=hY?lUYOEYX&;O~UV3}{<xH-lVmHnfx*yyYAz583M-XNVYXt74}JZ$M%+5FGM;j*m|0&xCSWrLY(l_>yD7Y<+{A+@V&R6uVc*KA zym{rVSKgo}1OudI+~zT2_wqg&6qTuS1d64kwoW{1C{0MZTfRP`n)6eR%Azs{6ZhROSB=F=d4UOoc2%KJm29jk z;j0{aY5gy>OBm^nM9maT@zpk*d^?r#pU1TP!l_xxc&$!&wKgHjzTH5ibKlUeQl$&j zSy$=kr9ldk7$A*;G(fC^Sg9X65r@z)>82pUnyZGzLbA^jL8e{RhOQb@pU@zE zE2}#VRgpa_9KF?07O$vayiF({M#q-jWkYa& z9%JLnZdzr+UWrYQ1s?>C6(H0Bi@vHusJ=2It#4N9=fEIhu<>qQ!okOzN;$=(uJJaU z6k(?JJ*QB-caySYYip85Pu$(DVv-5n$XkyE4)0!W9hq))m(rRx>0pRm7kHl%I2%O4 zDyCyVNitb0(~bT~ejAM-Ch=BQmmoG<2j6MGk;$F{QF1s7cnND7eSD*<8;yc85RF@J z^-kAVd~;=LzH|)euq#J=reB>&N8&`CzZbnI1Ag57!6+X{l`L{bMv~Xo9--`XxKD{q zo#syt_cu8!D!SZg6{n+I=5gXLezQ_c-P3XPG4#JEK-~(=^adEW zGFqc(<(RbjR4G}0dazC3%Yh+}v#waE$qIx-f1Q+rC+R^c9{vhaq_&^{Lrgs)f$0{K zo*olWa3hB%stW!&8b!6tXhc1Y$ol@)p%JX_VWO~NWARukJtNY)vT8Ms797U9oeKsB!@=Vs~L`X>Gv z0medvckBjG!$D2dx%no31E@3^w1X?+nz)n}85_VoCK?EJ85v5X zg_;Z2rX(!5R3jdp2b}>E*0oN7V!37+T1wKI__4adBhi};Ho@KBAsNnRR62x8`0FA5 zsj`yZbPeZcePgKy9UfOFLw)O7vZcHiHzu^StLWqE=;|2bi6gxocUi>N;dMCBqQ_ZL ztLv(d?J4JQuSK=|gN*5*#nsUs&f!*x(5|pQ-g*&ese7neNb; zV1Mayt-qv8u_w{tIsy~i-P9vrs93t>gQczaeMxArdfy2}LW{xjs&rgL`moCU#kk9{ zC-b6gy9k-CvRxi6xS^Kq)<#`81|Og*+hyx29q^h*owDd?k2@K2(0h^?PL_?wDeV;x zagI_#O4{QN$28+m*%4_^mzL1HVdgZtx+?vbF5#vl%NS%if%3!LhdDcI{B5X7AI483E2Sn8*fGQ>n zAJfZS{hemJ!n9&7#vN?`a(3yLV;ytBE^HkA&O8vN%mez%85zlR9>9&jGuQU##uqsY zvJ2-&Pl$<$zCC(E(b5N;`3v)0(ZfcL92Ol4oLuNCh$V^nCHeDnqjR0kB4@ZTZeC%L zb4hkV^ipThLTC1pXjiUtNq%9rE5E2P9NUfm>BAeYVSgA{I1qpcI7Q=%tECq_?>PK%x% zovNgeY8^Lia!NGnW>1_L9UB`9>RbPl5Ayikhs<>47v#^+o*%t58zm<+r>y9S_LS-O z43C{SYa*FaRQzysVm3q^ZH=}$vkP|M+O*G25|m|C}b!M)-H?rKr~bPPI`qAy*kF{?F^ewT^V1LMWc!YQ>-&f`4C- zuSqlo_(#Z~VMB|_wPbEU$^d%L%o)AMPmI3tnEjyEN{iEr4g7gUG;eO{) z8G0&@{&yZ49*t`JpM6YS=pP|r^t`FllZXYOpkX>u2$=;M>VF-r0JI5Mr*(cjppAzy z-T8S6wEzG7rxJ)D%zYaCaho)o{%xFY8V#rApOJXnqG!NG$bo z3QgPbbg*c2LU+L!rqLKQ5hjJI*J!$GG#32Pht~;$5+1JUVnRjC8Z}%AB$itX-30}M z35kecBD&L_rXdk57ZKKxk=p%~x4DN|51@;P>>!4Bpa_d#Hk-8KGXUK%<_t?kHAWNP3g|6u0ob18{(W9al6coWUEL<49w1|=yP}|W}99>xC ziY~}6T%0=}He*WIwH9Ls>6JgCxxY84mePUrJqE|A|L;C+DHiq_^!DRq5*bMLl9v_f zMv`6(1H_PKn_72O=F!&);t8_TavcGlP}^uj1CN%DHbyut9b!^xxE5{!1z4q%g%r@? z<^u|F`<0Z?sI*x`3aDAXh5`fmGg%AJ(@5?j{g7DCa59Q)q`*W*lG8}6rWVPZc<1=calJAD8OMV8XN`ef$v#bx1MnK zV!$Q6;1*LrHDfsiec(h2`ogWJpdZ{b6yO|N1^oePDJ2?iCj|pS;3j|{D1|E7Sqg3r z0jh8)FZTH0W>9boTn+{3=EOw-x*2JqUWix>cA`U8> zM2O)*3MQh|nN&zrH|Zq}k_1PuX+Vi__kn`Ra59zOln|H-5Ju%U4UUeN4in^58zBARq1w1&g3lEfg$mIK^RK{`3rE46&yu&-(z)6#TEE)RO*c!M2lVvX!R%0m?%k{zGNv z0ob98f0(0oV*I0z?lomL0C-0k`vKlnhJ1h;WfA~*m1qsSArEyHWymXpd;HDlSj=F< z$Wxj)vQG17@_}XqIjy;q=-H7ZmK{Y>*wLhz9YadkvBbmPO}uOZsbnXTYSuolP#WiR22KMP&9q%(~gcz~vAV zw*Zr7J{iC*A~$mdZ(@BAc}$c~85Ve4t%J4r;5(QSDlCR{J;!XrCY)|0Lb8+O-CN`{-P=S$qqU=%H2QZ*q#k;N>!w5X+exB+ z2brSZNiy{x5~qF_c@#g+_Kd!cyrJJs>h<;LpAF=!eh<3m$E0gm6S0Qvho$ikGA!($ z)lVM+yZ^FJJ ztnfMEg)_t?d`lvP??{yJJ((!{K&A>3xlcGtas)qFAe4!{eA`;de5d!bdWj!{eE^!$&h8gpXl9 z3m?mT6@EAKOZa$(F->4}rin~<(`2TXX$li%n#K$@B{O%MrZb5qJ2TldgGn}}GWVI% zm|W9LW|7Ik6q#l*D@+;8qo&!6Xqv-3W}3@vHf1s|o3fa#ru&$;O!JrqQx3D&G@m(P z%4NPVjfykK6-Y&Ac|ylsAx zsWES0YR!LTJ~D4)J~cnfd}aO{^P~AWrq#TOFM6Fik zS*v-Nc?F{x1K(4c<@BRG{m^?~1C@nu0D5-l*~roPSAl~dAggL$h*kb0ADXtLy$^fh4;f95)BCl<&=rq)9P~> z^zERV;l0|49%-IMc7omo^xo#QAUBK=vyFTRdN)v<=J6f$8uJJSKd4B$gHmfAj`a)X zYt0-Je(s`U6lSol2}MAGfi=V<%W?&Xs5j~iYLI|w4jww$sT9m@;HNVjEK4}l8~lRm z2LTBD#-Lx8QBU{@t(OuB4Wlrdf{ET5Tr435(xtUg(}kQBe#lSx#suT_MtT~|JW;O^ z2aN(htW^A7hmub((*GU0bkUKh8u}GT)Vnl(w_v!YgMXls6Q`^@D4*)@AN&UCo*TZ% zPv!e}-%z@t?~VNY4e5mVLSKgT-$CWpmqhKP-y6#HAD83CeE-NF%J;_ajr^Jp`H)?- z-KnOLIx5uNw3zjH)uCAkLi=F}0(+nitw6{g+UOtCS0jBj(br!3+DBje>FX1`ROWxs z7CS&+pVHSq>FXeU9ip$p^mPQUI(%U|Qr-L)Y?3-f&5qJg{LgJdj?vd~yp#Y2odDgR z^|00KCU!IX3LE-G!{h8(_8j{Y`wM%Cy~4_@iR;G=;3jg@IXgF#dz#zGJ;$BmPxIgL z*05W{hK1b`c30TAut{Nm4SPH6Oc*Qhf=QSv%oJt`_X#<|2f`8IsBlL3Nf=v;S zJHL=5%+H_aUX-1+G`rB1T~LsH^Zg~bDHil((WAHPDWT&xg=%x-psuJeYkZNbs4%zq z=KJ&W3x^F;d|7F^%UneyAzwMREXaQ_JIjgFjzSa@bR~9njw`<;NLC2*bBljN%Pn4- z>qPO~1;yEFQG%4>q5@ZtGI4&sD{HbVcL_~}3TkrlgcQ^pS>;27>O1tw33_u>LUPu$ zS<_M{C6M697V;-&*~cX&CJ_GVUIdH7~!YcyTVukW=8q z2@j$``Z+}fML{?(J7@7iXOX)Q>Czw+7$JE$1gEFn$fBUAG>GVdcMxVxu+L0OMxx3t z=K`83<;FodV9wASC-yq2;IleVj1(k@f1d=?_lJou6ofaF47cVS0R z2V4kMUWOtegbIW}^MU|7w|9*oS;}V_$yz)wkJfPs%GtrFWRo&++_VXfG@3nH(N&~0 z8IZHMfYy)_mln~^n>rz7;>6_1(*YeggHIfnHgQ&lN}oOr{S&g9huWed!NTMhEh>5d2bqe&PJ0Qb=b(fx8$rRz8ppkfL!}3tYL>hlES!xzTRLE@#eCM8vls zw@~>ix`sS(ZGa9Wq3^O_nkeMB)QL${N739v9l1FeXH?IhJA3Zv>>1JFnJ_flxe)D_ zr2yJlCk)LkEXj8kA@?kxX@v__0CiVEYW{$cl=g6~!2G6ucyRk&^j!w0tNk z`n=OwNM)6ZF~XIWzl0`1m7<^o_0P)7&0ab$yOM|O4&_cwA7@9nI*8<` zs;w%mGH@vJQ_zB zb}d#KA*&QUwMZG#gZ*tjy^7!pb-o;1K{l05&V;;dD*6<3fC(k84jHFH!P1K6hy3*7 ziYl>rbd=7@fAD^c3ksZ1d)P8{Tqao$gaB?nkSuyCjKtOILl4PBd)DyS33j^zNarzr zer`!o0qw2h)3BRYs08H}li=h)==f7mRJaiLQ09}wiH_;h92lrlCMKnl^yw*y3K*Y( z!HZIgvkOQrgq>SBe<_9{NO=JgE+|}>lLy}eu3QWm7?hwTr8%g6mWvcaKk!+GUAHtk zwUEh)S!u(R_i*eoW-lZ2mXVxgWd1U+lKJ^0X91NTeH9brmYqjXyLover+}dU&MzSI a^GLFL37tB}BSYM6B=+INK8)ChlK%#As`>Z; literal 0 HcmV?d00001 diff --git a/LITT.CHR b/LITT.CHR new file mode 100644 index 0000000000000000000000000000000000000000..08c30672ea5a18f010183807f55c644c272ab1d4 GIT binary patch literal 5131 zcmaJ_U8o&b72Y$mXV3Y+2kb);9}XoCvBr>q);13%#Gp;gL%%()dLgd%+iCHNpE)DT39NRU!QN+~4|5=s%25X6T*T%-gMImd6UJ#+5OJ>tpf zJ+t>-d;NUtcY69;ozAguo|t@leeLp(Ubr~<#^u%Z$=SmP4^O^4Ir-z&$yX0d4nOns zGsE83FTecLwHLqtgZ0V&?|qT?zIFhAo}L`Ly!O)h)r*r8tLrbUt)5?h@$%~VmxjI1 zlR9Vg4Kc6rCRjJ9ZQ&p&0L#5SNJ*J*iC)FkOx_VRHRPU${)IIg7`b?!s zFPS8Vl4HrGWG#6u`DJoDxtDAwopfJ%Fg=nUPrsA?B%P)=(?6tl)4!$LX(xL;+n*iD zPG)Da3)yNGvR`Ds$==T%WZRk2BmD)vUmwvY^;!MA{-IviS9H*C=(qJ9{gHm4|D{Ly zB>zf&JU^3P$Y05;{Ca*Xe>cCIKgb{E+KkM^95lzxX>-Y}nqaP)8|FRpvH7PN6#I*# z#q-6L;*H{+;%@PvcvzUu6P=@-Go4pEuXk>DKI;6V^PkSBd!T!=d!c)!d$oJB`={>x z?!UXe-oD;by;Hq&y;pkIdcW%3?)|>^N$<0s>W}-A{_*}=|3?3<{%`w#?EkrczrWqr zgYjT8I5c>6aB6UNaBi?VxH6ayt`4pb-X7c;d^q^aV0)m4j}P|^j}A`{&kbK5((vcQ z>%*JF-wod%emuNC{B+nG?HfHcdTw-K^y=u^=*`is(YvEhM%yF3^5n{MD;HPX%3CY% zt=wDr`^v)=Gk$FR#Q4zo+3|PBtK%@fHoh^wHNG?caBR}tn8N5BKgMYO(|mYGHsgBN zV@t4e97$V}_BU%;H5^1nx3}2s6dg!jEQ=yFrrYTz8hdeDt5oaMX#9cQ$jLIoX0Q20S@M zjv$`3BITS56rb~8DG4QI!MntjBA=ggXNAM2gCKlx-OlYM%~}fiRU~IbEQ3@CvYSVH z0u&TYg{xKIRN2xgFIEPHTOpLbf|XHjdk@?EVRJmpYWXm4uY5%?mY;(mJUdv9ZzC)2 zyAl9H=N4rWdNKhhvr3O>2{}757N}-E-f4Z+=n1zq(n(tu%Kl3jAAGE!o3U%!9y@Os7gIAR+E*1l?^ zxRp&VR6w@5!EzhxDhH5uREmP!lDYgN3rY8RqhvH~Fq57bNSfYpM<8#ysFakK6)c7n_SH3eZn773Cwwq*v`) zI5udao|PQgC^H_JEE>8EKMV7KnBUEj?I&=H`m`2U0#&dE|6;sv*qNI{QN%=~LCmGl zGL1C?l?r-s6=W<3Sa8vVG91utv|x8yV1}<`RIkPv81ua5o#)@S=5C& zp_V$fBcft+)*l5aSZs?HLR&dCpT{Wh zzyxRmRf_@)CEDmg{3=C2(3Q{?l>x_%RTS$-EfP}Z6dY<{%mm}nQGhSVVUW}pKX)@b zqxl}4*h4k?mhf4Q1lycg9dYMK;b z-MKP8s`;{xJGv~Nv1M!_qqKZ#i?)`;Xr%(VSj1SD9>$R+ma_jBI}HUP8l@g1OG1XM z>ewyc@mu1NJ!h_Kr>^!>C#ONfUHnbq&_@yG7?fNMZtAAKM)5$9CMDIh#j()xt)>-a zm7gm3J-jB`?ahWAT$VG1z2qC~|JP}Q%Oc`;c+p~SfnK|_i0|Fpm#eo07QXAJg43?b zx_f_FCu;J>=MI^|J+ZXhucok_`wa32(D81GdP}OR>WEhj5YaW!cYUc#6qq2m0n1HP zq?wpykYDIGbM_S5{K&dJGfiKG=fm8k zE_PW^yE)U#U8bF*s?C{8L|6E>cQc?Q)XiZi6aL5;x9K>B1SN?nxglH^ya;!>Dn*@`W5ghG3Y&<=g}#gl%ZU~Sk1Fj^tru&8 zB$g@Xc($9?`AxL!R%gMJR}F4#H?PDV-s6>6D_)I!#5VEdZrsE_pl)#A;lg|TCV}vx z3K|kLCV9(ak1~IS6OU)|nJ1p|Y=+vz_mI~-KcZpsJ?5!^ICw=4a+`JKJ+Yk8U=;YI z)UbXr*YK=~4!}I50(c}W&3%Re3FU};6Qn^2@1;*^XrKd;E(71eTnsJXQI-_n&oU^1 zE(1+4_3(t}P;QtO+M|lbPGS=~Z{7h@o{M+_LA6XHB>|VFN`gVdEI19D6ZpNER;_`i zI24X?I@dC5$2p0sDT_l{ZfAK=68pw3>zJXMph}C4OQ#-ImT(de5>V7})mX01)OL|w z?-U%P%o7;4dWZ%b6_mgUdGpSy7}LNLY>Z-Fn*fJOJ}9DK2*{JN^Iw literal 0 HcmV?d00001 diff --git a/NONAME00.CPP b/NONAME00.CPP new file mode 100644 index 0000000..e1b1ff6 --- /dev/null +++ b/NONAME00.CPP @@ -0,0 +1,33 @@ +#include + + + + + struct byte_de_long { unsigned char P3; unsigned char P2; + unsigned char P1; unsigned char P0; + }; + union lngchr{ long Numero; struct byte_de_long Byte; } Division; + ////////////////////////////// + // long --> FF FF FF FF --> 3 34 65 59 + // P0 P1 P2 P3 Dec.89 101 52 3 + ////////////////////////////// Hex.59 65 34 3 + +void main(void){ + int iP0, iP1, iP2, iP3; + clrscr(); + cscanf("%ld", &Division.Numero ); + cprintf("\r\n"); + cprintf("LONG --> %ld", Division.Numero); + cprintf("\r\n"); + cprintf("Bytes de un long:\r\n"); + iP0 = Division.Byte.P0; + iP1 = Division.Byte.P1; + iP2 = Division.Byte.P2; + iP3 = Division.Byte.P3; + cprintf("P3 --> %d P2 --> %d P1 --> %d P0 --> %d\r\n", iP3, iP2, iP1, iP0); + cprintf("\r\n"); + + + + +} \ No newline at end of file diff --git a/R.BAT b/R.BAT new file mode 100644 index 0000000..83d3219 --- /dev/null +++ b/R.BAT @@ -0,0 +1 @@ +edit eprom.jdf diff --git a/RATON.C b/RATON.C new file mode 100644 index 0000000..7060e44 --- /dev/null +++ b/RATON.C @@ -0,0 +1,574 @@ + +#include +#include +#include +#include +#include + +#define ALFANUMERICO 0x03 +#define GRAFICO 0x13 + +void DIBUJA_BLOQUE_SIN_MASK_CUT(int *, char *, char *); +void DIBUJA_BLOQUE_CON_MASK_CUT(int *, char *, char *); +void VUELCA_PANTALLA(int,int, int,int, int,int, char *); +void pantalla_cine(void); +void cinta_cine(void); +void premios(void); +void premiados(void); +void espera_pulsar(void); +void espera_soltar(void); +void no_hay_raton(void); +void desactiva_raton(void); +void activa_raton(void); +void dibuja_graficos(void); +void inicializa_raton_texto(void); +void inicializa_raton_grafico(void); +void salir_al_dos(void); +void asigna_modo_video(char); +void lee_dibujos(char *); +void descomprime_dibujo(char *); +void asigna_rgb(char *); +void asigna_memoria(void); +void libera_memoria(void); + +int x_raton; +int y_raton; +int y_raton_ant; +int boton_izq; +int boton_der; +int pos_playa [6] = { 0, 0, 0, 0, 320,200 }; +int pos_toalla [8] = { 188, 0, 188,47, 130,152, 87, 47 }; +int pos_sombrilla [8] = { 0, 0, 94, 0, 175,110, 94, 70 }; +int pos_pelota [8] = { 275, 0, 275,23, 185,170, 25, 23 }; +char fichero1 [] = { "raton1.pcx" }; +char fichero2 [] = { "raton2.pcx" }; +int dir_raton [32+32] = { 0x3FFF, /* mscara del cursor */ + 0x1FFF, + 0x0FFF, + 0x07FF, + 0x03FF, + 0x01FF, + 0x00FF, + 0x007F, + 0x003F, + 0x001F, + 0x000F, + 0x0007, + 0x0007, + 0xF81F, + 0xFC0F, + 0xFE0F, + + 0x0000, /* dibujo del cursor */ + 0x4000, + 0x6000, + 0x7000, + 0x7800, + 0x7C00, + 0x7E00, + 0x7F00, + 0x7F80, + 0x7FC0, + 0x7FE0, + 0x7FF0, + 0x0780, + 0x03C0, + 0x01E0, + 0x0000 }; +char color_izq=DARKGRAY; +char color_der=BROWN; +char *dir_carga_dibujos; +char *dir_dibujo1; +char *dir_dibujo2; +char *dir_zona_pantalla; +FILE *handle_dibujos; + +/*//////////////////////////////// PROGRAMA ////////////////////////////////*/ + +void main(void) +{ + union REGS ent, sal; + + asigna_memoria(); + + asigna_modo_video(ALFANUMERICO); + inicializa_raton_texto(); + desactiva_raton(); + pantalla_cine(); + cinta_cine(); + premios(); + activa_raton(); + while(bioskey(1)!=0) bioskey(0); + + do{ + espera_pulsar(); + desactiva_raton(); + if(boton_izq==1) color_izq=LIGHTGRAY; + if(boton_der==1) color_der=YELLOW; + cinta_cine(); + premiados(); + activa_raton(); + espera_soltar(); + desactiva_raton(); + if(boton_izq==0) color_izq=DARKGRAY; + if(boton_der==0) color_der=BROWN; + cinta_cine(); + premios(); + activa_raton(); + }while(bioskey(1)==0); + + asigna_modo_video(GRAFICO); + lee_dibujos(fichero1); + descomprime_dibujo(dir_dibujo1); + lee_dibujos(fichero2); + descomprime_dibujo(dir_dibujo2); + + inicializa_raton_grafico(); + DIBUJA_BLOQUE_SIN_MASK_CUT(pos_playa, dir_dibujo1, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_toalla, dir_dibujo2, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_pelota, dir_dibujo2, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_sombrilla, dir_dibujo2, dir_zona_pantalla); + desactiva_raton(); + VUELCA_PANTALLA(0,0, 0,0, 320,200, dir_zona_pantalla); + activa_raton(); + while(bioskey(1)!=0) bioskey(0); + + do{ + ent.x.ax = 3; + int86(0x33, &ent, &sal); /* lee posicin y estados del botn */ + boton_izq=sal.x.bx & 1; + boton_der=(sal.x.bx >> 1) & 1; + + if((boton_izq==1 || boton_der==1) && + x_raton>=pos_toalla[4]+(pos_toalla[6]/2)-4 && + x_raton<=pos_toalla[4]+(pos_toalla[6]/2)+4 && + y_raton>=pos_toalla[5]+(pos_toalla[7]/2)-4 && + y_raton<=pos_toalla[5]+(pos_toalla[7]/2)+4) { + pos_toalla[4]=(sal.x.cx >> 1)-(pos_toalla[6]/2); + pos_toalla[5]=(sal.x.dx )-(pos_toalla[7]/2); + dibuja_graficos(); + desactiva_raton(); + VUELCA_PANTALLA(0,0, 0,0, 320,200, dir_zona_pantalla); + activa_raton(); + } + else if((boton_izq==1 || boton_der==1) && + x_raton>=pos_pelota[4]+(pos_pelota[6]/2)-4 && + x_raton<=pos_pelota[4]+(pos_pelota[6]/2)+4 && + y_raton>=pos_pelota[5]+(pos_pelota[7]/2)-4 && + y_raton<=pos_pelota[5]+(pos_pelota[7]/2)+4) { + pos_pelota[4]=(sal.x.cx >> 1)-(pos_pelota[6]/2); + pos_pelota[5]=(sal.x.dx )-(pos_pelota[7]/2); + dibuja_graficos(); + desactiva_raton(); + VUELCA_PANTALLA(0,0, 0,0, 320,200, dir_zona_pantalla); + activa_raton(); + } + else if((boton_izq==1 || boton_der==1) && + x_raton>=pos_sombrilla[4]+(pos_sombrilla[6]/2)-4 && + x_raton<=pos_sombrilla[4]+(pos_sombrilla[6]/2)+4 && + y_raton>=pos_sombrilla[5]+(pos_sombrilla[7]/2)-4 && + y_raton<=pos_sombrilla[5]+(pos_sombrilla[7]/2)+4) { + pos_sombrilla[4]=(sal.x.cx >> 1)-(pos_sombrilla[6]/2); + pos_sombrilla[5]=(sal.x.dx )-(pos_sombrilla[7]/2); + dibuja_graficos(); + desactiva_raton(); + VUELCA_PANTALLA(0,0, 0,0, 320,200, dir_zona_pantalla); + activa_raton(); + } + x_raton=sal.x.cx >> 1; + y_raton=sal.x.dx; + }while(bioskey(1)==0); + while(bioskey(1)!=0) bioskey(0); + + salir_al_dos(); +} + +void dibuja_graficos(void) +{ + DIBUJA_BLOQUE_SIN_MASK_CUT(pos_playa, dir_dibujo1, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_toalla, dir_dibujo2, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_pelota, dir_dibujo2, dir_zona_pantalla); + DIBUJA_BLOQUE_CON_MASK_CUT(pos_sombrilla, dir_dibujo2, dir_zona_pantalla); +} + +void inicializa_raton_texto(void) +{ + union REGS ent, sal; + + ent.x.ax = 0; + int86(0x33, &ent, &sal); /* averigua si hay ratn conectado */ + + if(sal.x.ax==0) no_hay_raton(); + + ent.x.ax = 15; + ent.x.cx = 8; + ent.x.dx = 16; + int86(0x33, &ent, &sal); /* fija la razn mickey/pixel */ + + ent.x.ax = 7; + ent.x.cx = 0; + ent.x.dx = 639; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. horizontal */ + + ent.x.ax = 8; + ent.x.cx = 0; + ent.x.dx = 199; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. vertical */ + + ent.x.ax = 4; + ent.x.cx = 320; + ent.x.dx = 100; + int86(0x33, &ent, &sal); /* fija la posicin del ratn */ + + ent.x.ax = 1; + int86(0x33, &ent, &sal); /* muestra el puntero del ratn */ +} + +void inicializa_raton_grafico(void) +{ + struct SREGS seg; + union REGS ent, sal; + long dir; + + ent.x.ax = 0; + int86(0x33, &ent, &sal); /* averigua si hay ratn conectado */ + + if(sal.x.ax==0) no_hay_raton(); + + ent.x.ax = 15; + ent.x.cx = 5; + ent.x.dx = 12; + int86(0x33, &ent, &sal); /* fija la razn mickey/pixel */ + + ent.x.ax = 7; + ent.x.cx = 0; + ent.x.dx = 639; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. horizontal */ + + ent.x.ax = 8; + ent.x.cx = 0; + ent.x.dx = 199; + int86(0x33, &ent, &sal); /* fija la posicin mx. y mn. vertical */ + + dir = (long)dir_raton; + ent.x.ax = 9; + ent.x.bx = 0; + ent.x.cx = 0; + ent.x.dx = (int) dir; + seg.es = (int)(dir >> 16); + int86x(0x33, &ent, &sal, &seg); /* asigna un cursor diferente */ + + ent.x.ax = 4; + ent.x.cx = 320; + x_raton=ent.x.cx >> 1; + ent.x.dx = 100; + y_raton=ent.x.dx; + int86(0x33, &ent, &sal); /* fija la posicin del ratn */ + + ent.x.ax = 1; + int86(0x33, &ent, &sal); /* muestra el puntero del ratn */ +} + +void activa_raton(void) +{ + union REGS ent, sal; + + ent.x.ax = 1; + int86(0x33, &ent, &sal); +} + +void desactiva_raton(void) +{ + union REGS ent, sal; + + ent.x.ax = 2; + int86(0x33, &ent, &sal); +} + +void espera_pulsar(void) +{ + union REGS ent, sal; + + do{ + if(bioskey(1)!=0) break; + ent.x.ax = 3; + int86(0x33, &ent, &sal); /* lee posicin y estados del botn */ + }while((sal.x.bx & 3)==0); + boton_izq=sal.x.bx & 1; + boton_der=(sal.x.bx >> 1) & 1; + x_raton=sal.x.cx >> 1; + y_raton=sal.x.dx; +} + +void espera_soltar(void) +{ + union REGS ent, sal; + + do{ + ent.x.ax = 3; + int86(0x33, &ent, &sal); /* lee posicin y estados del botn */ + }while((sal.x.bx & 3)!=0); + boton_izq=sal.x.bx & 1; + boton_der=(sal.x.bx >> 1) & 1; + x_raton=sal.x.cx >> 1; + y_raton=sal.x.dx; +} + +void no_hay_raton(void) +{ + asigna_modo_video(ALFANUMERICO); + libera_memoria(); + gotoxy(1,1); printf("No hay RATON instalado"); + exit(0); +} + +void salir_al_dos(void) +{ + asigna_modo_video(ALFANUMERICO); + libera_memoria(); + exit(0); +} + +void asigna_memoria(void) +{ + if((dir_zona_pantalla = malloc (64000))==NULL) { + printf("No hay suficiente memoria. Libere programas residentes."); + exit(1); + } + if((dir_carga_dibujos = malloc (65000))==NULL) { + printf("No hay suficiente memoria. Libere programas residentes."); + exit(1); + } + if((dir_dibujo1 = malloc (64000))==NULL) { + printf("No hay suficiente memoria. Libere programas residentes."); + exit(1); + } + if((dir_dibujo2 = malloc (64000))==NULL) { + printf("No hay suficiente memoria. Libere programas residentes."); + exit(1); + } +} + +void libera_memoria(void) +{ + free(dir_zona_pantalla); + free(dir_carga_dibujos); + free(dir_dibujo1); + free(dir_dibujo2); +} + +void asigna_modo_video(char modo) /* asigna el modo de vdeo indicado */ +{ /* en la variable "modo" */ + union REGS ent, sal; + + ent.h.al = modo; + ent.h.ah = 0; + int86(16, &ent, &sal); /* funcin para asignar el modo de video */ +} + +void lee_dibujos(char *fichero) +{ + char *p; + + if((handle_dibujos = fopen(fichero, "rb"))==NULL) { + printf("No se puede abrir el archivo."); + exit(1); + } + p=dir_carga_dibujos; + while(!feof(handle_dibujos)) { + *p++=getc(handle_dibujos); + } + if(fclose(handle_dibujos)!=NULL) { + printf("No se puede cerrar el archivo."); + exit(1); + } +} + +void descomprime_dibujo(char *dir_escritura) +{ + unsigned char byte; + char *dir_lectura; + int columnas, filas, contador; + + dir_lectura=dir_carga_dibujos+128; /* inicio del dibujo comprimido */ + + for(filas=200; filas>0; filas--) { + columnas=320; + dir_escritura-=columnas; dir_escritura+=320; + while(columnas>0) { + byte=(unsigned)*dir_lectura++; + if(byte<=192) { *dir_escritura++=byte; columnas--; } + else { + contador=byte&63; byte=*dir_lectura++; + for(;contador>0;contador--) { *dir_escritura++=byte;columnas--; } + } + } + } + dir_lectura++; + asigna_rgb(dir_lectura); /* remapea los 256 colores del dibujo */ +} + +void asigna_rgb(char *dir_lectura) +{ + struct SREGS seg; + union REGS ent, sal; + unsigned int reg_dx, n; + long int dir; + char *dir_col; + + dir_col=dir_lectura; /* divide entre */ + for(n=256*3; n>0; n--) { /* 4 los colores */ + *dir_col=*dir_col >> 2; dir_col++; + } + + reg_dx=(int)dir_lectura; /* offset de los colores */ + dir =(long)dir_lectura; /* obtiene el segmento */ + seg.es=(int)(dir >> 16); /* donde estan los colores */ + + ent.h.al = 18; + ent.h.ah = 16; + ent.x.bx = 0; + ent.x.cx = 256; + ent.x.dx = reg_dx; + int86x(0x10, &ent, &sal, &seg); /* funcin para asignar los colores */ +} + +void cinta_cine(void) +{ + textcolor(color_izq); + gotoxy(21, 1); cprintf (" "); + gotoxy(19, 2); cprintf (" "); + gotoxy(17, 3); cprintf (" "); + gotoxy(15, 4); cprintf (" "); + gotoxy(13, 5); cprintf (" "); + gotoxy(11, 6); cprintf (" "); + gotoxy( 9, 7); cprintf (" "); + gotoxy( 7, 8); cprintf (" "); + gotoxy( 5, 9); cprintf (" "); + gotoxy( 3,10); cprintf (" "); + gotoxy( 1,11); cprintf(" "); + gotoxy( 1,12); cprintf(" "); + gotoxy( 1,13); cprintf(" "); + gotoxy( 1,14); cprintf(" "); + gotoxy( 1,15); cprintf(" "); + gotoxy( 1,16); cprintf(""); + gotoxy( 1,17); cprintf(""); + gotoxy( 1,18); cprintf(""); + + textcolor(color_der); + gotoxy(79,14); cprintf (" "); + gotoxy(77,15); cprintf (""); + gotoxy(75,16); cprintf (""); + gotoxy(73,17); cprintf (" "); + gotoxy(71,18); cprintf (" "); + gotoxy(69,19); cprintf (" "); + gotoxy(67,20); cprintf (" "); + gotoxy(65,21); cprintf (" "); + gotoxy(63,22); cprintf (" "); + gotoxy(61,23); cprintf (" "); + gotoxy(59,24); cprintf (" "); + gotoxy(57,25); cprintf(" "); +} + +void pantalla_cine(void) +{ + textbackground(BLACK); textcolor(BLACK); clrscr(); + textcolor(BLUE); + gotoxy( 1, 1); cprintf(" "); + gotoxy( 1, 2); cprintf(" "); + gotoxy( 1, 3); cprintf(" "); + gotoxy( 1, 4); cprintf(" "); + gotoxy( 1, 5); cprintf(" "); + gotoxy( 1, 6); cprintf(" "); + gotoxy( 1, 7); cprintf(" "); + gotoxy( 1, 8); cprintf(" "); + gotoxy( 1, 9); cprintf(" "); + gotoxy( 1,10); cprintf(" "); + gotoxy( 1,11); cprintf(" "); + gotoxy( 1,12); cprintf(" "); + gotoxy( 1,13); cprintf(" "); + gotoxy( 1,14); cprintf(" "); + gotoxy( 1,15); cprintf(" "); + gotoxy( 1,16); cprintf(" "); + gotoxy( 1,17); cprintf(" "); + gotoxy( 1,18); cprintf(" "); + gotoxy( 1,19); cprintf(" "); + + textcolor(BLUE); + gotoxy(54,12); cprintf(" "); + gotoxy(54,13); cprintf(" "); + gotoxy(54,14); cprintf(" "); + gotoxy(54,15); cprintf(" "); + gotoxy(54,16); cprintf(" "); + gotoxy(54,17); cprintf(" "); + gotoxy(54,18); cprintf(" "); + gotoxy(54,19); cprintf(" "); + gotoxy(54,20); cprintf(" "); + gotoxy(54,21); cprintf(" "); + gotoxy(54,22); cprintf(" "); + gotoxy(54,23); cprintf(" "); + gotoxy(54,24); cprintf(" "); + gotoxy(54,25); cprintf(" "); +} + +void premios(void) +{ + textcolor(WHITE); + gotoxy(49, 1); cprintf("LXVI EDICION DE LOS OSCARS"); + + textcolor(YELLOW); + gotoxy(45, 3); cprintf("MEJOR PELICULA "); + gotoxy(43, 4); cprintf("MEJOR DIRECTOR "); + gotoxy(41, 5); cprintf("MEJOR ACTRIZ "); + gotoxy(39, 6); cprintf("MEJOR ACTOR "); + gotoxy(37, 7); cprintf("MEJOR ACTRIZ SECUNDARIA "); + gotoxy(35, 8); cprintf("MEJOR ACTOR SECUNDARIO "); + gotoxy(33, 9); cprintf("MEJOR PELICULA EXTRANJERA "); + gotoxy(31,10); cprintf("MEJOR GUION ORIGINAL "); + gotoxy(29,11); cprintf("MEJOR GUION ADAPTADO "); + gotoxy(27,12); cprintf("MEJOR DIRECCION ARTISTICA "); + gotoxy(25,13); cprintf("MEJOR SONIDO "); + gotoxy(23,14); cprintf("MEJOR MONTAJE "); + gotoxy(21,15); cprintf("MEJOR FOTOGRAFIA "); + gotoxy(19,16); cprintf("MEJOR EFECTOS DE SONIDO "); + gotoxy(17,17); cprintf("MEJOR MUSICA ORIGINAL "); + gotoxy(15,18); cprintf("MEJOR CANCION "); + gotoxy(13,19); cprintf("MEJOR VESTUARIO "); + gotoxy(11,20); cprintf("MEJOR EFECTOS VISUALES "); + gotoxy( 9,21); cprintf("MEJOR MAQUILLAJE "); + gotoxy( 7,22); cprintf("MEJOR CORTO DE ANIMACION "); + gotoxy( 5,23); cprintf("MEJOR CORTO DE ACCION EN VIVO "); + gotoxy( 3,24); cprintf("MEJOR LARGOMETRAJE DOCUMENTAL "); + gotoxy( 1,25); cprintf("MEJOR CORTO DOCUMENTAL "); +} + +void premiados(void) +{ + textcolor(WHITE); + switch(y_raton/8) { + case 2: gotoxy(45, 3); cprintf("La lista de Schindler "); break; + case 3: gotoxy(43, 4); cprintf("Spielberg, La lista de Schindler "); break; + case 4: gotoxy(41, 5); cprintf("Holly Hunter, El Piano "); break; + case 5: gotoxy(39, 6); cprintf("Tom Hanks, Philadelphia "); break; + case 6: gotoxy(37, 7); cprintf("Anna Paquin, El Piano "); break; + case 7: gotoxy(35, 8); cprintf("Tommy Lee Jones, El Fugitivo "); break; + case 8: gotoxy(33, 9); cprintf("Belle poque (Espaa), Fernando Trueba "); break; + case 9: gotoxy(31,10); cprintf("Jane Campion, El Piano "); break; + case 10: gotoxy(29,11); cprintf("Steven Zaillian, La lista de Schindler "); break; + case 11: gotoxy(27,12); cprintf("Allan Starski y Ewa Braun, La lista de Schindler "); break; + case 12: gotoxy(25,13); cprintf("Parque Jursico "); break; + case 13: gotoxy(23,14); cprintf("Michael Kahn, La lista de Schindler "); break; + case 14: gotoxy(21,15); cprintf("Janusz Kaminski, La lista de Schindler "); break; + case 15: gotoxy(19,16); cprintf("Parque Jursico "); break; + case 16: gotoxy(17,17); cprintf("John Williams, La lista de Schindler "); break; + case 17: gotoxy(15,18); cprintf("Streets of Philadelphia, Bruce Springsteen "); break; + case 18: gotoxy(13,19); cprintf("Gabriella Pescucci, La edad de la inocencia "); break; + case 19: gotoxy(11,20); cprintf("Parque Jursico "); break; + case 20: gotoxy( 9,21); cprintf("Sra. Doubtfire "); break; + case 21: gotoxy( 7,22); cprintf("The wrong trousers "); break; + case 22: gotoxy( 5,23); cprintf("Schwarzfahrer "); break; + case 23: gotoxy( 3,24); cprintf("I am a promise:child. of Stanton Elementary School"); break; + case 24: gotoxy( 1,25); cprintf("Defending our lives "); break; + } +} + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1be9a9b --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +#EPROM +*11/11/1991* +ToDo: wwtcf? + +![screenshot](/EPROM.png "Screenshot")