From b4ad5f43f26b4d932fc48beef96c0363ed9a692f Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 8 Sep 2021 21:27:06 +0200 Subject: [PATCH] First commit 10/06/1992 --- 0.PCX | Bin 0 -> 1525 bytes 3.PCX | Bin 0 -> 1742 bytes EGAVGA.BGI | Bin 0 -> 5554 bytes FREC.IMG | 280 +++++++++++++++++++ LITT.CHR | Bin 0 -> 5131 bytes LLAVE.CPP | 758 +++++++++++++++++++++++++++++++++++++++++++++++++++ LLAVE.EXE | Bin 0 -> 98686 bytes LLAVE.FNT | Bin 0 -> 4096 bytes LLAVE.IMG | 240 ++++++++++++++++ LLAVE.PRJ | Bin 0 -> 6016 bytes LLAVE_FL.CPP | 752 ++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 9 + TEST1.LLV | Bin 0 -> 34488 bytes 13 files changed, 2039 insertions(+) create mode 100644 0.PCX create mode 100644 3.PCX create mode 100644 EGAVGA.BGI create mode 100644 FREC.IMG create mode 100644 LITT.CHR create mode 100644 LLAVE.CPP create mode 100644 LLAVE.EXE create mode 100644 LLAVE.FNT create mode 100644 LLAVE.IMG create mode 100644 LLAVE.PRJ create mode 100644 LLAVE_FL.CPP create mode 100644 README.md create mode 100644 TEST1.LLV diff --git a/0.PCX b/0.PCX new file mode 100644 index 0000000000000000000000000000000000000000..e1021fd0da6e96bf85cdb9b2279e9b06aa494ac3 GIT binary patch literal 1525 zcmb7?O>Pr$48>g#5<=Vo_C7>UVTmQnNWFwF(M$LWU1cUo(}Idvn9D?}`Pl=7ZD%H# z@z?Y7^Z&!UtM|h7iTf+}tFNoiawVVNetGli$|?9+@>JhT4keEzYb~|NxmH>Do%pS_ zPK5Z8&=K=Q^3nx7_w~T{vIY0#-`B4;R@v79<17!2%1zQy_LnnNjd~)yT<|=fw({dR z4zlhRoL$@f*2}WPlwJS+_!}Fz%ktcrLjJNlLAF^f7hFfdo@gVCf4$I@{AGh_1{5=G z|Hy6XWuQ=&pQ8`z1|^FJNM(~e?FFe z@enx7$7XJx?Hhty(toc;`&0H(K(}tSl}@AK(e}pVFRhKxOR&p6a`H^XMM5M+3R}fg zTqRUerL;55#7)8^O==3v#a+TBU25tr#6uz^Lu%kG#Zw|BQ)aHH@sa^^-I@1blz^LxAad3ruy4R=x73>Jl@ETEIMmW+ly+$L5k{#t) zULzTbA|aX~5~_%XX}Cscq(&*KFf>y#7IQ$nC58*l=mtD^01(H)l@T=yKn18^XGYCF z5Cvw0v!Z4_ER*fAF80GhMAI}~Gc;4Pl!c%-0;4DrqFJvK85j(7CSw%1Lk%u8qZ{zx zkxm>3SIzEO04hKQyXGixjyO1+6pjXGL9|TEwL&YkN;wOxn%%NYw#T~q=&%7qWD?*| p5!p}$85j(7CSw$sLJcl7qZ{y4lTIAR_4W15&CTuY?Ygd2^&9!ONqhhR literal 0 HcmV?d00001 diff --git a/3.PCX b/3.PCX new file mode 100644 index 0000000000000000000000000000000000000000..c7c9785f10fe52a9db82f919f6d94585dd2526ec GIT binary patch literal 1742 zcmb7@O>P`V423BN0Rkg;i1s{$PC+0`F9*;icnMvCSMX}OMv7uP+3_?3i22AG3E8@P zy1R-$kB^TvpMSmkO}PHx{=)s!*WJC`$^9>Xe){RmN%$e>T0H#zp5-A&{ndt}ZMJYXE&kN7O)>)TXx4k{`JdR#Xaz`{A(X2jjHq0&RsApO7GH94~%KLYfT=4(Xcnz^j z_IlMTuBOqyHLGViUtfFsk&fdc#}&uhRBtLxxs4ZDCotdmvZqqhTG!)*O-}ucbMtG& z<9fVxf{=EcUMSx*+K%yAu#6vTlj7BIOBPATMq`5!b>?@-1rp~s5Xjx4?A(U9@|@(f z8h7iwB|g`;W=A5}XT%{95+iR{I+03~w8UNi4#Q^OAsvh1b&R);n@>MWzR$Pi8PkV- z_V2Z@P6RFPz>oL|yX}S*{tZnz);9vTh;C{E_P4Dau$hc&&R~0IzK!_5m{*bG>mmJH z^PcVcDyvOn+@FKZ1YG*N?}_M`alXGu-jO>9*zxZoyBa{d+ z0~jPyiN$H6W@@e$YN=M*wYl6Z%+joe3VU}8w{)vvhTFp;EW>Ju676Y`mT5J-N%pcR z%d(m_Xp24|4pXR!x~aQ*sHb`<)Tm4;umK~x+s42Z?&)5m0#w*Xc!t-A0yEr^p6N9j zL6qny&+;0{P!tK#43SVpG)%)aLL)UwQH7@IlD6mr;w>>;C`L8l!2uw)o&lf&RM^)X1p8I)RS> literal 0 HcmV?d00001 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/FREC.IMG b/FREC.IMG new file mode 100644 index 0000000..4620d15 --- /dev/null +++ b/FREC.IMG @@ -0,0 +1,280 @@ +* +* ATENCION, ESTE ES EL CàDIGO FUENTE DE MIS LIBRERIAS PARA GENERAR FONDOS +* Y PULSADORES. +* +* VERSION DEL CODIGO COMPILABLE EN TIEMPO DE EJECUCION +* +* UTILICE EL PROGRAMA MK_BOTON.EXE PARA CONVERTIR A C++ +* Y COMPILARLO JUNTO AL CODIGO FUENTE DE LA APLICACION. +* +* El autor de este programa vende LAS LIBRERIAS que el mismo a fabricado +* y con las que estan ello este programa: +* +* MAKE_BOTON 5.000 ptas ( Crea Pulsadores y FX's sin esfuerzo ) +* WAVE_GENER 5.000 ptas ( Muestreador y retocador completo ) +* FX_PACK 5.000 ptas ( N§s Grandes, Letras Despl, MouseP... ) +* WAVE_PLAY 3.500 ptas ( Librerias de reproducci¢n de waves +* de hasta 32 TeraBytes con solo 8 Kb ) +* XMS_MEMMGR 3.500 ptas ( Clase para manejar la XMS ) +* B_DATOS 5.000 ptas ( Clase " la gestion de bases de datos ) +* +* Ú---> 15.000 <---Â---> 15.000 <---Ä---> 15.000 <---Â---> 15.000 <---¿ +* Ã---> 15.000 <---´ TODO EL KIT POR SOLO Ã---> 15.000 <---´ +* À---> 15.000 <---Á---> 15.000 <---Ä---> 15.000 <---Á---> 15.000 <---Ù + + + +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ +* Û Û +* Û Pantalla Principal Û +* Û Û +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +­1 + + +* Cuadro de ondas +& 0, 120, 640, 480, 7, 63, 56, 2, 2 +& 5, 125, 635, 284, 0, 56, 63, 1, 2 +& 5, 288, 635, 313, 1, 56, 63, 1, 2 +& 5, 317, 635, 475, 0, 56, 63, 1, 2 + +* Cuadro de numeros +& 0, 0, 240, 120, 7, 63, 56, 2, 2 +& 8, 8, 232, 82, 0, 56, 63, 2, 2 +& 8, 87, 232, 112, 0, 56, 63, 2, 2 + +* Cuadro de Botone +* +* COMIENZA EL JUEGO... ( JD EL GENIO DE GENIOS... ) +* +* + +#5 + +!1, 33 + +* Boton Seleccion Generador/Osciloscopio +$ 240, 0, 315, 24, 7, 63, 56, 2, 2, 00, 00 + * Boton ejecutar accion GENERAR/OBTENER onda + $ 315, 0, 340, 24, 7, 63, 56, 2, 2, 00, 00 +* ???????????????????????????????????? +$ 240, 24, 315, 48, 7, 63, 56, 2, 2, 00, 00 + * ???????????????????????????????????? + $ 315, 24, 340, 48, 7, 63, 56, 2, 2, 00, 00 + +* Boton Salvar +$ 240, 48, 340, 72, 7, 63, 56, 2, 2, 00, 00 +* Boton Cargar +$ 240, 72, 340, 96, 7, 63, 56, 2, 2, 00, 00 + +* Boton Salir +$ 240, 96, 340, 120, 7, 63, 56, 2, 2, 83, 00 + + +* Boton Ayuda on-Line +$ 340, 0, 365, 30, 7, 63, 56, 2, 2, 00, 00 +* Boton Creditos +$ 340, 30, 365, 60, 7, 63, 56, 2, 2, 00, 00 +* Boton REGISTRO / MI LICENCIA +$ 340, 60, 365, 120, 7, 63, 56, 2, 2 + + +* Cuadro/Boton Amplitud +& 540, 0, 615, 24, 7, 63, 56, 2, 2 + $ 542, 2, 613, 22, 0, 56, 63, 2, 2, 00, 00 +& 540, 24, 615, 48, 7, 63, 56, 2, 2 + $ 542, 26, 613, 46, 0, 56, 63, 2, 2, 00, 00 +* Cuadro/Boton unidad +& 611, 0, 640, 24, 7, 63, 56, 2, 2 + $ 613, 2, 638, 22, 0, 56, 63, 2, 2, 00, 00 +& 611, 24, 640, 48, 7, 63, 56, 2, 2 + $ 613, 26, 638, 46, 0, 56, 63, 2, 2, 00, 00 + +* Botones de cursor y acciones mas precisas para estos + * + $ 615, 48, 640, 72, 7, 63, 56, 2, 2, 00, 73 + * --------->>>>>> Flecha derecha + $ 615, 72, 640, 96, 7, 63, 56, 2, 2, 00, 77 + * Marcar Parte de la onda + $ 615, 96, 640, 120, 7, 63, 56, 2, 2, 00, 81 + + * ^^^^^ Flecha arriba + $ 590, 48, 615, 72, 7, 63, 56, 2, 2, 00, 72 + * Centrar cero + $ 590, 72, 615, 96, 7, 63, 56, 2, 2, 00, 00 + * \/ \/ \/ \/ \/ Flecha abajo + $ 590, 96, 615, 120, 7, 63, 56, 2, 2, 00, 80 + + * + $ 565, 48, 590, 72, 7, 63, 56, 2, 2, 00, 71 + * <<<<<<-------- Flecha izquierda + $ 565, 72, 590, 96, 7, 63, 56, 2, 2, 00, 75 + * Ground ( Tierra ) + $ 565, 96, 590, 120, 7, 63, 56, 2, 2, 00, 79 + +* Selecciona la onda completa +$ 540, 48, 565, 120, 7, 63, 56, 2, 2, 00, 00 + +* Creacion de onda predefinida + * Estancar proceso + $ 365, 0, 395, 24, 7, 63, 56, 2, 2, 00, 00 + * Retroceder tipo de onda + $ 395, 0, 424, 24, 7, 63, 56, 2, 2, 00, 00 + * Onda pred. 1, 2, 3 + $ 424, 0, 453, 24, 7, 63, 56, 2, 2, 00, 00 + $ 453, 0, 482, 24, 7, 63, 56, 2, 2, 00, 00 + $ 482, 0, 511, 24, 7, 63, 56, 2, 2, 00, 00 + * Avanzar tipo de onda + $ 511, 0, 540, 24, 7, 63, 56, 2, 2, 00, 00 + + +$ 365, 24, 424, 48, 7, 63, 56, 2, 2, 00, 00 +* +$ 424, 24, 482, 48, 7, 63, 56, 2, 2, 00, 00 +* +$ 482, 24, 540, 48, 7, 63, 56, 2, 2, 00, 00 + +* | 397, 50, 2, 4, 0, 63, MMMMMMMMM-MMMMMMMMM-MMMMMMMMM-, + +­2 + +| 240, 50, 2, 6, 0, 63, Salvar, +| 241, 51, 2, 6, 0, 0, Salvar, +| 240, 74, 2, 6, 0, 63, Cargar, +| 241, 75, 2, 6, 0, 0, Cargar, +| 240, 98, 2, 6, 0, 63, Salir, +| 241, 99, 2, 6, 0, 0, Salir, + | 240, 99, 2, 6, 0, 63, _, + | 241, 100, 2, 6, 0, 0, _, + +| 614, 108, 2, 2, 0, 63, Marca, +| 615, 109, 2, 2, 0, 0, Marca, +| 563, 107, 2, 4, 0, 63, GND, +| 564, 108, 2, 4, 0, 0, GND, +| 382, 1, 2, 4, 1, 63, CRT, +| 383, 2, 2, 4, 1, 0, CRT, + +!2, 1 +$ 204, 274, 276, 291, 7, 56, 63, -2, 1, 00, 30 + +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ +* Û Û +* Û Casilla de pregunta ( OPTAR por.... ACEPTAR CANCELAR Û +* Û Û +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +­100 +& 200, 212, 440, 267, 7, 56, 63, 2, 1 +& 205, 217, 435, 262, 7, 63, 56, -2, 1 + +* Boton Aceptar +& 200, 270, 280, 295, 7, 63, 56, 2, 1 +* Boton Cancelar +& 360, 270, 440, 295, 7, 63, 56, 2, 1 + +­101 +| 200, 274, 2, 5, 0, 63, Aceptar, +| 201, 275, 2, 5, 0, 0, Aceptar, + | 200, 274, 2, 5, 0, 14, A, + | 201, 275, 2, 5, 0, 0, A, + + +| 340, 274, 2, 5, 0, 63, Cancelar, +| 341, 275, 2, 5, 0, 0, Cancelar, + | 340, 274, 2, 5, 0, 14, C, + | 341, 275, 2, 5, 0, 0, C, + + +!3, 2 +* Boton Aceptar +$ 204, 274, 276, 291, 7, 56, 63, -2, 1, 00, 30 +* Boton Cancelar +$ 364, 274, 436, 291, 7, 56, 63, -2, 1, 00, 46 + + +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ +* Û Û +* Û File Browser Û +* Û Û +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +!4, 4 + +*Cuadro Cancelar +$ 377, 169, 391, 221, 7, 56, 63, 0, 1, 00, 46 +*Boton Aceptar +$ 377, 223, 391, 276, 7, 56, 63, 0, 1, 00, 30 + +* Subir +$ 377, 278, 391, 303, 7, 56, 63, 0, 1, 00, 72 +* Bajar +$ 377, 305, 391, 330, 7, 56, 63, 0, 1, 00, 80 + + + +* x y fuente tama¤o orientacion color texto + +* Men£ para Cargar o Salvar +­10 + +*Cuadro Total +& 240, 140, 400, 340, 7, 63, 56, 2, 1 +& 243, 143, 397, 337, 7, 56, 63, -2, 1 +*Cuadro Informativo +& 250, 150, 391, 164, 7, 56, 63, -0, 1 +*Cuadro introduccion nuevos datos +& 250, 169, 375, 180, 0, 56, 63, 0, 1 +*Cuadro de muestreo +& 250, 185, 375, 330, 0, 56, 63, 0, 1 + +*Cuadro Cancelar +& 377, 169, 391, 221, 7, 56, 63, 0, 1 +*Boton Aceptar +& 377, 223, 391, 276, 7, 56, 63, 0, 1 + +* Subir +& 377, 278, 391, 303, 7, 56, 63, 0, 1 +* Bajar +& 377, 305, 391, 330, 7, 56, 63, 0, 1 + +|377, 169, 2, 4, 1, 63, Cancelar, + |378, 170, 2, 4, 1, 0, Cancelar, + |377, 169, 2, 4, 1, 2, C , + |378, 170, 2, 4, 1, 0, C , +|377, 223, 2, 4, 1, 63, Aceptar , + |378, 224, 2, 4, 1, 0, Aceptar , + |377, 223, 2, 4, 1, 2, A , + |378, 224, 2, 4, 1, 0, A , + +|377, 288, 2, 4, 0, 63, -, + |378, 289, 2, 4, 0, 0, -, +|377, 315, 2, 4, 0, 63, +, + |378, 316, 2, 4, 0, 0, +, + + + +******************************************************************************** +**** Prueba del pulsador derecho... ******************************************* +******************************************************************************** +!5, 7 +* Boton Cerrar seleccion derecho +$ 0, 0, 25, 52, 7, 63, 56, 2, 2, 00, 00 + +* Boton seleccion DISPERSION +$ 30, 0, 105, 24, 7, 63, 56, 2, 2, 00, 00 +$ 50, 3, 103, 21, 0, 56, 63, 2, 1, 00, 00 + +* Boton seleccion PRESICIàN +$ 30, 29, 105, 52, 7, 63, 56, 2, 2, 00, 00 +$ 50, 32, 103, 49, 0, 56, 63, 2, 1, 00, 00 + + * Subir selecci¢n + $ 110, 0, 135, 24, 7, 63, 56, 2, 2, 00, 00 + * Bajar selecci¢n + $ 110, 29, 135, 52, 7, 63, 56, 2, 2, 00, 00 +* TODO EL CUADRO MIDE: (0, 0) - (135, 52) +******************************************************************************** +******************************************************************************** +******************************************************************************** + diff --git a/LITT.CHR b/LITT.CHR new file mode 100644 index 0000000000000000000000000000000000000000..08c30672ea5a18f010183807f55c644c272ab1d4 GIT binary patch literal 5131 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 literal 0 HcmV?d00001 diff --git a/LLAVE.CPP b/LLAVE.CPP new file mode 100644 index 0000000..e0ccddf --- /dev/null +++ b/LLAVE.CPP @@ -0,0 +1,758 @@ +#define SEC_OPTAR 2 +#define ENCUADRE 3 + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "..\libs\make_bot\make_bot.h" // Fuciones de MAKE_BOTON + +#define PULSO_QUE_CABEN 48 +#define ANCHO_PULSO 12 +#define ALTO_PULSO 12 +extern void ponicono(int x,int y,char matriz[18][18], char pos); +extern char flecha [18] [18]; + +typedef struct + { + int x, y; // Coordenadas iniciales de muestreo + char ndigitos; // n£mero de digitos a mostrar + char AX, AY; // factor de espaciado + char C1, C2, C3; // colores de fondo, texto, borde + + // Datos privados y uso interno exclusivamente + unsigned int Flen; // longitud de la frase actual + char BitByte; // bit del byte por el que va en el recorrido + char currByte; // byte actual dentro de la frase + } p_Ampliada; + +#define OFF 0 +#define ON 1 + +#ifdef __cplusplus + #define __CPPARGS ... +#else + #define __CPPARGS +#endif +#define INTR 0X1C /* The clock tick interrupt */ + +char count = 0, intvect = OFF, IntVect = OFF; + +extern int Optar( int optar, ...); + +void AnulaInterrupcion(void); +void interrupt handler(__CPPARGS); +void interrupt ( *oldhandler)(__CPPARGS); +char *ptr_char; + +void DibujaPulsos( long comienzo, char bit, char far *Datos, int x, int y, char color, long TotalPulsos ); +void LeeFuentes(char *file); +void Fuente_Amplia( char *Frase, p_Ampliada far *FA ); +void DibujaFondo(void); +void DibujaSeparadores( int X1, int Y1, int X2, int Y2, char color ); + +void Error( int code, char *MensajeError ); + +void BorraPantalla(void); +void ComienzaRutina(void); + +extern char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ); + +long InicioPulso[6][2]; + +void CargarOnda( char *file, char far *Datos, char Ventana ); +void SalvarOnda( char *file, char far *Datos, char Ventana ); + +char far *Datos[2]; + +int TiempoEspera = 5, DIR_LPT = 0x378, ANGULO = 0; + +int main( int argc, char *argv[] ) +{ + + int i; + long j; + char buffer[4][80] = { "Jos‚ David Guill‚n || _-ùFuTuRe ViSiOnù-_ || 1996 (c)", + " ", + " e-mail: Jose-David.Guillen@cs.us.es ", + " " }; + + if ( argc == 2 ) + { + TiempoEspera = atoi(argv[1]); + if ( TiempoEspera < 0 || TiempoEspera > 1000 ) + TiempoEspera = 5; + } + if ( argc == 3 ) + { + DIR_LPT = atoi( argv[2] ); + if ( DIR_LPT < 0 ) + DIR_LPT = 0x379; + + } + if ( argc == 4 ) + { + ANGULO = atoi( argv[3] ); + if ( ANGULO < 0 ) + ANGULO = 0; + + } + + + if ( atexit( AnulaInterrupcion ) != 0 ) + intvect = OFF; + else + intvect = ON; + + True_Push = ON; PunteroRaton = 1; + Initialize( 9, 2 ); // Inicializa el Modo Gr fico + inicializa_raton_grafico( 0, 0, 639, 479 ); + setrgbpalette(EGA_WHITE, 56, 58, 59 ); + setrgbpalette(EGA_LIGHTGRAY, 30, 37, 43 ); + setrgbpalette(EGA_DARKGRAY, 24, 27, 30 ); + + if ( carga_botones( "llave.img" ) != OK ) Error( 0x03, "Make Boton, no pudo cargar los botones" ); + + if ( ( Datos[0] = (char far *)farcalloc( 100000, sizeof(char) ) ) == NULL ) + { + Optar( 0, "ERROR DE MEMORIA", "Memoria insuficiente", "para la primera forma", "de onda.", NULL ); + closegraph(); + return -1; + } + + if ( ( Datos[1] = (char far *)farcalloc( 100000, sizeof(char) ) ) == NULL ) + { + farfree( Datos[0] ); + Optar( 0, "ERROR DE MEMORIA", "Memoria insuficiente", "para la segunda forma", "de onda.", NULL ); + closegraph(); + return -1; + } + + _fmemcpy( Datos[0], &i, 50000 ); + + if ( intvect == ON ) + { + // save the old interrupt vector + oldhandler = getvect(INTR); + // install the new interrupt handler + setvect(INTR, handler); + + IntVect = ON; + } + + if ( ( ptr_char = ( char *)malloc( sizeof(char)*4096 ) ) == NULL ) + Error( 0x06, "Error inicializando Memoria, fuentes" ); + LeeFuentes("llave.fnt"); + + + DibujaFondo(); + + ComienzaRutina(); + + BorraPantalla(); + + free( ptr_char ); + AnulaInterrupcion(); + + closegraph(); + + printf( "\n%s", buffer[0] ); + printf( "\n%s", buffer[1] ); + printf( "\n%s", buffer[2] ); + printf( "\n%s", buffer[3] ); + + farfree( Datos[0] ); + farfree( Datos[1] ); + return 0; + +} + +void ComienzaRutina(void) +{ + int ok, BPush, VentanaActiva, i, j; + long DLectura; + char buffer[280]; + + // Temporal hasta que existan datos reales... +/* + Datos[0] = (char *)&ok; + Datos[1] = (char *)&ok; +*/ + + + VentanaActiva = 0; + for ( j = 0; j < 2; j++ ) + for ( i = 0; i < 5; i++ ) + InicioPulso[i][j] = 0; + + InicioPulso[5][0] = 100000; + InicioPulso[5][1] = 100000; + + DibujaSeparadores( 63, 27, 630, 193, EGA_RED ); + DibujaSeparadores( 63, 27 + 250, 630, 193 + 250, EGA_RED ); + // Borramos los pulsos anteriores, y los desplazamos + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][0], 0x01 << j, Datos[0], 63, 42 + 30*j + 0, EGA_GREEN, InicioPulso[5][0] ); + DibujaPulsos( InicioPulso[j][1], 0x01 << j, Datos[1], 63, 42 + 30*j + 250, EGA_GREEN, InicioPulso[5][1] ); + } + + // Flecha hacia arriba + ponicono( 20, 225, flecha, 2 ); + + + ok = 0; + do { + + // Actualiza todos los puntos + setfillstyle( SOLID_FILL, EGA_BLACK ); + setcolor( EGA_WHITE ); + for ( i = 0; i < 2; i++ ) + for ( j = 0; j < 5; j++ ) + { + bar( 12, 42+31*j + 250*i, 52, 53+31*j + 250*i ); + sprintf( buffer, "%7ld", InicioPulso[j][i] ); + outtextxy( 12, 41 + 31*j + 250*i, buffer ); + } + + BPush = Comprueba_Secuencia( 1, NULL ); + + switch( BPush ) + { + case -2: + case -1: + case -0: + while( kbhit() ) getch(); + break; + // Salir + case 1: + ok = 1; + break; + // Cambio de Ventana + case 2: + VentanaActiva = !VentanaActiva; + // Flecha hacia arriba + ponicono( 20, 225, flecha, VentanaActiva == 0 ? 2 : 4 ); + + break; + // Desplazamiento de ondas (IZQUIERDA ) + case 3: + case 4: + case 5: + case 6: + case 7: + InicioPulso[BPush-3][VentanaActiva] --; + if ( InicioPulso[BPush-3][VentanaActiva] < 0 ) + { + InicioPulso[BPush-3][VentanaActiva] = 0; + } else { + // Borramos la onda anterior + DibujaPulsos( InicioPulso[BPush-3][VentanaActiva] + 1, 0x01 << (BPush - 3), Datos[VentanaActiva], 63, 42 + 30*(BPush-3) + ( VentanaActiva ? 250 : 0 ), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + + // Dibujamos la nueva onda + DibujaPulsos( InicioPulso[BPush-3][VentanaActiva], 0x01 << (BPush - 3), Datos[VentanaActiva], 63, 42 + 30*(BPush-3) + ( VentanaActiva ? 250 : 0 ), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + } + break; + // Desplazamiento de ondas (DERECHA) + case 8: + case 9: + case 10: + case 11: + case 12: + InicioPulso[BPush-8][VentanaActiva] ++; + if ( InicioPulso[BPush-8][VentanaActiva] > InicioPulso[5][VentanaActiva] ) + { + InicioPulso[BPush-8][VentanaActiva] --; + } else { + // Borramos la onda anterior + DibujaPulsos( InicioPulso[BPush-8][VentanaActiva] - 1, 0x01 << (BPush - 8), Datos[VentanaActiva], 63, 42 + 30*(BPush-8) + (VentanaActiva ? 250 : 0), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + + // Dibujamos la nueva onda + DibujaPulsos( InicioPulso[BPush-8][VentanaActiva], 0x01 << (BPush - 8), Datos[VentanaActiva], 63, 42 + 30*(BPush-8) + (VentanaActiva ? 250 : 0), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + } + break; + // Desplazamiento de pulsos TODAS (IZQUIERDA) + case 13: + // Borramos los pulsos anteriores, y los desplazamos + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + InicioPulso[j][VentanaActiva]--; + if ( InicioPulso[j][VentanaActiva] < 0 ) + InicioPulso[j][VentanaActiva] = 0; + } + + DibujaSeparadores( 63, 27 + (VentanaActiva ? 250 : 0 ), 630, 193 + (VentanaActiva ? 250 : 0 ), EGA_RED ); + + // Dibujamos los nuevos pulsos. + for ( j = 0; j < 5; j ++ ) + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + break; + // Reset de todos los pulsos + case 14: + // Borramos los pulsos anteriores, y los reseteamos + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + InicioPulso[j][VentanaActiva] = 0; + } + + DibujaSeparadores( 63, 27 + (VentanaActiva ? 250 : 0 ), 630, 193 + (VentanaActiva ? 250 : 0 ), EGA_RED ); + + // Dibujamos los nuevos pulsos. + for ( j = 0; j < 5; j ++ ) + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + break; + // Al final de todos los pulso + case 15: + // Borramos los pulsos anteriores, nos colocamos al final + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + InicioPulso[j][VentanaActiva] = InicioPulso[5][VentanaActiva] - PULSO_QUE_CABEN; + } + + DibujaSeparadores( 63, 27 + (VentanaActiva ? 250 : 0 ), 630, 193 + (VentanaActiva ? 250 : 0 ), EGA_RED ); + + // Dibujamos los nuevos pulsos. + for ( j = 0; j < 5; j ++ ) + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + break; + // Desplazamiento de pulsoso TODOS (Derecha) + case 16: + // Borramos los pulsos anteriores, y los desplazamos + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_BLACK, InicioPulso[5][VentanaActiva] ); + InicioPulso[j][VentanaActiva]++; + if ( InicioPulso[j][VentanaActiva] > InicioPulso[5][VentanaActiva] ) + InicioPulso[j][VentanaActiva]--; + } + + DibujaSeparadores( 63, 27 + (VentanaActiva ? 250 : 0 ), 630, 193 + (VentanaActiva ? 250 : 0 ), EGA_RED ); + + // Dibujamos los nuevos pulsos. + for ( j = 0; j < 5; j ++ ) + DibujaPulsos( InicioPulso[j][VentanaActiva], 0x01 << j, Datos[VentanaActiva], 63, 42 + 30*j + ( VentanaActiva ? 250 : 0 ), EGA_GREEN, InicioPulso[5][VentanaActiva] ); + break; + // CARGAR + case 17: + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][0], 0x01 << j, Datos[0], 63, 42 + 30*j + 0, EGA_BLACK, InicioPulso[5][0] ); + DibujaPulsos( InicioPulso[j][1], 0x01 << j, Datos[1], 63, 42 + 30*j + 250, EGA_BLACK, InicioPulso[5][1] ); + } + + strcpy( buffer, "*.llv" ); + if ( file_browser( buffer, "Cargar Archivo", 0 ) ) + CargarOnda( buffer, Datos[VentanaActiva], VentanaActiva ); + + DibujaSeparadores( 63, 27, 630, 193, EGA_RED ); + DibujaSeparadores( 63, 27 + 250, 630, 193 + 250, EGA_RED ); + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][0], 0x01 << j, Datos[0], 63, 42 + 30*j + 0, EGA_BLACK, InicioPulso[5][0] ); + DibujaPulsos( InicioPulso[j][1], 0x01 << j, Datos[1], 63, 42 + 30*j + 250, EGA_BLACK, InicioPulso[5][1] ); + } + break; + // SALVAR + case 18: + strcpy( buffer, "*.llv" ); + if ( file_browser( buffer, "Salvar Archivo", 1 ) ) + SalvarOnda( buffer, Datos[VentanaActiva], VentanaActiva ); + break; + // LEER ONDA + case 19: + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][0], 0x01 << j, Datos[0], 63, 42 + 30*j + 0, EGA_BLACK, InicioPulso[5][0] ); + DibujaPulsos( InicioPulso[j][1], 0x01 << j, Datos[1], 63, 42 + 30*j + 250, EGA_BLACK, InicioPulso[5][1] ); + } + Optar( 0, "Lectura de Onda", "Prepare el chisme, y", "pulse una tecla cuando este", "preparado...", NULL ); + Optar( ENCUADRE, "Leyendo Onda", "Presione una cualquier", "tecla para interrumpir el", "proceso...", NULL ); + + outportb( DIR_LPT + 0, 0xFF ); + outportb( DIR_LPT + 1, 0x01 ); + // Comienza lectura + for ( DLectura=0; DLectura < InicioPulso[5][VentanaActiva] && !kbhit(); DLectura++ ) + { + Datos[VentanaActiva][DLectura] = inportb( DIR_LPT ); + + sin( ANGULO ); + delay(TiempoEspera); + } + + while( kbhit() ) getch(); + + Optar( ENCUADRE, NULL ); + DibujaSeparadores( 63, 27, 630, 193, EGA_RED ); + DibujaSeparadores( 63, 27 + 250, 630, 193 + 250, EGA_RED ); + // Borramos los pulsos anteriores, y los desplazamos + for ( j = 0; j < 5; j ++ ) + { + DibujaPulsos( InicioPulso[j][0], 0x01 << j, Datos[0], 63, 42 + 30*j + 0, EGA_GREEN, InicioPulso[5][0] ); + DibujaPulsos( InicioPulso[j][1], 0x01 << j, Datos[1], 63, 42 + 30*j + 250, EGA_GREEN, InicioPulso[5][1] ); + } + break; + + } + + }while ( !ok ); + +} + +void CargarOnda( char *file, char far *Datos, char Ventana ) +{ + FILE *file_in; + int i; + char buffer[80]; + + struct CABECERA + { + long DPulsos[6]; + } Cabecera; + + if ( ( file_in = fopen( file, "rb" ) ) != NULL ) + { + fread( &Cabecera, sizeof( CABECERA ), 1, file_in ); + + farfree( Datos ); + if ( ( Datos = (char far *)farmalloc( sizeof(char)*Cabecera.DPulsos[5] ) ) == NULL ) + { + sprintf( buffer, "longitud %ld bytes.", (long)(sizeof(char)*Cabecera.DPulsos[5]) ); + Optar( 0, "ATENCION !!!", "No hay suficiente memoria", "no pude cargar el pulso", buffer, NULL ); + for ( i = 0; i < 6; i++ ) + Cabecera.DPulsos[i] = 0; + } else { + fseek( file_in, sizeof( CABECERA ), SEEK_SET ); + fread( Datos, sizeof(char), Cabecera.DPulsos[5], file_in ); + } + + for ( i = 0; i < 6; i++ ) + InicioPulso[i][Ventana] = Cabecera.DPulsos[i]; + + + fclose(file_in); + } + +} + + +void SalvarOnda( char *file, char far *Datos, char Ventana ) +{ + FILE *file_out; + int i; + + struct CABECERA + { + long DPulsos[6]; + } Cabecera; + + if ( ( file_out = fopen( file, "wb" ) ) != NULL ) + { + for ( i = 0; i < 6; i++ ) + Cabecera.DPulsos[i] = InicioPulso[i][Ventana]; + + fwrite( &Cabecera, sizeof( CABECERA ), 1, file_out ); + fseek( file_out, sizeof( CABECERA ), SEEK_SET ); + fwrite( Datos, sizeof(char), Cabecera.DPulsos[5], file_out ); + + fclose(file_out); + } + +} + + + +void BorraPantalla(void) +{ + int CLS; + setcolor( 0 ); + randomize(); + + switch( random(4)+1 ) + { + case 1: + for ( CLS = 0; CLS < 640; CLS+=2 ) + { + line( CLS, 0, CLS, 479 ); + line( 639-CLS, 0, 639-CLS, 479 ); + delay( 10 ); + } + break; + case 2: + for ( CLS = 0; CLS < 480; CLS+=2 ) + { + line( 0, CLS, 639, CLS ); + line( 0, 479-CLS, 639, 479-CLS ); + delay( 10 ); + } + break; + case 3: + for ( CLS = 0; CLS < 640*2; CLS+=2 ) + { + line( 639-CLS, 0, 639 , CLS ); + line( CLS, 479, 0, 480-CLS ); + delay( 10 ); + } + break; + case 4: + for ( CLS = 0; CLS < 640*2; CLS+=2 ) + { + line( CLS, 0, 0, CLS ); + line( 640-CLS, 479, 639, 480-CLS ); + delay( 10 ); + } + break; + } + + +} + +void DibujaPulsos( long comienzo, char And_bit, char far *Datos, int x, int y, char color, long TotalPulsos ) +{ + long Pulso; + + // seleccionamos el color de usuario + setcolor( color ); + + y += ALTO_PULSO + 5; + +// moveto( x, y + ( comienzo > 0 ? ( ( Datos[comienzo-1] & And_bit ) ? ALTO_PULSO : 0 ) : 0 ) ); + moveto( x, y - ( comienzo > 0 ? ( ( Datos[comienzo] & And_bit ) ? ALTO_PULSO : 0 ) : 0 ) ); + for ( Pulso = comienzo; Pulso < ( comienzo + PULSO_QUE_CABEN ) & Pulso < TotalPulsos; Pulso++, x+=ANCHO_PULSO ) + { + lineto( x, y - ( ( Datos[Pulso] & And_bit ) ? ALTO_PULSO : 0 ) ); + lineto( x, y - ( ( Datos[Pulso+1] & And_bit ) ? ALTO_PULSO : 0 ) ); + } +} + +void DibujaSeparadores( int X1, int Y1, int X2, int Y2, char color ) +{ + setcolor( color ); + + setlinestyle( CENTER_LINE, 0, NORM_WIDTH ); + + for ( ; X1 < X2; X1 += ANCHO_PULSO ) + line( X1, Y1, X1, Y2 ); + + setlinestyle( SOLID_LINE, 0, NORM_WIDTH ); + +} + + +void DibujaFondo(void) +{ + FILE *fp; + int alto, ancho; unsigned char byte; int contador; char BitMap[40][40]; + + int x, y, vez = -1; + + if ( ( fp = fopen ( "1.PCX", "rb" ) ) != NULL ) + { + // Saltamos la cabecera + fseek( fp, 128, SEEK_SET ); + + for(alto=0; alto<32; alto++) + { + for(ancho=0; ancho<32; ) + { + byte=getc(fp); + if(byte<=0xC0) + { + if ( vez == -1 ) vez = byte; + BitMap[ancho%32][alto%32] = byte; + ancho++; + } + else + { + contador=byte&0x3F; byte=getc(fp); + for(; contador>0; contador--) + { + BitMap[ancho%32][alto%32] = byte; + ancho++; + } + } + } + } + // Rellenamos la pantalla con un fondo atractivo... + setfillstyle( SOLID_FILL, vez ); bar( 0, 0, 640, 480 ); + for ( ancho = 0; ancho < 32; ancho++ ) + for ( y = 0; y < 480; y+=35 ) + for ( alto = 0; alto < 32; alto++ ) + for ( x = 0; x < 640; x+=35 ) + putpixel( x + ancho, y + alto, BitMap[ancho][alto] ); + fclose( fp ); + } else { + // Rellenamos la pantalla con un fondo atractivo... + setcolor( 1 ); + setfillstyle( LTBKSLASH_FILL, 1 ); bar( 0, 0, 640, 480 ); + } + + + + Imprime_Estaticos( 10, "llave.img" ); + + +/* + setfillstyle( SOLID_FILL, EGA_GREEN ); + setcolor( 11 ); + rectangle( 58, 23, 632, 197 ); +*/ +// & 58, 23, 632, 197, 0, 56, 63, 2, 2 +// & 58, 273, 632, 447, 0, 56, 63, 2, 2 + +} + + + + +void AnulaInterrupcion(void) +{ +/* reset the old interrupt handler */ +if ( intvect == ON ) + setvect(INTR, oldhandler); +intvect = OFF; +} + +/***************************************************************************\ +|* *| +|* INT CLK *| +|* *| +|* Descripci¢n: *| +|* interrupci¢n para el parpadeo de los led's *| +|* *| +|* Entradas: (indeterminadas) *| +|* *| +|* *| +|* *| +|* Salidas: (ninguna) *| +|* *| +\***************************************************************************/ +void interrupt handler(__CPPARGS) +{ +/* increase the global counter */ + if ( IntVect == ON ) + { + count = (count++)%16; + if ( count == 1 ) + { + setpalette( 11, EGA_GREEN ); + setpalette( 13, EGA_LIGHTGREEN ); + } + else if ( count == 8 ) + { + setpalette( 11, EGA_RED ); + setpalette( 13, EGA_LIGHTRED ); + + } + } + +/* call the old routine */ + oldhandler(); +} + + +void LeeFuentes(char *file) +{ +FILE *fich; + /* Reservamos 4 Kb. para cargar la fuente en memoria */ + + /* Abrimos el fichero de la fuente */ + + if ((fich=fopen(file,"rb"))==NULL) { + printf("\a\nArchivo %s no encontrado.\n",file); + Error(0, "No se encuentra el archivo de fuentes"); + } + + fseek(fich, SEEK_SET, 0); /* Nos colocamos al principio del fichero */ + fread(ptr_char,1,4096,fich); /* Cargamos en memoria 4096 bytes del fichero */ + fclose(fich); /* Cerramos el fichero */ +} + +#define TAMx 8 +#define TAMy 8 +void Fuente_Amplia( char *Frase, p_Ampliada far *FA ) +{ + int i, j, k; // Variables de avance + int c_elec; // Color en el momento de imprimir + int PosX, PosY; // Posicion fisica final + char LCaract; // Caracter de linea a tratar + + if ( FA->Flen != _fstrlen( Frase ) ) // Reseteamos las variables de control interno + { + // Obtenemos la longitud de la frase. ( En d¡gitos ) + FA -> Flen = _fstrlen( Frase ); + // Contador de digito actual a cero + FA -> BitByte = 0; + // Posicion dentro de la frase + FA -> currByte = 0; + } + + // Avance horizontal de bit's ( avance de digitos ) + for ( i = 0; i < ( TAMx * (FA -> ndigitos) ); i++ ) + { + k = ( Frase[ ( (i+FA->BitByte)/TAMx + FA -> currByte ) % FA->Flen ] ) << 4; + LCaract = ( (char)0x01 << (7 - (i+FA->BitByte)%TAMx) ); + PosX = FA -> x + FA->AX * i; // Posicion f¡sica horizontal + // Avance vertical de bit's + for ( j = 0; j < TAMy; j ++ ) + { + PosY = FA -> y + FA->AY * j; // Posicion f¡sica vertical + + if ( ptr_char[ k + j ] & LCaract ) + c_elec = FA->C2; + else + c_elec = FA->C1; + + putpixel ( PosX, PosY, c_elec ); + } + } + // Tenemos en cuenta el avance dentro de la frase + if ( ( FA -> BitByte ++ ) >= 7 ) + { + FA -> BitByte = 0; FA -> currByte ++; + if ( FA -> currByte >= FA -> Flen ) + FA -> currByte = 0; + } + +} +#undef TAMy +#undef TAMx + + +void Error( int code, char *MensajeError ) +{ + free( ptr_char ); + AnulaInterrupcion(); + restorecrtmode(); + + printf( "\nSe produjo un codigo de error %d, subcodigo no disponible ", code ); + switch( code ) + { + case 0: + printf( "\n Error Desconocido " ); + break; + case 1: + printf( "\n BDatos gener¢ el error de salida. |ERROR DE ACCESO| " ); + break; + case 2: + printf( "\n Make Boton gener¢ el error de salida " ); + break; + case 3: + printf( "\n Fall¢ en alg£n punto del men£ principal" ); + break; + + }; + + printf( "\n> %s_", MensajeError ); + exit(code); +} diff --git a/LLAVE.EXE b/LLAVE.EXE new file mode 100644 index 0000000000000000000000000000000000000000..d532bb82217d6c2887262c5a681147ca64a91fea GIT binary patch literal 98686 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�D50O*)btT#+4P;6@`26B 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 literal 0 HcmV?d00001 diff --git a/LLAVE.FNT b/LLAVE.FNT new file mode 100644 index 0000000000000000000000000000000000000000..f0b651ec1fb8d9f4a8929902628ad1ee161d841c GIT binary patch literal 4096 zcmZuzy=xpt6dx%NIpl44P5LM+5pQfE|2TO7N2Gq>~R&5^efv%mM=yziMk#%#)- z|Ni{V(eq4mv-({dr^U<*QVR!ZAQe)r;4KsoGv(G=N z^5=61&?Zhdu(>S+L^iCuV0|)1l{7y-y*xAH$wwT>m`DmYhzc9Kq`j>$E-LpH+M7>G zm&$`^Qj&3H^8x}O@gyLmasa98kI(h4#gT0bV!H{mjn$&9r+gM572-!wlx zJ)I;d=MccWC=kzuNQE#4Ljm(f&Sx3Jd5BBYubw|Ga=HIl^bx~Z26x6E zOdpVm=aviQB=tTMaT1F&+ciNH zoB$G_iq9NqcCsg^n5hd7?Rh-q{GN{(`~#W$PGQo2#-RU|xjzBNc8g#;sSh0HU-`FY zo?4vGI5+bN&6eK`^e=^=f_RU%PIBcy3T3yK2)a)1V_a+7`!nCy?apt?-`;s~{W=Cpdf zmV>a>X^+~S$A||#_{9Z}W?UTpe06Z}LPNIhIHBi7h-H82fd_2WSM{Id2iS^#oUE0S zp$(3+mHh1Ou{nSX>t^5<)tPI3_yqu;C-Xt6$K$b)!OxYIl@*E~{5Aag&X)%tYM#Ph z{bnve__)#eU^lwMSHtcNtSOkX!-Jf zEm!MpAN8B~?(2NidY^CU{c7Ffw*1O`uavxIS4;a*zma47O7F_(t9WW-ud##rdcTfe zVHiWp-{vO9tMhC077NL@;cqSNM|+ES{N?&C_Y3P+FOiN0Ec=H0j@RDKG{@OLJUkp}1Z!t7_+Fcn?9>B7 zdCTc) zdAsc+4tEqGW|?{rJ5JwmSRb+HtT`URfSfgg*RNf3V1pq*L-^_;Nn=DFy>{UbrO~Sh n-ZK24a|rqmDs9x1 literal 0 HcmV?d00001 diff --git a/LLAVE.IMG b/LLAVE.IMG new file mode 100644 index 0000000..3758520 --- /dev/null +++ b/LLAVE.IMG @@ -0,0 +1,240 @@ +** Codigo fuente para MAKE_BOTON +** +** Make BOTON es un programa realizado por Jos‚ David Guill‚n +** +** Enlazar al programa principal con MB2CPP, y compilar a OBJ para Linkar +** +** +** MAKE_BOTON es un producto de JD. -->>> 5.000 Libreria exelente para +** tratamiento de botones y grf. +** ONDA_GRN es un producto de JD. --->>> 5.000 Le gustaria representar ondas +** sonoras con facilidad: ONDA_GRN +** UTILIZADO EN ­­­ FREC_OSC !!! +** + + +***************************************************************************** +* +* ATENCION !!! +* ALTERAR ESTE FICHERO, CAUSARA EL MALFUNCIONAMIENTO DEL +* PROGRAMA DE APOYO... ( ERRORES NO DOCUMENTADOS ) +* +***************************************************************************** + +#3 + +!1,20 + +* Boton SALIR!!! +$ 570, 215, 630, 255, 7, 7, 7, 0, 2, 000, 000 + +* Forma de onda +$ 15, 205, 48, 265, 7, 63, 56, 1, 2, 000, 000 + +* Desplazamiento de ondas +$ 58, 205, 110, 217, 7, 63, 56, 1, 2, 000, 000 +$ 58, 217, 110, 229, 7, 63, 56, 1, 2, 000, 000 +$ 58, 229, 110, 241, 7, 63, 56, 1, 2, 000, 000 +$ 58, 241, 110, 253, 7, 63, 56, 1, 2, 000, 000 +$ 58, 253, 110, 265, 7, 63, 56, 1, 2, 000, 000 + $ 113, 205, 165, 217, 7, 63, 56, 1, 2, 000, 000 + $ 113, 217, 165, 229, 7, 63, 56, 1, 2, 000, 000 + $ 113, 229, 165, 241, 7, 63, 56, 1, 2, 000, 000 + $ 113, 241, 165, 253, 7, 63, 56, 1, 2, 000, 000 + $ 113, 253, 165, 265, 7, 63, 56, 1, 2, 000, 000 + +* Reset Total +$ 170, 205, 185, 265, 7, 63, 56, 1, 2, 000, 000 +$ 185, 205, 200, 265, 7, 63, 56, 1, 2, 000, 000 +$ 200, 205, 215, 265, 7, 63, 56, 1, 2, 000, 000 +$ 215, 205, 230, 265, 7, 63, 56, 1, 2, 000, 000 + +* Cargar / Salvar +$ 485, 205, 565, 233, 7, 63, 56, 2, 2, 000, 000 +$ 485, 237, 565, 265, 7, 63, 56, 2, 2, 000, 000 + +* Leer / ??? +$ 400, 205, 480, 233, 7, 63, 56, 2, 2, 000, 000 +*$ 300, 205, 380, 233, 7, 63, 56, 2, 2, 000, 000 +$ 400, 237, 480, 265, 7, 63, 56, 2, 2, 000, 000 + + +­10 + +* Selector de forma de onda +& 15, 205, 48, 265, 7, 63, 56, 1, 2 + +*& 5, 20, 635, 200, 7, 63, 56, 2, 2 +*& 5, 270, 635, 450, 7, 63, 56, 2, 2 + + +* Desplazamiento de ondas +& 58, 205, 110, 217, 7, 63, 56, 1, 2 +& 58, 217, 110, 229, 7, 63, 56, 1, 2 +& 58, 229, 110, 241, 7, 63, 56, 1, 2 +& 58, 241, 110, 253, 7, 63, 56, 1, 2 +& 58, 253, 110, 265, 7, 63, 56, 1, 2 + & 113, 205, 165, 217, 7, 63, 56, 1, 2 + & 113, 217, 165, 229, 7, 63, 56, 1, 2 + & 113, 229, 165, 241, 7, 63, 56, 1, 2 + & 113, 241, 165, 253, 7, 63, 56, 1, 2 + & 113, 253, 165, 265, 7, 63, 56, 1, 2 + | 60, 205, 2, 4, 0, 0, <--- 1 1 --->, + | 60, 217, 2, 4, 0, 0, <--- 2 2 --->, + | 60, 229, 2, 4, 0, 0, <--- 3 3 --->, + | 60, 241, 2, 4, 0, 0, <--- 4 4 --->, + | 60, 253, 2, 4, 0, 0, <--- 5 5 --->, + +* Reset Total +& 170, 205, 185, 265, 7, 63, 56, 1, 2 +& 185, 205, 200, 265, 7, 63, 56, 1, 2 +& 200, 205, 215, 265, 7, 63, 56, 1, 2 +& 215, 205, 230, 265, 7, 63, 56, 1, 2 + | 170, 205, 2, 4, 1, 0, Retrocede, + | 185, 205, 2, 4, 1, 0, INICIO , + | 200, 205, 2, 4, 1, 0, FIN , + | 215, 205, 2, 4, 1, 0, Avanza , + + +* Boton SALIR!!! +& 600, 235, 30, -1, 7, 63, 56, 3, 2 +| 578, 220, 2, 6, 0, 0, Salir, +| 579, 221, 2, 6, 0, 63, Salir, + +& 485, 205, 565, 233, 7, 63, 56, 2, 2 +& 485, 237, 565, 265, 7, 63, 56, 2, 2 +| 485, 207, 2, 5, 0, 0, Cargar, +| 486, 208, 2, 5, 0, 63, Cargar, + +| 485, 237, 2, 5, 0, 0, Salvar, +| 486, 238, 2, 5, 0, 63, Salvar, + +& 400, 205, 480, 233, 7, 63, 56, 2, 2 +*& 300, 205, 380, 233, 7, 63, 56, 2, 2 +& 400, 237, 480, 265, 7, 63, 56, 2, 2 +| 404, 207, 2, 5, 0, 0, Leer Onda, +| 405, 208, 2, 5, 0, 63, Leer Onda, +*| 486, 238, 2, 5, 0, 63, Salvar, + + + +*& 5, 20, 635, 200, 7, 63, 56, 2, 2 +*& 5, 270, 635, 450, 7, 63, 56, 2, 2 + + +* Linea de fondo para ayudas +& 5, 455, 500, 475, 0, 63, 56, 0, 2 +& 505, 455, 635, 475, 63, 0, 56, 0, 2 + +* Pulsadores da avance global + + +* Ventanas para las formas de ondas +& 5, 20, 635, 200, 7, 63, 56, 2, 2 +& 5, 270, 635, 450, 7, 63, 56, 2, 2 + & 58, 23, 632, 197, 0, 56, 63, 2, 2 + & 58, 273, 632, 447, 0, 56, 63, 2, 2 + +* Ventanitas para saber cuanto se ha desplazado una onda en particualar +& 10, 40, 53, 55, 0, 56, 63, 0, 2 +& 10, 71, 53, 86, 0, 56, 63, 0, 2 +& 10, 102, 53, 117, 0, 56, 63, 0, 2 +& 10, 133, 53, 148, 0, 56, 63, 0, 2 +& 10, 164, 53, 179, 0, 56, 63, 0, 2 +* Ventanitas para saber cuanto se ha desplazado una onda en particualar +& 10, 290, 53, 305, 0, 56, 63, 0, 2 +& 10, 321, 53, 336, 0, 56, 63, 0, 2 +& 10, 352, 53, 367, 0, 56, 63, 0, 2 +& 10, 383, 53, 398, 0, 56, 63, 0, 2 +& 10, 414, 53, 429, 0, 56, 63, 0, 2 + + +| 0, 0, 2, 4, 0, 0, , + + + +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ +* Û Û +* Û File Browser Û +* Û Û +* ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ + +!2, 4 + +*Cuadro Cancelar +$ 377, 169, 391, 221, 7, 56, 63, 0, 1, 00, 46 +*Boton Aceptar +$ 377, 223, 391, 276, 7, 56, 63, 0, 1, 00, 30 + +* Subir +$ 377, 278, 391, 303, 7, 56, 63, 0, 1, 00, 72 +* Bajar +$ 377, 305, 391, 330, 7, 56, 63, 0, 1, 00, 80 + + + +* x y fuente tama¤o orientacion color texto + +* Men£ para Cargar o Salvar +­20 + +*Cuadro Total +& 240, 140, 400, 340, 7, 63, 56, 2, 1 +& 243, 143, 397, 337, 7, 56, 63, -2, 1 +*Cuadro Informativo +& 250, 150, 391, 164, 7, 56, 63, -0, 1 +*Cuadro introduccion nuevos datos +& 250, 169, 375, 180, 0, 56, 63, 0, 1 +*Cuadro de muestreo +& 250, 185, 375, 330, 0, 56, 63, 0, 1 + +*Cuadro Cancelar +& 377, 169, 391, 221, 7, 56, 63, 0, 1 +*Boton Aceptar +& 377, 223, 391, 276, 7, 56, 63, 0, 1 + +* Subir +& 377, 278, 391, 303, 7, 56, 63, 0, 1 +* Bajar +& 377, 305, 391, 330, 7, 56, 63, 0, 1 + +|377, 169, 2, 4, 1, 63, Cancelar, + |378, 170, 2, 4, 1, 0, Cancelar, + |377, 169, 2, 4, 1, 2, C , + |378, 170, 2, 4, 1, 0, C , +|377, 223, 2, 4, 1, 63, Aceptar , + |378, 224, 2, 4, 1, 0, Aceptar , + |377, 223, 2, 4, 1, 2, A , + |378, 224, 2, 4, 1, 0, A , + +|377, 288, 2, 4, 0, 63, -, + |378, 289, 2, 4, 0, 0, -, +|377, 315, 2, 4, 0, 63, +, + |378, 316, 2, 4, 0, 0, +, + +************************************************ Botones D: 6 +**** **** Botones S: +** Parte Utilizada por Optar ** +**** **** +************************************************ +!3, 2 + +$ 170, 320, 270, 350, 7, 63, 56, 2, 2, 000, 30 +$ 370, 320, 470, 350, 7, 63, 56, 2, 2, 000, 46 + +­100 +& 170, 165, 470, 315, 7, 63, 56, 0, 2 +& 172, 167, 468, 190, 1, 56, 63, 0, 2 + +& 170, 320, 270, 350, 7, 63, 56, 2, 2 +| 175, 325, 2, 6, 0, 63, Aceptar, +| 176, 326, 2, 6, 0, 0, Aceptar, +| 175, 327, 2, 6, 0, 63, _, +| 176, 328, 2, 6, 0, 0, _, + +& 370, 320, 470, 350, 7, 63, 56, 2, 2 +| 373, 325, 2, 6, 0, 63, Cancelar, +| 374, 326, 2, 6, 0, 0, Cancelar, +| 373, 327, 2, 6, 0, 63, _, +| 374, 328, 2, 6, 0, 0, _, + diff --git a/LLAVE.PRJ b/LLAVE.PRJ new file mode 100644 index 0000000000000000000000000000000000000000..d09589fe229a70594f89a7a7934418d2d6f2ee26 GIT binary patch literal 6016 zcmeI0`EwLS6vyA}Y?3A62!~04K!&&~N3kJ62t;MG%x=P#d)4luC>v8bHZe%put~r( zi6TNtiPvvdX`y(dh-a0Q%CB++Eu&oi2mYjZfQpRo+ar*|+U;FfpvrP4`^lT`Z@<^w zGu=JY(f(v>LesTSGO;G!)~7Xet&MBbNEtV&RN;RGH59h(CkrWbfJt;v*oOp%Map4e ze^!Lt&jr5_+{aYt8<9IA_$^bVBg}d_DpHOK9%qtz0;Hd~44nji27X~Ezry;BtVBaZ zr*Lr^_#OBIrL;X(rsYTB;YblD9|ewydK`y&g3V(3o@u2&QSPG&j5BPhe*tHaW&osc zL_SDS8Ds_WfPADCFs9lV?PC~PA%lv5vA{TBJVTiPs~DIF?BHmYml5(6U?=b@@EY(s z@CNWEum^Y__yG72cnf%&q3(k94)89p8+Z@+82AL3gpiYgDGcR0padvY%swnb-c$ws zJq_k`pd5-Bz)Xf(0ZU_0C2&1p2W|jvE5*ZtkdKqF<=ve9*4CV zcmkJOfUUTE64(Yj1v~>h3p@ur4_J#Cc|bl;0N8-}iko}z@(+hHMDDs+C>(4IyZo`` z!LZL2aO*K|K=-Y5doDjf1|F(X)WPRnotSE$dRa_WDCPeZ95k+F^=%U+Ltp4Xn}sAD7hwi)asj zV@?+@IU}V++xXM_6n}C1e6Bk@;&mt%3G2=7U?e7zOp1)G;$ln1$|rxy(~H|%DrXcE zEmL_TXcf#CED*E_ju9*rED{_mI8Jc9-~_>9dV%}e zFyIq0CQ<0q&9h8jW(+f)S$?!fGlm&^N(SCdJ#QOP39a9?s?w~x8Dn${N`M~})yP@suo?4274=^X3P zyFwm`U%xB50utPx^y9(6Eln*+-$vdg3a#+!5lL;hzj#DSMPYA1)~PO^FQ`i#>A`?E zDA6!oz++Itws0b4l XRnSbDLFK#>OygOzjL-82R@uJ+`b%Sm literal 0 HcmV?d00001 diff --git a/LLAVE_FL.CPP b/LLAVE_FL.CPP new file mode 100644 index 0000000..457e8d7 --- /dev/null +++ b/LLAVE_FL.CPP @@ -0,0 +1,752 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +char flecha [18] [18] = + { + 7,7,7,7,7,7,7,7,7,0,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,0,4,0,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,0,4,4,4,0,7,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,0,4,4,4,4,4,4,4,0,7,7,7,7, + 7,7,7,7,0,4,4,4,4,4,4,4,4,4,0,7,7,7, + 7,7,7,0,4,4,4,4,4,4,4,4,4,4,4,0,7,7, + 7,7,0,0,0,0,0,4,4,4,4,4,0,0,0,0,0,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,4,4,4,4,4,0,7,7,7,7,7, + 7,7,7,7,7,7,0,0,0,0,0,0,0,7,7,7,7,7 + }; +void ponicono(int x,int y,char matriz[18][18], char pos) +{ + int veces1,veces2; + + for (veces1=0;veces1<=17;veces1++) + { + for (veces2=0;veces2<=17;veces2++) + { + + switch( pos ) + { + case 1: + if ( matriz[veces1][veces2] != 3 ) + putpixel(x+veces1,y+veces2,matriz[veces1][veces2]); + break; + case 2: + if ( matriz[17-veces2][veces1] != 3 ) + putpixel(x+veces1,y+veces2,matriz[17-veces2][veces1]); + break; + case 3: + if ( matriz[17-veces1][veces2] != 3 ) + putpixel(x+veces1,y+veces2,matriz[17-veces1][veces2]); + break; + case 4: + if ( matriz[veces2][veces1] != 3 ) + putpixel(x+veces1,y+veces2,matriz[veces2][veces1]); + break; + } + } + } + +} + + + + +#include "..\libs\make_bot\make_bot.h" + +/*extern CFG_FREC cfgFREC;*/ +//////////////////////////////////////////////////////////////////////////// +/***************************************************************************\ +| Critical Disk Error handling routines (C) 1995 Jason Speight. | +| void interrupt critical_error_handler(__CPPARGS) is the interrupt which | +| captures disk io errors. (int 0x24, if you're interested!) Such errors | +| are : Disk not inserted in drive, seek error reading from a drive, general| +| disk failure etc. The only things the interrupt does is : | +| Suppress the dos ABORT,RETRY,FAIL,IGNORE statement | +| Sets a variable erroroccurred to the dos error statement. (!=0) | +| | +| StartCEH() and StopCEH() start and stop the error handler. YOU MUST | +| STOPCEH BEFORE THE EXIT OF THE PROGRAM. or else when you get a disk | +| error, the int 24 issued bu DOS points to the middle of nowhere! *HANG* | +| | +| diskerror() is my routine to display a disk IO error. It also sets the | +| global variable erroroccurred to 0 for future use. This procedure also | +| needs access to "SCRNHNDL.H" and "BOXES.H" | +| | +| BTW, anybody know how to trap the message "PLEASE INSERT DISK FOR DRIVE x"| +\***************************************************************************/ + +void interrupt critical_error_handler(.../*__CPPARGS*/); // interrupt prototype +void interrupt (*old_int24)(.../*__CPPARGS*/); // interrupt function pointer +void startceh(); +void stopceh(); + +int erroroccurred=0; + +//////////////////////////////////////////////////////////////////////////// + +typedef struct { + char files[13] ; //100 files, 12 byte filename (+1 for terminator!) + long filesize ; //Try as static.. free up that ram, bud. (Use HUGE mem model) + unsigned char attrs ; +} SFile; + +SFile far *S_File; + +void FileDownRow(void); +void FileUpRow(void) ; +void PrintWholeScreen_Files(void); +void PrintSelectRow( char Hide_Show ); + +unsigned char FileRow = 0; int FileCurrTopRow = 0; +unsigned int maxfiles=0; +unsigned int rasterscan(char *fm); +char Archivo[13]; +void PrintVisor(void); + +int Optar( int optar, ... ); + +int InputCadenaG(char *s, int numalp, int lmax, int cc, int cf, int left, int up, int right, int down); + +char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ); + +char file_browser( char *comodin_name, char *texto1, char Cargar_Salvar ){ + + int ok = 0, inst = 0; + struct textsettingstype textinfo; + char oldpath[229]=" -- NONE -- "; //internal. do not change + unsigned char olddrive=255; //impossible drive name + char olddisk, key; long MemVideo; + + startceh(); + + FileRow = FileCurrTopRow = 0; + + olddrive = getdisk(); + getcwd( oldpath, 229 ); + + void far *C_Texto; + +MemVideo = JD_imagesize(240, 140, 400, 340); +C_Texto = farmalloc( MemVideo ); +S_File = (SFile far *)farmalloc( sizeof(SFile) * 101 ); + +if( C_Texto == NULL || S_File == NULL ) +{ + closegraph(); + cprintf("\n\rSALIENDO"); + cprintf("\n\rImposible encontrar %ldKbytes en el Heap %ld", (long)(sizeof(SFile)*101), MemVideo ); + return 0; +} + +rasterscan( comodin_name ); + +gettextsettings(&textinfo); + +getimage( 240, 140, 400, 340, C_Texto); + + + Imprime_Estaticos( 20, "llave.IMG"); // Imprime botones estaticos 'Seccion 20' + + + +settextstyle( SMALL_FONT, HORIZ_DIR, 4); + +setcolor( EGA_YELLOW ); +outtextxy( 250+( ( 141 - textwidth(texto1) ) / 2 ), 150, texto1 ); + +PrintWholeScreen_Files(); +PrintSelectRow( 1 ); + + +while(!ok){ // Bucle infinito + + switch( Comprueba_Secuencia( 2, NULL ) ) { // Iniciamos comprobacion de 2¦ sec + + case 0: // No se pulso ningun BOTON + // Pero el raton fue presionado en + // algun sitio... + break; + case -2: // Hay una tecla normal en BUFFER + switch( key = getch() ) { // La utilizamos + // ESC ( CANCELAR ) + case 27: + inst = 0; + ok = 1; + break; + case 13: + switch( S_File[FileRow + FileCurrTopRow].attrs ) + { + // Si directorio: cambiamos simplemente + case FA_DIREC: + chdir( S_File[FileRow + FileCurrTopRow].files ); + FileRow = FileCurrTopRow = 0; + rasterscan( comodin_name ); + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + break; + // Si unidad comprobamos que podemos cambiar y como directorio... + case 255: + erroroccurred=0; + olddisk=getdisk(); + setdisk( (S_File[FileRow + FileCurrTopRow].files[0] - 'A') ); + if (erroroccurred) { + setdisk(olddisk); + } else { + FileRow = FileCurrTopRow = 0; + rasterscan( comodin_name ); + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + } + break; + default: + if ( strcmp(Archivo, S_File[FileRow+FileCurrTopRow].files) == 0 ) + { + if ( Cargar_Salvar == 0 ) { + if ( access(Archivo, 0) != 0) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + } + } + strcpy(Archivo, S_File[FileRow+FileCurrTopRow].files); + PrintVisor(); + break; + } + + break; + default: + strcpy( Archivo, "\0" ); + ungetch(key); + InputCadenaG(Archivo, 0, 12, 0, /*cfgFREC.F_Texto*/1, 252, 171, 373, 178); + if (Cargar_Salvar == 0) + { + // Comprobamos que existe el fichero + if ( access(Archivo, 0) != 0) + strcpy( Archivo, "\0" ); + } + PrintVisor(); + break; + } + break; + case -1: // Hay una tecla especial en BUFFER + getch(); // La eliminamos + break; + // Boton Aceptar + case 2: + if ( Cargar_Salvar == 0 ) { + if ( access(Archivo, 0) != 0) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + } else { + if ( access(Archivo, 0) == 0) + if ( Optar( 1, "ATENCION !!!", "El fichero ya existe", "¨ Desea reemplazarlo ?", NULL ) != 1 ) break; + sprintf( comodin_name, "%c:\\", getdisk() + 'A' ); + getcurdir(0,comodin_name+3); + strcat(comodin_name, "\\"); + strcat(comodin_name, Archivo); + inst = 1; + ok = 1; + } + break; + // Boton Cancelar + case 1: + inst = 0; + ok = 1; + break; + // Boton Subir + case 3: + FileUpRow(); + break; + // Boton Bajar + case 4: + FileDownRow(); + break; + default: + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + break; + } + +} + +putimage( 240, 140, C_Texto, COPY_PUT); + +farfree ( C_Texto ); +farfree ( S_File ); + +settextstyle(textinfo.font, textinfo.direction, textinfo.charsize ); +settextjustify(textinfo.horiz, textinfo.vert); + + setdisk(olddrive); + chdir(oldpath); + + +stopceh(); + +return inst; + +} + + + +unsigned int rasterscan(char *fm) { + struct ffblk ffblk; + char done=0; + unsigned int olddisk; + maxfiles = 0; + +// build a disk drive availiable list + olddisk=getdisk(); + for (int i=1;i<27;i++) if (_chdrive(i) == 0) + { + sprintf( S_File[maxfiles].files, "%c:", (char)('A' + i - 1) ); + S_File[maxfiles].filesize=0; + S_File[maxfiles].attrs=255; // Unidad + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + + } + setdisk(olddisk); + +// drivelist[2]='N'; //stop access to B drive until I sort out pahntom dive probs +//Ok, Drive B may be a phantom drive. If you try to access drive B, then +//the program looses controll. Bummer! +// needs debugging. (always ignores drive b...) +// asm int 0x11 +// asm mov equipmentlist,ax +// drivelist[2]='N'; +// if ((equipmentlist & 16)) drivelist[2]='Y'; + + + done = findfirst("*.*",&ffblk,FA_DIREC); + while (!done) { + if (ffblk.ff_attrib == 0x10) { + strcpy(S_File[maxfiles].files,ffblk.ff_name); + S_File[maxfiles].filesize=ffblk.ff_fsize; + S_File[maxfiles].attrs=ffblk.ff_attrib; + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + } + done = findnext(&ffblk); + if (maxfiles==100) done=!done; //stop to prevent internal crashes. + } + + done = findfirst(fm,&ffblk,FA_DIREC); + while (!done) { + if (ffblk.ff_attrib != 0x10) { + strcpy(S_File[maxfiles].files,ffblk.ff_name); + S_File[maxfiles].filesize=ffblk.ff_fsize; + S_File[maxfiles].attrs=ffblk.ff_attrib; + if (ffblk.ff_attrib & 16) S_File[maxfiles].filesize=0; + maxfiles++; + } + done = findnext(&ffblk); + if (maxfiles==100) done=!done; //stop to prevent internal crashes. + } + if (maxfiles==0) { //no files to browse + strcpy(S_File[0].files," -- NONE -- "); + S_File[0].filesize=-1; + maxfiles=1;} + strcpy(S_File[100].files," -- NONE -- "); + S_File[100].filesize=-1; + return maxfiles; +} + + + +void PrintWholeScreen_Files(void ) +{ + + int OldFileRow = FileRow ; + char Contador; + + setfillstyle( SOLID_FILL, 0 ); + bar(252, 187, 374, 327); + + PrintSelectRow ( 0 ); + for ( FileRow = 0; FileRow < 14; FileRow++ ) + if ( ( FileRow + FileCurrTopRow ) < maxfiles ) + PrintSelectRow ( 0 ); + + + FileRow = OldFileRow; + + +} + +void PrintSelectRow( char Hide_Show ) +{ + + char Buffer[80]; + char Buff1[80]; + char Buff2[80]; + + if ( Hide_Show==0 ) + { + setfillstyle( SOLID_FILL, 0 ); + bar(252, 188 + ( FileRow * 10 ) , 373, 187 + 10 + ( FileRow * 10 ) ); + setcolor( /*cfgFREC.Texto*/EGA_RED ); + } else { + setfillstyle( SOLID_FILL, /*cfgFREC.F_Texto*/EGA_YELLOW ); + bar(252, 188 + ( FileRow * 10 ) , 373, 187 + 10 + ( FileRow * 10 ) ); + setcolor(0); + } + +switch( S_File[FileRow + FileCurrTopRow].attrs ) +{ + case FA_DIREC: + sprintf(Buffer, "%-13s", S_File[FileRow+FileCurrTopRow].files ); + sprintf(Buff1 , " < DIR >" ); + break; + case 255: + sprintf(Buffer, "%-8s", strncpy( Buff1, S_File[FileRow+FileCurrTopRow].files, 8) ); + sprintf(Buff1 , " >DRIVER<" ); + break; + default: + + sprintf(Buffer, "%-13s", S_File[FileRow+FileCurrTopRow].files); +// outtextxy( 252 , 187 + ( FileRow * 10 ) , Buffer ); + sprintf(Buff1 , " %7lu", S_File[FileRow+FileCurrTopRow].filesize ); + break; +} + + outtextxy( 252 , 187 + ( FileRow * 10 ) , Buffer ); + outtextxy( 252 , 187 + ( FileRow * 10 ) , Buff1 ); + +} + +void FileDownRow(void) +{ + + // ¨¨ Estoy en la linea fisica 000 ??? + if ( (FileRow + FileCurrTopRow) != (maxfiles - 1) ) { + + // Linea 0, Baja Con retroceso multiple + if ( FileRow == 13 ) { + FileCurrTopRow += 14; + while ( (FileCurrTopRow + FileRow) > maxfiles ) FileCurrTopRow--; + FileRow = 0; + PrintWholeScreen_Files(); + PrintSelectRow( 1 ); + } else { + PrintSelectRow( 0 ); + FileRow++; + PrintSelectRow( 1 ); + } + + } +} + +void FileUpRow(void) +{ + + // ¨¨ Estoy en la linea fisica 000 ??? + if ( (FileRow + FileCurrTopRow) != 0 ) { + + // Linea 0, Baja Con retroceso multiple + if ( FileRow == 0 ) { + FileCurrTopRow -= 14; + if ( FileCurrTopRow < 0 ) FileCurrTopRow = 0; + FileRow = 0; + PrintWholeScreen_Files(); + FileRow = 13; + PrintSelectRow( 1 ); + } else { + PrintSelectRow( 0 ); + FileRow--; + PrintSelectRow( 1 ); + } + + } +} + + + +/* +void diskerror(void) { +char message[30]; + pushscreen(); + draw3dboxup(19,10,43,6); + draw3dboxdn(21,11,39,4); + switch (erroroccurred) { + case 1 : strcpy(message,"Write Protected Disk"); break; + case 2 : strcpy(message,"Drive Not Ready"); break; + case 3 : strcpy(message,"Unknown Command"); break; + case 4 : strcpy(message,"Data Error (CRC)"); break; + case 5 : strcpy(message,"Bad Request Structure Length"); break; + case 6 : strcpy(message,"Seek Error"); break; + case 7 : strcpy(message,"Unknown Media Type"); break; + case 8 : strcpy(message,"Sector Not Found"); break; + case 9 : strcpy(message,"Printer Out Of Paper"); break; + case 10: strcpy(message,"Write Fault"); break; + case 11: strcpy(message,"Read Fault"); break; + case 12: strcpy(message,"General Failure"); break; + default: strcpy(message,"Unknown Error"); + } + + printcentered(12,"Error - Press any key to continue",0x74); + printcentered(13,message,0x70); + getch(); + popscreen(); + erroroccurred=0; +} +*/ + +void interrupt critical_error_handler(.../*__CPPARGS*/) { + asm push ax //preserve only modified register + asm mov ax,di //di holds error code ranging from 0 to 0x0c +// asm inc ax + asm mov erroroccurred,ax //increase erroroccurred for ease of programming + asm mov al,0x20 + asm out 0x20,al //send interrupt clear flag +// asm pushf // I think I dont need this line in.... + asm pop ax //restore ax +} + +void startceh() { + old_int24 = _dos_getvect( 0x24 ); + _dos_setvect( 0x24, critical_error_handler); + } + +void stopceh() { + _dos_setvect(0x24,old_int24); + } + +void PrintVisor(void) +{ + + setfillstyle( SOLID_FILL, 0 ); + bar(252, 171, 373, 178); + setcolor( /*cfgFREC.Texto*/1 ); + outtextxy(252, 169, strupr(Archivo) ); + +} + + + +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////// +int InputCadenaG(char *s, int numalp, int lmax, int cc, int cf, int left, int up, int right, int down) +{ + + int ls; // longitud cadena + char *s1; // puntero a cadena inicial + int c, ok = 0; + + s1 = s; // inicio cadena + ls = strlen ( s ); // Longitud de actual + s += ls; // se coloca en el final + + setfillstyle(SOLID_FILL, cf); + do{ + bar(left, up, right, down); + setcolor(cc); + outtextxy( left, up-2, s1 ); + if ( ls < lmax ) { + setcolor(4); + outtextxy( left+textwidth( s1 ), up-2, "<"); + } + + + switch( c = getch() ) // obtiene tecla + { + case 0: + case 13: + ok = 1; // 13 = INTRO || Especiales + break; + case 8: + if ( ls > 0 ) { // 8 = Back Space + ls--; + s--; + *s = '\0'; + } + break; + case 27: + *s='\0'; + ok = 1; + break; + default: + if ( !numalp && c >= 32 && c <= 254 && ls < lmax) + { + *s++ = toupper(c); + ls++; + *s = '\0'; + } else + if ( numalp && isdigit(c) && ls < lmax) { + *s++ = c; + ls++; + *s = '\0'; + } + break; + } + + }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; +} + + + + + + + + + + +/************************************/ +/************************************//************************************/ +/************************************//************************************/ +/************************************//************************************/ +/************************************/ +#define SEC_OPTAR 3 +#define ENCUADRE 3 +int Optar( int optar, ... ) +{ + static void far *fondo, far *fd_aceptar, far *fd_cancelar; + static char Memoria = 0; + + int DEV = 0, ok = 0, linea = 0; + int Center; char *buff; + struct textsettingstype texttypeinfo; + + va_list ap; + va_start( ap, &optar ); + + if ( Memoria == 1 ) + { + putimage( 170, 165, fondo , COPY_PUT ); + putimage( 170, 320, fd_aceptar , COPY_PUT ); + putimage( 370, 320, fd_cancelar, COPY_PUT ); + + farfree( fondo ); + farfree( fd_aceptar ); + farfree( fd_cancelar ); + + Memoria = 0; + + if ( optar == ENCUADRE ) return DEV; + } + + if ( ( fondo = farmalloc( JD_imagesize( 170, 165, 470, 315 ) ) ) != NULL && + ( fd_aceptar = farmalloc( JD_imagesize( 170, 320, 270, 350 ) ) ) != NULL && + ( fd_cancelar = farmalloc( JD_imagesize( 370, 320, 470, 350 ) ) ) != NULL ) + { + Memoria = 1; + + getimage( 170, 165, 470, 315, fondo ); + getimage( 170, 320, 270, 350, fd_aceptar ); + getimage( 370, 320, 470, 350, fd_cancelar); + + gettextsettings( &texttypeinfo ); + + Imprime_Estaticos( 100, "llave.img" ); + + settextstyle( SMALL_FONT, HORIZ_DIR, 6 ); + + setcolor( 63 ); + + while ( (buff = va_arg(ap, char *)) != NULL ) + { + Center = (296 - textwidth( buff ) ) / 2; + outtextxy( 172+Center, ( (linea == 0 ) ? 167 : 200 + 20*linea ), buff ); + linea++; + } + + va_end(ap); + + settextstyle( texttypeinfo.font, texttypeinfo.direction, texttypeinfo.charsize ); + + + if ( optar != ENCUADRE ) + { + ok = 0; while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + do { + switch( Comprueba_Secuencia( SEC_OPTAR, NULL ) ) + { + case 0: // No se pulso ningun BOTON + case -2: + case -1: + while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER + if ( optar == 0 ) ok = 1; + break; + case 1: + DEV = 1; ok = 1; + break; + case 2: + DEV = 0; ok = 1; + break; + } + }while( !ok ); + + putimage( 170, 165, fondo , COPY_PUT ); + putimage( 170, 320, fd_aceptar , COPY_PUT ); + putimage( 370, 320, fd_cancelar, COPY_PUT ); + + farfree( fondo ); + farfree( fd_aceptar ); + farfree( fd_cancelar ); + + Memoria = 0; + + } + + + } else { + farfree( fondo ); + farfree( fd_aceptar ); + farfree( fd_cancelar ); + } + + + return DEV; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..5200c52 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +#LLAVE + + +*10/06/1992* + +ToDo: wwtcf? + + +![screenshot](/LLAVE.png "Screenshot") diff --git a/TEST1.LLV b/TEST1.LLV new file mode 100644 index 0000000000000000000000000000000000000000..647bc40bde5e74ecdcdbafeee54296fb25052ce0 GIT binary patch literal 34488 zcmeHQe{d8VIwBsCQ*ohNysKJ>&PY$Oag|T_wCu_ z{CV%{{;IJi&2jez?hh}Kby(l-Bw=a=R^l=8siTb_LE@stP3pWO0z zdCKj}@|G0mEx9Abo{^cEGACvEqva{~yHoC7Fn_)fm-E!-ZRJn?`d?frw?B3VrrmcZ zPDok$RQbk7H~n+ULz`TWmv4I1_2g5V9^EL!p_^(Dg{CIZ2o(Q&*Gqp%<6<(uk;7_E z9$TgTE)lIyZpm4S(0@P3tePp8G1HlaOaeN^bTdOtJc>sz8}Tz9vDBT^5vGtj#6H6= zVs}&V=sem-{h9hLYC%1y9L=B;(Eoqe1zDf9o%NYNW_^h#S@}(L2+45&9=(MAfSQom z*zi1(53;BQ>Sph&JIyMW+2oc3hU4)qC?mkVfiy)hv?$32J%UFb?O6V4aLE$G% z(k1Ddjj`n9*qG@#IkFPb!hVx9D1G&oRug3$bVZ!KJ=O1G#l+RLc*%Yy{J2^CO6*MS z+ctT)X|YSNpYdj|q3!+y@yFw3am22PVe!L*@i4Hqq!c z+g805N%!ol{x}dPE9FHiP zVGW!ye#+DvrX?g!A16#R&R=kUmSbV|A|N2d8bKGv{dmM9l#~Pn@KF+4tjWayzzs%8}pFivZjOgk8t&=96#d6nZFoE!R3h>jql4PK&>7g7)ovl#w#dG|Vw%8SXJa*Uhr*SwoA~ zRkY_TwqlxH3x>4+vM{2q9QHH1dMN)+AO47`*CIQ)5G$F_vTf(^J=ZUdjt%{<@+>Vo zD7Qf}m(zfmgLY4EsHHvGt7yh$s<#ZE6Fco%mF%Kr&sD}{@LXryam`#gO`-ja%8N(s zeT(bL>1OUUi;&m6iWWZ&hU}WO`yJY6-Ao6#5*o>~Ef$Qs=4NIyOkFW8*E(s*x{j`M zLZ)@JTu>-|Aa(5Eob(Qe!U%DKPR%Q(rR>+)@N}A@>Y|Kj#Tq&0pvx2Qr0sqCnU0?K zUgVjzqCRM0;(I(N&>Q@N0p7u|M2>fTRxTwuP6Hg;T)x;i3Ev^r$W5Z`>B7eCCX4Y51@^5JGw zFEn#d03AWJnvUbo=g&ub`q@Lz(GJ1Q z99l$8%y7QMPBy^70CHGd366MoB6n~x+UalDfdDh(tPO4hPSt$bXIX_uHT|r;4l#X-i!C7H-=#DVN)k8|TaAq+E7K zF7L}_N4kL4))Tv>QS39LQZXxj=s9O>`yAiQHO!F*MxJ&>D&^Bl*{#oHb(QByElb+Y zOObT7EtEdQbcsD_{){$r4_iUUHO;)Zjb&7IO5_DYn!ma^pNRxpt4|>{4(3x1h}2J^D4?mMn&ywJ$NJ1zvl`2(|HwLBPVYF4*MNEkbhb*q zk4-4NX=iqqnt( zLX2`VT9f*z*qkay#3tJd2C;cK2w}S)!g(@O|Nc?8L2QDFqF}Y%KeV@Ojo2K^nb$ii zYtJo8wip@8;hVEJx3; zdmHED_{nGl_ysoNsv}u`!jS}vchr=WxdH0w(91cHAJ~{U202Xlav%h`C)y6amYInc ze0)`M+o3(s%s}A$SsV}e{o4@-)WC@?dOQkoYi1?p4Dszi<|_64AU_Gs2l0+^KWWhK z*8$L}n2t~@1^|5EulpE*%2@pTSwH5786vc4^M(x@fL`gZJw^C&?8tP}^(*atlG4_XZ^x2y*6~ca-Qg*pc@W{X zqY_nJM669R+N9O6J)C^nWn`3{@2d$fzKf`;qnoZBM1wp1DrYuU9Ysb@_7IO;OKegu zvPq@1OhT(-uQm1j0d1hhI08P*zM#mnJ} z@E!=cC$CuS8*=qp2P33Dge#90Hm-dpfA zeWfffdAa-bk`g8Hstkhcns=eN5HjFiAO3jYPmFhAF3uQIKLPFd`>$`$OW!GAYb_qv6;rSL$tmk;BC;WZHwUCsgK9jd+GerCWXE=;}NJ`fDWbw^vD9gJ!Aw2@{C zxnOT9%AOGQ8Vjo40&j2fis-Rz!hYk*as5}e8N|j@5^h{X>S(x0kd=QkcoR9nYt0nu z?iPIJxk6m~Rz`V>_1P|)0$iMcq%W#2dXN}U5{AXW!h@Q&e7P?dDZgiHJK6MRJyLhg z)XYUq2-SYf*3kmcwx9qvNkGa579!h`Q>kZdsRnnl{i1sNTA%frsdm^@7d6#hF+qN5 z1zNVO`l{v@lyhH7Ah#w?2!0?-+kq@?!H-gS6#1-1K|GodwT3n*FR{vJND)!VYqX1d zjdh#V8$H<|(rr6J=3f04nO%NMd{*)NBc@y*`gR(iQhH|5go~yiDupi5t=#)O@ z+nwT@H*5;uNh^2IN-;go%<)ZTAG6Qi`2&1j`VJphUK*7+r2ct@Z{8JC_#$QVEJQ9! z*5$f$#tM~LXzsCEL0F9w+>^5gD~#0vK5vOSPzKv67aFr4bB2fMzwF`pSdD2mKH{v` z!Z$L7O0T}_Hb!&~?OF2#p`sN!0JEu&!%7KDh5@Ua`k6ieU^7icYSRT6qwq=q^GH1# zshy)oc^s9;Ruz9MqckFghxSUxr6}abySG>YOn@*S!2wJzT@PD4<%L*f>4?+Q&#HH1 zLA%R2fH3^8^f+J%-vIvC^zhLt7o&iB>s~FpPW%MEJ6-mf(*_T{m@Jgy;KIKT##3PZrCsZ79#FoyvsUs~n_W$tGMmq9r^ zs4~i*2E`V+nd@Y`;k!>iJEh_V99geNEEOD%G^5%eYv57cWC3QYIYv|`2s#2M**Z%s z)XvsT5#T))PuQTZmI$7J@jGl>tirnfi-Fhz069t`6AifuImJe(*r`IXC$_dN6`LYX z`2elb2l(;s{kjL2V$OO7&o#|Gqo^Ps0LQ%$nr!#S8FPBSO7**GdwU6dWWet0)t;hq z;QKGR2m%Cwp92C;gi>8UhlY?g5CjMU1Ob8oL4Y7Y5FiK;1PB5@Is(5*+MP};41aW( ze?bC>g(0ypBo>CT54*&|kXRTJ3qxXINGuG0$h?tQ7!nIZVqqAwG$a;=#KLfZSQvuw zJh3n&7KX&akXRTJ3qxXINGuGAh2byg(>ZA>LEtBc0I@Lq$#n^-5J7+-KoB4Z5CjMU z1Ob8oLEtBg0I@Lq$#%^@XvK(yA+azd7KX&akep#i&M+ir7?Lv#|M~%n#KMqR7!nIZ zVqr+mFeGOfk~0j+8HRB18acy|oMDK_8HS8P&M+ir7?Lv#|3N>2lWG$Lel`dY3&WpH zSCWPh1PB5I0fGQQfFM8+AP5iyeslzgh2f75@h?mOu`nbShQz{05#