Anda di halaman 1dari 204

UNIVERSIDAD POLITCNICA DE VALENCIA

ESCUELA UNIVERSITARIA DE INGENIERA TCNICA INDUSTRIAL DE VALENCIA

PROYECTO:
VERIFICACIN DE CIRCUITOS ELECTRNICOS ASISTIDA POR COMPUTADOR

2.- MANUAL DEL PROGRAMADOR

PROYECTO FIN DE CARRERA REALIZADO POR : D. JULIO MARTNEZ JUAN DIRIGIDO POR : D. EDUARDO GARCA BREIJ ESPECIALIDAD : ELTRICA SECCIN : ELECTRNICA Valencia a 31 de Mayo de 1992

NDICE (MANUAL DEL PROGRAMADOR)

1.- INTRODUCCIN AL MANUAL DEL PROGRAMADOR . . . . . . . . . . . . . . . . . 1.- Unidades empleadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.- Archivos Include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.- Archivos ejecutables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.- El programa principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1 1 2 2 3

2.- UNIDADES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.- ERR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1.- DESCRIPCIN DE LA UNIDAD . . . . . . . . . . . . . . . . . . . . . 2.1.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . . . 2.1.3.- OTRAS UNIDADES EMPLEADAS . . . . . . . . . . . . . . . . . . . . 2.1.4.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.5.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.6.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.- VISUAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1.- DESCRIPCIN DE LA UNIDAD . . . . . . . . . . . . . . . . . . . . 2.2.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . . 2.2.3.- OTRAS UNIDADES EMPLEADAS . . . . . . . . . . . . . . . . . . . 2.2.4.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.5.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.6.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I

4 4 4 4 4 5 5 5 21 21 21 21 22 24 25

3.- FICHEROS INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.- AYUDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1.- DESCRIPCIN DEL ARCHIVO . . . . . . . . . . . . . . . . . . . . . 3.1.2.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.3.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.4.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.- GEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1.- DESCRIPCIN DEL ARCHIVO . . . . . . . . . . . . . . . . . . . . . 3.2.2.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.4.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.- EJECUTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1.- DESCRIPCIN DEL ARCHIVO . . . . . . . . . . . . . . . . . . . . 3.3.2.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.4.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76 76 76 76 77 77 82 82 82 82 82 107 107 107 107 107

4.- ARCHIVOS EJECUTABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.- ESPACIO1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1.- DESCRIPCIN DEL PROGRAMA . . . . . . . . . . . . . . . . . . 4.1.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . 4.1.3.- UNIDADES UTILIZADAS . . . . . . . . . . . . . . . . . . . . . . . . 4.1.4.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.5.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . .

125 125 125 126 126 126 128

II

4.1.6.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.- LOCALIZA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1.- DESCRIPCIN DEL PROGRAMA . . . . . . . . . . . . . . . . . . 4.2.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . 4.2.3.- UNIDADES UTILIZADAS . . . . . . . . . . . . . . . . . . . . . . . . 4.2.4.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.5.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.6.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.- INSTALA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.1.- DESCRIPCIN DEL PROGRAMA . . . . . . . . . . . . . . . . . . 4.3.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . 4.3.3.- UNIDADES UTILIZADAS . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.5.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.6.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

128 139 139 140 140 140 141 141 151 151 151 152 152 153 153

4.- PROGRAMA PRINCIPAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.- DESCRIPCIN DEL PROGRAMA . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.- DIRECTIVAS DE COMPILACIN . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.- UNIDADES UTILIZADAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4.- DIAGRAMAS DE BLOQUES DEL PROGRAMA PRINCIPAL . . . . . 4.5.- VARIABLES GLOBALES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6.- VARIABLES LOCALES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7.- LISTADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

167 167 167 167 167 169 172 173

III

1.- INTRODUCCIN AL MANUAL DEL PROGRAMADOR

El propsito de este manual del programador es dar a conocer al lector todos los listados del programa realizado. Para ello se tratar de forma amena y concisa un repaso de todas las Unidades, ficheros Include, ejecutables..., con el fin de que el usuario del conjunto pueda modificar a su gusto algunos de los valores y parmetros de las funciones expuestas.

1.- Unidades empleadas.

Se han empleado el conjunto de unidades de compilacin independiente, que suministra Turbo Pascal 6.0, formado por :

Unidad CRT Unidad DOS Unidad GRAPH

Y se ha creado para facilitar la ejecucin, compilacin y comprensin del programa, las unidades de compilacin independiente siguientes :

Unidad ERR Unidad VISUAL

MANUAL DEL PROGRAMADOR: Introduccin

En todo programa (y/o Unidad) se habrn declarado las unidades utilizadas en el mismo al comienzo, en la declaracin USES.

2.- Archivos Include.

Se declaran en el programa principal mediante la sentencia {$I <nombre de fichero>} y constituyen un total de dos. El primero, que contiene el conjunto de comprobacin y transformacin del formato del fichero .TXT de PSPICE (opcin fichero PSP), y el segundo que contiene la aplicacin de asignacin de canales de la tarjeta de adquisicin y verificacin del circuito a evaluar (opcin ejecutar). Son los siguientes :

Archivo Include GEN Archivo Include EJECUTA

Adems podemos encontrar un archivo include ms que pertenece a la unidad VISUAL y que incluye la opcin de ayuda en lnea.

Archivo Include AYUDA

3.- Archivos ejecutables.

Son los ficheros que se ejecutarn desde el entorno de sistema operativo. Son:

MANUAL DEL PROGRAMADOR: Introduccin

Ejecutable ESPACIO1 Ejecutable LOCALIZA

Adems del archivo de instalacin INSTALA.

4.- El programa principal.

Conjugar el conjunto de los archivos expuestos anteriormente, y se compilar conteniendo todos ellos (menos los ejecutables, que realizar la oportuna llamada a ellos cuando convenga). Es el archivo :

EVAL

2.- UNIDADES

Las dos unidades que trataremos en ste apartado sern ERR y VISUAL.

2.1.- ERR

2.1.1.- DESCRIPCIN DE LA UNIDAD.

La unidad aqu presentada contiene las llamadas de aplicacin al tratamiento de tipo de error correspondiente a cualquier instruccin en tiempo de ejecucin. As mismo contiene los procedimientos (y/o funciones) que utilizamos para hacer desaparecer y aparecer el cursor (en modo texto), delimitar el tipo de adaptador (y modo de vdeo actual), dibujar el doble recuadro, dibujar rayas horizontales, descargar el buffer de teclado, obtener la fecha de sistema, y salvar la pantalla inicial antes de comenzar a ejecutar (as como cargarla al terminar la ejecucin).

2.1.2.- DIRECTIVAS DE COMPILACIN.

No existe NINGUNA directiva de compilacin utilizada para esta unidad.

2.1.3.- OTRAS UNIDADES EMPLEADAS.

Las unidades que utiliza son las siguientes : CRT y DOS.

MANUAL DEL PROGRAMADOR: Unidades

2.1.4.- VARIABLES GLOBALES.

TYPE TipoAdaptador = (Ninguno,MDA,CGA,EGAMono,EGAColor,VGAMono, VGAColor,MCGAMono,MCGAColor); VAR X1 : INTEGER; Y1 : INTEGER; X2 : INTEGER; Y2 : INTEGER; PP : INTEGER; F : INTEGER; X1 X2 Y C ERROR LARGA PTRACUM : : : : BYTE; BYTE; BYTE; BYTE;

: INTEGER; : STRING; : POINTER;

2.1.5.- VARIABLES LOCALES.

Son las que se declaran y se utilizan en cada procedimiento y/o funcin. (Ver listado).

2.1.6.- LISTADO.

UNIT ERR;

INTERFACE TYPE

MANUAL DEL PROGRAMADOR: Unidades

TipoAdaptador = (Ninguno,MDA,CGA,EGAMono,EGAColor,VGAMono, VGAColor,MCGAMono,MCGAColor); PROCEDURE DIBUJARCUADRO(X1,Y1,X2,Y2,PP,F:INTEGER); PROCEDURE RAYA_HORIZONTAL(X1,X2,Y,C:BYTE); PROCEDURE ERROR(ERROR:INTEGER); PROCEDURE DESCARGARTECLADO; PROCEDURE CURSOROFF; FUNCTION OBTENERTIPOADAP : TIPOADAPTADOR; FUNCTION MODOVIDEOACTUAL : CHAR; PROCEDURE CURSORON; PROCEDURE OBTENERFECHA (VAR LARGA:STRING); FUNCTION DETERMINARPUNTOS : INTEGER; PROCEDURE SALVARPANTALLA(VAR PTRACUM : POINTER); PROCEDURE CARGARPANTALLA(PTRACUM : POINTER); IMPLEMENTATION USES CRT,DOS; (**********************************************************) PROCEDURE DIBUJARCUADRO(X1,Y1,X2,Y2,PP,F:INTEGER); VAR MARCA:BYTE; BEGIN TEXTCOLOR(PP); TEXTBACKGROUND(F); FOR MARCA:=(X1+1) TO (X2-1) DO BEGIN GOTOXY(MARCA,Y1); WRITE(#205); GOTOXY(MARCA,Y2); WRITE(#205); END; FOR MARCA:=(Y1+1) TO (Y2-1) DO BEGIN GOTOXY(X1,MARCA); WRITE(#186); GOTOXY(X2,MARCA); WRITE(#186); END; GOTOXY(X1,Y1); WRITE(#201); GOTOXY(X2,Y1); WRITE(#187); GOTOXY(X1,Y2); WRITE(#200); GOTOXY(X2,Y2); WRITE(#188); END; (**********************************************************)

MANUAL DEL PROGRAMADOR: Unidades

PROCEDURE RAYA_HORIZONTAL(X1,X2,Y,C:BYTE); VAR MARCA:BYTE; BEGIN TEXTCOLOR(C); FOR MARCA:=(X1+1) TO (X2-1) DO BEGIN GOTOXY(MARCA,Y); WRITE(#196) END; TEXTCOLOR(WHITE) END; (**********************************************************) PROCEDURE ERROR(ERROR:INTEGER); BEGIN BEGIN (*--------------------ERRORES DEL DOS-------------------*) IF ERROR<32700 THEN BEGIN CASE ERROR OF 1: BEGIN DIBUJARCUADRO(24,14,52,16,YELLOW,RED); GOTOXY(25,15); WRITELN(NUMERO DE FUNCION NO VALIDO) END; 2: BEGIN DIBUJARCUADRO(27,14,49,16,YELLOW,RED); GOTOXY(28,15); WRITELN(ARCHIVO NO ENCONTRADO) END; 3: BEGIN DIBUJARCUADRO(25,14,54,16,YELLOW,RED); GOTOXY(26,15); WRITELN(ENCAMINAMIENTO NO ENCONTRADO) END; 4: BEGIN DIBUJARCUADRO(25,14,54,16,YELLOW,RED); GOTOXY(26,15); WRITELN(DEMASIADOS ARCHIVOS ABIERTOS) END; 5: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN(ACCESO A ARCHIVO DENEGADO) END; 6:

MANUAL DEL PROGRAMADOR: Unidades

BEGIN DIBUJARCUADRO(23,14,56,16,YELLOW,RED); GOTOXY(24,15); WRITELN(DESCRIPTOR DE FICHEROS NO VALIDO) END; 7: BEGIN DIBUJARCUADRO(20,14,61,16,YELLOW,RED); GOTOXY(21,15); WRITELN(BLOQUES DE CONTROL DE MEMORIA DESTRUIDOS) END; 8: BEGIN DIBUJARCUADRO(29,14,50,16,YELLOW,RED); GOTOXY(30,15); WRITELN(MEMORIA INSUFICIENTE) END; 9: BEGIN DIBUJARCUADRO(19,14,60,16,YELLOW,RED); GOTOXY(20,15); WRITELN(DIRECCION DE BLOQUE DE MEMORIA NO VALIDA) END; 10: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN(ENTORNO DEL DOS NO VALIDO) END; 11: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN(FORMATO NO VALIDO) END; 12: BEGIN DIBUJARCUADRO(21,14,58,16,YELLOW,RED); GOTOXY(22,15); WRITELN(CODIGO DE ACCESO AL ARCHIVO INVALIDO) END; 13: BEGIN DIBUJARCUADRO(31,14,48,16,YELLOW,RED); GOTOXY(32,15); WRITELN(DATOS NO VALIDOS) END; 15: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN(NUMERO DE UNIDAD DE DISCO INVALIDO) END; 16: BEGIN

MANUAL DEL PROGRAMADOR: Unidades

DIBUJARCUADRO(20,14,60,16,YELLOW,RED); GOTOXY(21,15); WRITELN(IMPOSIBLE ELIMINAR EL DIRECTORIO ACTUAL) END; 17: BEGIN DIBUJARCUADRO(16,14,61,16,YELLOW,RED); GOTOXY(17,15); WRITELN(NO SE PUEDE RENOMBRAR ENTRE UNIDADES DISTINTAS) END; 18: BEGIN DIBUJARCUADRO(23,14,46,16,YELLOW,RED); GOTOXY(24,15); WRITELN(NO QUEDAN MAS FICHEROS) END; (*-----------------ERRORES DE E/S-------------------*) 100: BEGIN DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN(ERROR DE LECTURA EN DISCO) END; 101: BEGIN DIBUJARCUADRO(26,14,54,16,YELLOW,RED); GOTOXY(27,15); WRITELN(ERROR DE ESCRITURA EN DISCO) END; 102: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN(ARCHIVO NO ASIGNADO) END; 103: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN(EL ARCHIVO NO HA SIDO ABIERTO) END; 104: BEGIN DIBUJARCUADRO(24,14,56,16,YELLOW,RED); GOTOXY(25,15); WRITELN(ARCHIVO NO ABIERTO PARA LECTURA) END; 105: BEGIN DIBUJARCUADRO(23,14,57,16,YELLOW,RED); GOTOXY(24,15); WRITELN(ARCHIVO NO ABIERTO PARA ESCRITURA) END; 106: BEGIN

MANUAL DEL PROGRAMADOR: Unidades

DIBUJARCUADRO(27,14,53,16,YELLOW,RED); GOTOXY(28,15); WRITELN(FORMATO NUMERICO INVALIDO) END; (*----------------ERRORES CRITICOS----------------*) 150: BEGIN DIBUJARCUADRO(23,14,56,16,YELLOW,RED); GOTOXY(24,15); WRITELN(DISCO PROTEGIDO CONTRA ESCRITURA) END; 151: BEGIN DIBUJARCUADRO(30,14,49,16,YELLOW,RED); GOTOXY(31,15); WRITELN(UNIDAD DESCONOCIDA) END; 152: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN(UNIDAD NO PREPARADA) END; 153: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN(ORDEN DESCONOCIDA) END; 154: BEGIN DIBUJARCUADRO(15,14,64,16,YELLOW,RED); GOTOXY(16,15); WRITELN(ERROR EN CRC (Comprobacin Cclica) DE LOS DATOS) END; 155: BEGIN DIBUJARCUADRO(19,14,61,16,YELLOW,RED); GOTOXY(20,15); WRITELN(LONGITUD DE PETICION DE UNIDAD INCORRECTA) END; 156: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN(ERROR DE BUSQUEDA EN EL DISCO); WRITELN(^g) END; 157: BEGIN DIBUJARCUADRO(26,14,53,16,YELLOW,RED); GOTOXY(27,15); WRITELN(TIPO DEL MEDIO DESCONOCIDO) END; 158:

10

MANUAL DEL PROGRAMADOR: Unidades

BEGIN DIBUJARCUADRO(29,14,50,16,YELLOW,RED); GOTOXY(30,15); WRITELN(SECTOR NO ENCONTRADO) END; 159: BEGIN DIBUJARCUADRO(30,14,50,16,YELLOW,RED); GOTOXY(31,15); WRITELN(IMPRESORA SIN PAPEL) END; 160: BEGIN DIBUJARCUADRO(21,14,58,16,YELLOW,RED); GOTOXY(22,15); WRITELN(FALLO DE ESCRITURA EN EL DISPOSITIVO) END; 161: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN(FALLO DE LECTURA EN EL DISPOSITIVO) END; 162: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN(FALLO EN HARDWARE) END; (*---------------ERRORES FATALES---------------*) 200: BEGIN DIBUJARCUADRO(31,14,49,16,YELLOW,RED); GOTOXY(32,15); WRITELN(DIVISION POR CERO) END; 201: BEGIN DIBUJARCUADRO(24,14,55,16,YELLOW,RED); GOTOXY(25,15); WRITELN(ERROR DE COMPROBACION DE RANGO) END; 202: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN(ERROR DE DESBORDAMIENTO DE LA PILA) END; 203: BEGIN DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN(ERROR DE DESBORDAMIENTO DEL MONTON) END; 204:

11

MANUAL DEL PROGRAMADOR: Unidades

BEGIN DIBUJARCUADRO(24,14,56,16,YELLOW,RED); GOTOXY(25,15); WRITELN(OPERACION DE PUNTEROS INVALIDOS) END; 205: BEGIN DIBUJARCUADRO(17,14,62,16,YELLOW,RED); GOTOXY(18,15); WRITELN(DESBORDAMIENTO EN OPERACION DE COMA FLOTANTE) END; 206: BEGIN DIBUJARCUADRO(13,14,67,16,YELLOW,RED); GOTOXY(14,15); WRITELN(DESBORDAMIENTO INFERIOR EN OPERACION DE COMA FLOTANTE) END; 207: BEGIN DIBUJARCUADRO(22,14,58,16,YELLOW,RED); GOTOXY(23,15); WRITELN(OPERACION DE COMA FLOTANTE INVALIDA) END; 208: BEGIN DIBUJARCUADRO(22,14,58,16,YELLOW,RED); GOTOXY(23,15); WRITELN(GESTOR DE SOLAPAMIENTO NO INSTALADO) END; 209: BEGIN DIBUJARCUADRO(18,14,62,16,YELLOW,RED); GOTOXY(19,15); WRITELN(ERROR DE LECTURA EN ARCHIVO DE SOLAPAMIENTO) END; 210: BEGIN DIBUJARCUADRO(28,14,51,16,YELLOW,RED); GOTOXY(29,15); WRITELN(OBJETO NO INICIALIZADO) END; 211: BEGIN DIBUJARCUADRO(25,14,55,16,YELLOW,RED); GOTOXY(26,15); WRITELN(LLAMADA A UN METODO ABSTRACTO) END; 212: BEGIN DIBUJARCUADRO(26,14,53,16,YELLOW,RED); GOTOXY(27,15); WRITELN(ERROR DE REGISTRO EN FLUJO) END; 213: BEGIN

12

MANUAL DEL PROGRAMADOR: Unidades

DIBUJARCUADRO(22,14,57,16,YELLOW,RED); GOTOXY(23,15); WRITELN(INDICE DE COLECCION FUERA DE RANGO) END; 214: BEGIN DIBUJARCUADRO(20,14,60,16,YELLOW,RED); GOTOXY(21,15); WRITELN(ERROR DE DESBORDAMIENTO EN LA COLECCION) END END; WRITELN(^g); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END (*------------RESTO DE ERRORES FATALES Y GENERALES--------*) {errores escogidos por nosotros} ELSE BEGIN CASE ERROR OF 32758: BEGIN DIBUJARCUADRO(17,11,59,14,YELLOW,RED); GOTOXY(18,12); WRITELN( NO HA SIDO ASIGNADO NIGUN CANAL DE LA ); GOTOXY(18,13); WRITELN( PCLAB A NINGUN NUDO DEL CIRCUITO ) END; 32759: BEGIN DIBUJARCUADRO(18,14,60,17,YELLOW,RED); GOTOXY(19,15); WRITELN( ATENCION: NO LLEGAN DATOS POR EL PUERTO ); GOTOXY(19,16); WRITELN( POSIBLEMENTE PCLAB NO CONECTADA ) END; 32760: BEGIN DIBUJARCUADRO(21,9,59,14,YELLOW,RED); GOTOXY(22,10); WRITELN( OPCION NO ENCONTRADA, SITUESE EN ); GOTOXY(22,11); WRITELN( DIRECTORIO DONDE SE ENCUENTRE EL ); GOTOXY(22,12); WRITELN( ARCHIVO "LOCALIZA.EXE", Y VUELVA A ); GOTOXY(22,13); WRITELN( EJECUTAR. UTILICE OPCION CH. DIRECT ) END; 32761: BEGIN DIBUJARCUADRO(21,9,59,14,YELLOW,RED);

13

MANUAL DEL PROGRAMADOR: Unidades

GOTOXY(22,10); WRITELN( OPCION NO ENCONTRADA, SITUESE EN ); GOTOXY(22,11); WRITELN( DIRECTORIO DONDE SE ENCUENTRE EL ); GOTOXY(22,12); WRITELN( ARCHIVO "ESPACIO1.EXE", Y VUELVA A ); GOTOXY(22,13); WRITELN( EJECUTAR. UTILICE OPCION CH. DIRECT ) END; 32762: BEGIN DIBUJARCUADRO(21,14,59,17,YELLOW,RED); GOTOXY(22,15); WRITELN( FICHERO DE ENTRADA NO CORRECTO POR ); GOTOXY(22,16); WRITELN( DEFECTO O EXCESO EN SU LONGITUD ) END; 32763: BEGIN GOTOXY(6,14); WRITELN(EL FICHERO PSPICE CARECE DE LA MARCA DE FIN DE DATOS: ";"); GOTOXY(6,15); WRITELN(AADESELA PARA PODER EFECTUAR LA EVALUACION) END; 32764: BEGIN GOTOXY(6,14); WRITELN(EL FICHERO PSPICE CONTIENE EN EL APARTADO TITLE O SUBTITLE ); GOTOXY(6,15); WRITELN(EL CARACTER ESPECIFICO DEL PROGRAMA : "#" , CAMBIELO CON ); GOTOXY(6,16); WRITELN(UN PROCESADOR ANTES DE VOLVER A EJECUTARLO) END; 32765: BEGIN GOTOXY(6,14); WRITELN(EL TITULO DEL FICHERO CONTIENE UN CARACTER ESPECIFICO DEL PROGRAMA,); GOTOXY(6,15); WRITELN(USE RENAME DEL DOS ANTES DE REPETIR LA EJECUCION CON EL MISMO.) END; 32766: BEGIN GOTOXY(6,14); WRITELN(EL FICHERO HA SIDO DAADO O PERDIDO Y NO MANTIENE EL FORMATO ADECUADO); GOTOXY(6,15); WRITELN(PARA SER UTILIZADO. INVESTIGUESE ANTES DE EJECUTARSE DE NUEVO.) END;

14

MANUAL DEL PROGRAMADOR: Unidades

32767: BEGIN DIBUJARCUADRO(22,14,57,17,YELLOW,RED); GOTOXY(23,15); WRITELN( EL PROGRAMA SOLO ADMITE FICHEROS ); GOTOXY(23,16); WRITELN( CON LA EXTENSION .TXT ); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END ELSE BEGIN DIBUJARCUADRO(33,14,47,16,YELLOW,RED); GOTOXY(34,15); WRITELN(ERROR GENERAL); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE) END END; IF ERROR<>32758 THEN WRITELN(^g) END END END; (**********************************************************) PROCEDURE DESCARGARTECLADO; VAR REGS : REGISTERS; { Utiliza la unidad DOS } BEGIN REGS.AH := $01; { AH=1: Comprueba tecla pulsada } INTR($16,REGS); { Interrupcin $16: servicios de teclado } IF (REGS.FLAGS AND $0040) = 0 THEN { Si hay caracteres en el buffer } REPEAT REGS.AH := 0; { Carcter listo; ir a leerlo... } INTR($16,REGS); { ...utilizando AH = 0: Leer carcter } REGS.AH := $01; { Comprobar otra tecla pulsada... } INTR($16,Regs); { ...usando AH = 1 } UNTIL (REGS.FLAGS AND $0040) <> 0; END; (**********************************************************) PROCEDURE CURSOROFF; VAR REGS : Registers; BEGIN WITH REGS DO

15

MANUAL DEL PROGRAMADOR: Unidades

BEGIN AX := $0100; CX := $2000; { Pone a 1 el bit 5 de CH para suprimir el cursor } END; INTR(16,REGS); END; (**********************************************************) FUNCTION OBTENERTIPOADAP : TIPOADAPTADOR; VAR REGS : REGISTERS; CODIGO : BYTE; BEGIN REGS.AH := $1A; { Intenta identificar un adaptador VGA } REGS.AL := $00; { Es preciso hacer AL igual a 0 } INTR($10,Regs); IF REGS.AL = $1A THEN { ...si obtenemos $1A en AL... } BEGIN { ...sabemos que tenemos un PS/2 video BIOS. } CASE REGS.BL OF { Cdigo se obtiene en BL } $00 : OBTENERTIPOADAP := Ninguno; $01 : OBTENERTIPOADAP := MDA; $02 : OBTENERTIPOADAP := CGA; $04 : OBTENERTIPOADAP := EGAColor; $05 : OBTENERTIPOADAP := EGAMono; $07 : OBTENERTIPOADAP := VGAMono; $08 : OBTENERTIPOADAP := VGAColor; $0A,$0C : OBTENERTIPOADAP := MCGAColor; $0B : OBTENERTIPOADAP := MCGAMono; ELSE OBTENERTIPOADAP := CGA END { CASE } END ELSE { A continuacin comprobamos la presencia de un EGA BIOS: } BEGIN REGS.AH := $12; { Seleccionar funcin de servicio alterna } REGS.BX := $10; { BL=$10 significa devolver informacin EGA } INTR($10,Regs); { Llamada a BIOS VIDEO } IF REGS.BX <> $10 THEN { BX sin cambios significa NO EGA } BEGIN REGS.AH := $12; { Una vez sabemos que la f. alterna existe... } REGS.BL := $10; { ...la llamamos de nuevo para distinguir... } INTR($10,Regs); { ...EGA color o EGA monocroma. } IF (REGS.BH = 0) THEN ObtenerTipoAdap := EGAColor ELSE OBTENERTIPOADAP := EGAMono END ELSE { Ahora sabemos que tenemos una EGA o MDA: } BEGIN INTR($11,Regs); { Servicio de determ. equipo } CODIGO := (Regs.AL AND $30) SHR 4; CASE CODIGO OF 1 : OBTENERTIPOADAP := CGA; 2 : OBTENERTIPOADAP := CGA;

16

MANUAL DEL PROGRAMADOR: Unidades

3 : OBTENERTIPOADAP := MDA ELSE OBTENERTIPOADAP := CGA END { Case } END END; END; (**********************************************************) FUNCTION MODOVIDEOACTUAL : CHAR; VAR REGS : REGISTERS; BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$0F; INTR($10,REGS); CASE REGS.AL OF 1..6 : MODOVIDEOACTUAL := C; {CGA} 7 : MODOVIDEOACTUAL := M; {monocromo} 8..10 : MODOVIDEOACTUAL := P; {PCjr} 13..16 : MODOVIDEOACTUAL := E {EGA} END END; (*********************************************************) PROCEDURE CURSORON; VAR REGS : REGISTERS; I : INTEGER; BEGIN IF MODOVIDEOACTUAL = M THEN I:=6 ELSE I:=0; REGS.AH:=$01; {ahora hacemos el cursor pequeo} REGS.CH:=$6+I; REGS.CL:=$7+I; INTR($10,REGS) END; (**********************************************************) PROCEDURE OBTENERFECHA (VAR LARGA:STRING); VAR REGS:REGISTERS; CAD1,CAD2,CAD3,CAD4:STRING[10];

17

MANUAL DEL PROGRAMADOR: Unidades

BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$2A; MSDOS(REGS); WITH REGS DO BEGIN CASE AL OF 0 : CAD1:=DOMINGO; 1 : CAD1:=LUNES; 2 : CAD1:=MARTES; 3 : CAD1:=MIERCOLES; 4 : CAD1:=JUEVES; 5 : CAD1:=VIERNES; 6 : CAD1:=SABADO END; STR(CX, CAD2); {ao} STR(DH, CAD3); {mes} STR(DL, CAD4) {da} END; IF LENGTH(CAD3)=1 THEN CAD3:=0+CAD3; IF LENGTH(CAD4)=1 THEN CAD4:=0+CAD4; LARGA:=CAD1+ +CAD4+-+CAD3+-+CAD2 END; (**********************************************************) FUNCTION DETERMINARPUNTOS : INTEGER; VAR REGS : REGISTERS; BEGIN CASE OBTENERTIPOADAP OF CGA : DETERMINARPUNTOS := 8; MDA : DETERMINARPUNTOS := 14; EGAMono, { Estos adaptadorse pueden utilizar cualquiera } EGAColor, { de las diferentes alturas posibles para el tipo, } VGAMono, { por tanto, es necesario preguntar al BIOS } VGAColor, { para saber cul se est utilizando } MCGAMono, MCGAColor : BEGIN WITH REGS DO BEGIN AH := $11; { Llamada informacin EGA/VGA } AL := $30; BL := 0; END; INTR($10,Regs); DETERMINARPUNTOS := Regs.CX END END { CASE } END; (**********************************************************)

18

MANUAL DEL PROGRAMADOR: Unidades

PROCEDURE CARGARPANTALLA(PTRACUM : POINTER); TYPE PTRVID = ^SALVAVID; SALVAVID = RECORD BASE,TAM : WORd; COMBUFFER : BYTE END; VAR VECTORVID : PTRVID; BUFFERVID : POINTER; TAMDAT : WORD; BEGIN VECTORVID := PTRACUM; { Solapa puntero genrico con puntero SalvaVid } TAMDAT := VECTORVID^.TAM; { Crea un puntero a la base del buffer de vdeo: } BUFFERVID := PTR(VECTORVID^.BASE,0); { Copia la parte de buffer de los datos del heap en el buffer de vdeo: } MOVE(VECTORVID^.COMBUFFER,BUFFERVID^,VECTORVID^.TAM); FREEMEM(PTRACUM,TAMDAT + 4) END; (**********************************************************) PROCEDURE SALVARPANTALLA(VAR PTRACUM : POINTER); TYPE PTRVID = ^SALVAVID; SALVAVID = RECORD BASE,TAM : WORD; COMBUFFER : BYTE END; VAR BUFFERVID : POINTER; ADAPT : TIPOADAPTADOR; BUFFERACUM : SALVAVID; VECTORVID : PTRVID; BEGIN ADAPT := OBTENERTIPOADAP; WITH BUFFERACUM DO BEGIN CASE ADAPT OF MDA,EGAMono,VGAMono,MCGAMono : BASE := $B000; ELSE BASE := $B800 END; { CASE } CASE DETERMINARPUNTOS OF 8 : CASE ADAPT OF CGA : TAM := 4000; { 25-lneas } EGAMono,EGAColor : TAM := 6880; { 43-lneas } ELSE TAM := 8000; { 50-lneas } END; { CASE }

19

MANUAL DEL PROGRAMADOR: Unidades

14 : CASE ADAPT OF EGAMono,EGAColor : TAM := 4000; { 25-lneas } ELSE TAM := 4320; { 27-lneas } END; { CASE } 16 : TAM := 4000 END; { CASE } BUFFERVID := PTR(BASE,0) END; GETMEM(PTRACUM,BUFFERACUM.TAM+4); { Asigna un espacio en el heap } { Aqu almacenamos solamente el registro SalvaVid en el heap: } MOVE(BUFFERACUM,PTRACUM^,SIZEOF(BUFFERACUM)); { Solapamos PtrAcum, un puntero genrico, a un puntero de tipo SalvaVid: } VECTORVID := PTRACUM; { Almacenamos ahora todo el buffer de vdeo en el heap. Los datos son } { escritos comenzando por el byte ComBuffer del registro SalvaVid, } { hasta completar los Tam bytes del buffer completo. } MOVE(BUFFERVID^,VECTORVID^.COMBUFFER,BUFFERACUM.TAM) END; (**********************************************************) END.

20

MANUAL DEL PROGRAMADOR: Unidades

2.2.- VISUAL

2.2.1.- DESCRIPCIN DE LA UNIDAD.

La unidad de compilacin independiente que aqu se propone se encarga de realizar de forma autnoma la opcin de visualizacin de formas de onda. La manera con que realiza este trabajo es simple; se trata de un procedimiento principal (situado por jerarqua de llamadas al final del programa) que llama segn necesite, a los dems procedimientos de su propia unidad, configurando el conjunto de visualizacin de ondas.

Este procedimiento principal, que caracteriza la unidad, dibuja la pantalla de presentacin y se encarga de elegir y dirigir su ejecucin hacia los diferentes procedimientos de submens que seleccionan las utilidades del mismo.

2.2.2.- DIRECTIVAS DE COMPILACIN.

No existen NINGUNA directiva de compilacin general, pero se utiliza de forma eficiente la directiva de eliminacin del cdigo de error de las instrucciones que convienen : {$I-} y {$I+} para desactivar y activar dicho cdigo.

2.2.3.- OTRAS UNIDADES EMPLEADAS.

Las unidades que utiliza en su ejecucin son las siguientes : CRT, DOS,

21

MANUAL DEL PROGRAMADOR: Unidades

GRAPH, ERR.

2.2.4.- VARIABLES GLOBALES.

SS : REAL; RR : REAL; SS1 : REAL; SS2 : REAL; RR1 : REAL; RR2 : REAL; ESCALA : REAL; CAN1 : INTEGER; CAN2 : INTEGER; CANAL : INTEGER; DISC : INTEGER; TYPE MATRIZ = ARRAY[ 0..5000] OF INTEGER; CONST BASE = $200; DATOADL = BASE+4; DATOADH = BASE+5; CANALMUX = BASE+10; REGCONTROL = BASE+11; REGDISPARO = BASE+12; MAX_NUM_DATOS = 5000; REALXMAX = 639; REALYMAX = 349; EJECUTARGRAFICOS : BOOLEAN = TRUE; PCLAB : BOOLEAN = TRUE; MAS : CHAR = #251;

VAR FICHA FICHA2 TIRA TIRO LAFECHA MASCARA FILENAME VMUESTRAS

: FILE OF MATRIZ; : FILE OF MATRIZ; : STRING[11]; : STRING[11]; : STRING; : STRING; : STRING[255]; : MATRIZ; 22

MANUAL DEL PROGRAMADOR: Unidades

BORRAR VMUESTRAS1 BORRAR1 VMUESTRAS2 BORRAR2 REFRESCO RECTA2 BCUR2 CUR2 DEF NUMDATOS CAN1 CAN2 CANAL D D1 D2 E INCREMENTO HASTA RECTA BCUR CUR OP OP1 OP2 OP3 OP4 OP5 OP6 OP7 ONDAS A B C X N NN NNNN NNN J WW YY XX XXX XXX1

: ARRAY[0..499] OF INTEGER; : MATRIZ; : ARRAY[0..499] OF INTEGER; : MATRIZ; : ARRAY[0..499] OF INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; : INTEGER; 23

MANUAL DEL PROGRAMADOR: Unidades

XXX2 YYY WWA WWB VVA VVB DRIVER MODO W Y Z M TT VV TT2 VV2 ERROROSC DISC INICIAL AMARILLA PO TIEMPO ESCALA ESCALA1 ESCALA2 MEDIDA SS RR SS1 RR1 RR2 SS2 DD I FRE FIN_CONVERSION DATO_BAJO DATO_ALTO LONGITUDDEDISCO

INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; : CHAR; : CHAR; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : REAL; : WORD; : WORD; : BYTE; : BYTE; : BYTE; : LONGINT;

: : : : : : : : : : : : : : : : : : :

2.2.5.- VARIABLES LOCALES.

24

MANUAL DEL PROGRAMADOR: Unidades

Son las que se corresponden en su utilizacin a las que aparecen definidas en los propios procedimientos y/o funciones. (Ver listado general de la unidad).

2.2.6.- LISTADO.

UNIT VISUAL6; INTERFACE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE VISUALIZACION_DE_ONDAS; REJILLA; SELE1; SELE2; CANALES; CANAL1; CANAL2; VOLTIOS; DIBUJAR; PROGRAMA (SS,RR:REAL;CANAL:INTEGER); AMBOS (SS1,SS2,RR1,RR2:REAL;CAN1,CAN2:INTEGER); HORIZONTALES(ESCALA:REAL); VERTICALES; CURSOR; PRINTSCREEN; DISCO(DISC:INTEGER); SALVAR; CARGAR; MIRARPCLAB; VISUALIZAR; TIME; IMPLEMENTATION

USES CRT,DOS,GRAPH,ERR; TYPE MATRIZ = ARRAY[0..5000] OF INTEGER; CONST BASE = $200; DATOADL = BASE+4; DATOADH = BASE+5; CANALMUX = BASE+10; REGCONTROL = BASE+11; REGDISPARO = BASE+12; MAX_NUM_DATOS = 5000; REALXMAX = 639; REALYMAX = 349; EJECUTARGRAFICOS : BOOLEAN = TRUE;

25

MANUAL DEL PROGRAMADOR: Unidades

PCLAB MAS

: BOOLEAN = TRUE; : CHAR = #251;

VAR FICHA : FILE OF MATRIZ; FICHA2 : FILE OF MATRIZ; TIRA : STRING[11]; TIRO : STRING[11]; LAFECHA : STRING; MASCARA : STRING; FILENAME : STRING[255]; VMUESTRAS : MATRIZ; BORRAR : ARRAY[0..499] OF INTEGER; VMUESTRAS1 : MATRIZ; BORRAR1 : ARRAY[0..499] OF INTEGER; VMUESTRAS2 : MATRIZ; BORRAR2 : ARRAY[0..499] OF INTEGER; REFRESCO : INTEGER; RECTA2 : INTEGER; BCUR2 : INTEGER; CUR2 : INTEGER; DEF : INTEGER; numdatos : INTEGER; CAN1 : INTEGER; CAN2 : INTEGER; CANAL : INTEGER; D : INTEGER; D1 : INTEGER; D2 : INTEGER; E : INTEGER; INCREMENTO : INTEGER; HASTA : INTEGER; RECTA : INTEGER; BCUR : INTEGER; CUR : INTEGER; OP : INTEGER; OP1 : INTEGER; OP2 : INTEGER; OP3 : INTEGER; OP4 : INTEGER; OP5 : INTEGER; OP6 : INTEGER; OP7 : INTEGER; ONDAS : INTEGER; A : INTEGER; B : INTEGER; C : INTEGER; X : INTEGER; N : INTEGER; NN : INTEGER; NNNN : INTEGER; NNN : INTEGER; J : INTEGER; WW : INTEGER;

26

MANUAL DEL PROGRAMADOR: Unidades

YY : INTEGER; XX : INTEGER; XXX : INTEGER; XXX1 : INTEGER; XXX2 : INTEGER; YYY : INTEGER; WWA : INTEGER; WWB : INTEGER; VVA : INTEGER; VVB : INTEGER; DRIVER : INTEGER; MODO : INTEGER; W : INTEGER; Y : INTEGER; Z : INTEGER; M : INTEGER; TT : INTEGER; VV : INTEGER; TT2 : INTEGER; VV2 : INTEGER; ERROROSC : INTEGER; DISC : INTEGER; INICIAL : INTEGER; AMARILLA : CHAR; PO : CHAR; TIEMPO : REAL; ESCALA : REAL; ESCALA1 : REAL; ESCALA2 : REAL; MEDIDA : REAL; SS : REAL; RR : REAL; SS1 : REAL; RR1 : REAL; RR2 : REAL; SS2 : REAL; DD : REAL; I : WORD; FRE : WORD; FIN_CONVERSION : BYTE; DATO_BAJO : BYTE; DATO_ALTO : BYTE; LONGITUDDEDISCO : LONGINT; (**********************************************************) {$I AYUDA.PAS} (**********************************************************) PROCEDURE REJILLA; BEGIN SETCOLOR(LIGHTRED);

27

MANUAL DEL PROGRAMADOR: Unidades

FOR M:=0 TO 8 DO BEGIN Y:=15; Z:=M*40; LINE(70,Y+Z,570,Y+Z) END; FOR M:=0 TO 10 DO BEGIN W:=70; Z:=50*M; LINE(W+Z,15,W+Z,335) END; FOR M:=0 TO 50 DO BEGIN SETCOLOR(YELLOW); W:=70; Z:=10*M; LINE(W+Z,93,W+Z,97); LINE(W+Z,173,W+Z,177); LINE(W+Z,253,W+Z,257) END; FOR M:=0 TO 32 DO BEGIN Z:=10*M; LINE(318,15+Z,322,15+Z) END; SETCOLOR(LIGHTRED); LINE(70,174,570,174); LINE(70,176,570,176); LINE(319,15,319,335); LINE(321,15,321,335); {dibujado de salir} SETFILLSTYLE(1,MAGENTA); SETCOLOR(WHITE); BAR(580,100,630,135); OUTTEXTXY(598,105,F6); OUTTEXTXY(585,120,SALIR); RECTANGLE(580,100,630,135); SETFILLSTYLE(1,WHITE); {dibujado de informacin} SETCOLOR(BLACK); STR(ESCALA1:1:2,TIRO); SETCOLOR(LIGHTGREEN); OUTTEXTXY(100,380,TIRO); OUTTEXTXY(150,380,VOLTS/DIV); STR(ESCALA2:1:2,TIRO); SETCOLOR(WHITE); OUTTEXTXY(100,420,TIRO); OUTTEXTXY(150,420,VOLTS/DIV); STR(TIEMPO:2:2,TIRO);

28

MANUAL DEL PROGRAMADOR: Unidades

SETCOLOR(RED); OUTTEXTXY(310,380,TIRO); OUTTEXTXY(350,380,ms/div) END; (**********************************************************) PROCEDURE SELE1; BEGIN SETFILLSTYLE(1,BLACK); BAR(200,448,640,460); OUTTEXTXY(0,450,CANAL 1); OUTTEXTXY(100,450, 0); OUTTEXTXY(130,450, 1); OUTTEXTXY(160,450, 2); OUTTEXTXY(190,450, 3); OUTTEXTXY(220,450, 4); OUTTEXTXY(250,450, 5); OUTTEXTXY(280,450, 6); OUTTEXTXY(310,450, 7); OUTTEXTXY(340,450, 8); OUTTEXTXY(370,450, 9); OUTTEXTXY(400,450,10); OUTTEXTXY(430,450,11); OUTTEXTXY(460,450,12); OUTTEXTXY(490,450,13); OUTTEXTXY(520,450,14); OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR(100,448,120,460); SETCOLOR(YELLOW); OUTTEXTXY(100,450, 0); XXX:=0; REPEAT OP4:=ORD(READKEY); IF OP4=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>15 THEN XXX:=0; SETFILLSTYLE(1,BLACK); BAR((30*YYY)+100,448,(30*YYY)+125,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(100,450, 0); IF YYY=1 THEN OUTTEXTXY(130,450, 1); IF YYY=2 THEN OUTTEXTXY(160,450, 2); IF YYY=3 THEN OUTTEXTXY(190,450, 3); IF YYY=4 THEN OUTTEXTXY(220,450, 4); IF YYY=5 THEN OUTTEXTXY(250,450, 5); IF YYY=6 THEN OUTTEXTXY(280,450, 6); IF YYY=7 THEN OUTTEXTXY(310,450, 7); IF YYY=8 THEN OUTTEXTXY(340,450, 8); IF YYY=9 THEN OUTTEXTXY(370,450, 9); IF YYY=10 THEN OUTTEXTXY(400,450,10); IF YYY=11 THEN OUTTEXTXY(430,450,11);

29

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=12 THEN OUTTEXTXY(460,450,12); IF YYY=13 THEN OUTTEXTXY(490,450,13); IF YYY=14 THEN OUTTEXTXY(520,450,14); IF YYY=15 THEN OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR((30*XXX)+100,448,(30*XXX)+125,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(100,450, 0); IF XXX=1 THEN OUTTEXTXY(130,450, 1); IF XXX=2 THEN OUTTEXTXY(160,450, 2); IF XXX=3 THEN OUTTEXTXY(190,450, 3); IF XXX=4 THEN OUTTEXTXY(220,450, 4); IF XXX=5 THEN OUTTEXTXY(250,450, 5); IF XXX=6 THEN OUTTEXTXY(280,450, 6); IF XXX=7 THEN OUTTEXTXY(310,450, 7); IF XXX=8 THEN OUTTEXTXY(340,450, 8); IF XXX=9 THEN OUTTEXTXY(370,450, 9); IF XXX=10 THEN OUTTEXTXY(400,450,10); IF XXX=11 THEN OUTTEXTXY(430,450,11); IF XXX=12 THEN OUTTEXTXY(460,450,12); IF XXX=13 THEN OUTTEXTXY(490,450,13); IF XXX=14 THEN OUTTEXTXY(520,450,14); IF XXX=15 THEN OUTTEXTXY(550,450,15); C:=XXX; CAN1:=C END; IF OP4=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<0 THEN XXX:=15; SETFILLSTYLE(1,BLACK); BAR((30*YYY)+100,448,(30*YYY)+125,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(100,450, 0); IF YYY=1 THEN OUTTEXTXY(130,450, 1); IF YYY=2 THEN OUTTEXTXY(160,450, 2); IF YYY=3 THEN OUTTEXTXY(190,450, 3); IF YYY=4 THEN OUTTEXTXY(220,450, 4); IF YYY=5 THEN OUTTEXTXY(250,450, 5); IF YYY=6 THEN OUTTEXTXY(280,450, 6); IF YYY=7 THEN OUTTEXTXY(310,450, 7); IF YYY=8 THEN OUTTEXTXY(340,450, 8); IF YYY=9 THEN OUTTEXTXY(370,450, 9); IF YYY=10 THEN OUTTEXTXY(400,450,10); IF YYY=11 THEN OUTTEXTXY(430,450,11); IF YYY=12 THEN OUTTEXTXY(460,450,12); IF YYY=13 THEN OUTTEXTXY(490,450,13); IF YYY=14 THEN OUTTEXTXY(520,450,14); IF YYY=15 THEN OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR((30*XXX)+100,448,(30*XXX)+125,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(100,450, 0); IF XXX=1 THEN OUTTEXTXY(130,450, 1); IF XXX=2 THEN OUTTEXTXY(160,450, 2); IF XXX=3 THEN OUTTEXTXY(190,450, 3);

30

MANUAL DEL PROGRAMADOR: Unidades

IF XXX=4 THEN OUTTEXTXY(220,450, 4); IF XXX=5 THEN OUTTEXTXY(250,450, 5); IF XXX=6 THEN OUTTEXTXY(280,450, 6); IF XXX=7 THEN OUTTEXTXY(310,450, 7); IF XXX=8 THEN OUTTEXTXY(340,450, 8); IF XXX=9 THEN OUTTEXTXY(370,450, 9); IF XXX=10 THEN OUTTEXTXY(400,450,10); IF XXX=11 THEN OUTTEXTXY(430,450,11); IF XXX=12 THEN OUTTEXTXY(460,450,12); IF XXX=13 THEN OUTTEXTXY(490,450,13); IF XXX=14 THEN OUTTEXTXY(520,450,14); IF XXX=15 THEN OUTTEXTXY(550,450,15); C:=XXX; CAN1:=C END UNTIL (OP4=13) OR (OP4=64); IF OP4=13 THEN BEGIN C:=XXX; CAN1:=C END END; (**********************************************************) PROCEDURE SELE2; BEGIN SETFILLSTYLE(1,BLACK); BAR(200,448,640,460); OUTTEXTXY(0,450,CANAL 2); OUTTEXTXY(100,450, 0); OUTTEXTXY(130,450, 1); OUTTEXTXY(160,450, 2); OUTTEXTXY(190,450, 3); OUTTEXTXY(220,450, 4); OUTTEXTXY(250,450, 5); OUTTEXTXY(280,450, 6); OUTTEXTXY(310,450, 7); OUTTEXTXY(340,450, 8); OUTTEXTXY(370,450, 9); OUTTEXTXY(400,450,10); OUTTEXTXY(430,450,11); OUTTEXTXY(460,450,12); OUTTEXTXY(490,450,13); OUTTEXTXY(520,450,14); OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR(100,448,120,460); SETCOLOR(YELLOW); OUTTEXTXY(100,450, 0); XXX:=0; REPEAT

31

MANUAL DEL PROGRAMADOR: Unidades

OP4:=ORD(READKEY); IF OP4=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>15 THEN XXX:=0; SETFILLSTYLE(1,BLACK); BAR((30*YYY)+100,448,(30*YYY)+125,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(100,450, 0); IF YYY=1 THEN OUTTEXTXY(130,450, 1); IF YYY=2 THEN OUTTEXTXY(160,450, 2); IF YYY=3 THEN OUTTEXTXY(190,450, 3); IF YYY=4 THEN OUTTEXTXY(220,450, 4); IF YYY=5 THEN OUTTEXTXY(250,450, 5); IF YYY=6 THEN OUTTEXTXY(280,450, 6); IF YYY=7 THEN OUTTEXTXY(310,450, 7); IF YYY=8 THEN OUTTEXTXY(340,450, 8); IF YYY=9 THEN OUTTEXTXY(370,450, 9); IF YYY=10 THEN OUTTEXTXY(400,450,10); IF YYY=11 THEN OUTTEXTXY(430,450,11); IF YYY=12 THEN OUTTEXTXY(460,450,12); IF YYY=13 THEN OUTTEXTXY(490,450,13); IF YYY=14 THEN OUTTEXTXY(520,450,14); IF YYY=15 THEN OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR((30*XXX)+100,448,(30*XXX)+125,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(100,450, 0); IF XXX=1 THEN OUTTEXTXY(130,450, 1); IF XXX=2 THEN OUTTEXTXY(160,450, 2); IF XXX=3 THEN OUTTEXTXY(190,450, 3); IF XXX=4 THEN OUTTEXTXY(220,450, 4); IF XXX=5 THEN OUTTEXTXY(250,450, 5); IF XXX=6 THEN OUTTEXTXY(280,450, 6); IF XXX=7 THEN OUTTEXTXY(310,450, 7); IF XXX=8 THEN OUTTEXTXY(340,450, 8); IF XXX=9 THEN OUTTEXTXY(370,450, 9); IF XXX=10 THEN OUTTEXTXY(400,450,10); IF XXX=11 THEN OUTTEXTXY(430,450,11); IF XXX=12 THEN OUTTEXTXY(460,450,12); IF XXX=13 THEN OUTTEXTXY(490,450,13); IF XXX=14 THEN OUTTEXTXY(520,450,14); IF XXX=15 THEN OUTTEXTXY(550,450,15); C:=XXX; CAN2:=C END; IF OP4=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<0 THEN XXX:=15; SETFILLSTYLE(1,BLACK); BAR((30*YYY)+100,448,(30*YYY)+125,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(100,450, 0); IF YYY=1 THEN OUTTEXTXY(130,450, 1); IF YYY=2 THEN OUTTEXTXY(160,450, 2); IF YYY=3 THEN OUTTEXTXY(190,450, 3);

32

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=4 THEN OUTTEXTXY(220,450, 4); IF YYY=5 THEN OUTTEXTXY(250,450, 5); IF YYY=6 THEN OUTTEXTXY(280,450, 6); IF YYY=7 THEN OUTTEXTXY(310,450, 7); IF YYY=8 THEN OUTTEXTXY(340,450, 8); IF YYY=9 THEN OUTTEXTXY(370,450, 9); IF YYY=10 THEN OUTTEXTXY(400,450,10); IF YYY=11 THEN OUTTEXTXY(430,450,11); IF YYY=12 THEN OUTTEXTXY(460,450,12); IF YYY=13 THEN OUTTEXTXY(490,450,13); IF YYY=14 THEN OUTTEXTXY(520,450,14); IF YYY=15 THEN OUTTEXTXY(550,450,15); SETFILLSTYLE(1,RED); BAR((30*XXX)+100,448,(30*XXX)+125,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(100,450, 0); IF XXX=1 THEN OUTTEXTXY(130,450, 1); IF XXX=2 THEN OUTTEXTXY(160,450, 2); IF XXX=3 THEN OUTTEXTXY(190,450, 3); IF XXX=4 THEN OUTTEXTXY(220,450, 4); IF XXX=5 THEN OUTTEXTXY(250,450, 5); IF XXX=6 THEN OUTTEXTXY(280,450, 6); IF XXX=7 THEN OUTTEXTXY(310,450, 7); IF XXX=8 THEN OUTTEXTXY(340,450, 8); IF XXX=9 THEN OUTTEXTXY(370,450, 9); IF XXX=10 THEN OUTTEXTXY(400,450,10); IF XXX=11 THEN OUTTEXTXY(430,450,11); IF XXX=12 THEN OUTTEXTXY(460,450,12); IF XXX=13 THEN OUTTEXTXY(490,450,13); IF XXX=14 THEN OUTTEXTXY(520,450,14); IF XXX=15 THEN OUTTEXTXY(550,450,15); C:=XXX; CAN2:=C END UNTIL (OP4=13) OR (OP4=64); IF OP4=13 THEN BEGIN C:=XXX; CAN2:=C END END; (**********************************************************) PROCEDURE CANALES; BEGIN REPEAT SETFILLSTYLE(1,BLACK); BAR(0,460,640,468); BAR(0,448,640,460); OUTTEXTXY(200,450,SELECCION:); OUTTEXTXY(300,450,CANAL ); OUTTEXTXY(400,450,CANAL );

33

MANUAL DEL PROGRAMADOR: Unidades

OUTTEXTXY(500,450, ALIR); SETFILLSTYLE(1,RED); BAR(300,448,375,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450,CANAL 1); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S); SETCOLOR(YELLOW); XXX:=3; OP:=3; REPEAT OP3:=ORD(READKEY); IF OP3=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>5 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,CANAL ); IF YYY=4 THEN OUTTEXTXY(400,450,CANAL ); IF YYY=5 THEN OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,CANAL ); IF XXX=4 THEN OUTTEXTXY(400,450,CANAL ); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S); SETCOLOR(YELLOW) END; IF OP3=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<3 THEN XXX:=5; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,CANAL 1); IF YYY=4 THEN OUTTEXTXY(400,450,CANAL 2); IF YYY=5 THEN OUTTEXTXY(500,450, SALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,CANAL ); IF XXX=4 THEN OUTTEXTXY(400,450,CANAL ); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S); SETCOLOR(YELLOW)

34

MANUAL DEL PROGRAMADOR: Unidades

END UNTIL (OP3=13) OR (OP3=64) OR (OP3=49) OR (OP3=50) OR (OP3=115) OR (OP3=83); IF (OP3=13) OR (OP3=49) OR (OP3=50) THEN BEGIN IF ((XXX=3) AND (OP3=13)) OR (OP3=49) THEN SELE1; IF ((XXX=4) AND (OP3=13)) OR (OP3=50) THEN SELE2 END UNTIL ((XXX=5) AND (OP3=13)) OR (OP3=64) OR (OP3=115) OR (OP3=83) END; (**********************************************************) PROCEDURE CANAL1; BEGIN SETFILLSTYLE(1,BLACK); BAR(200,448,640,460); SETCOLOR(YELLOW); OUTTEXTXY(200,450,CANAL 1); OUTTEXTXY(300,450,2.5 V/div); OUTTEXTXY(400,450,1 V/div); OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR(300,448,375,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450,2.5 V/div); XXX:=3; REPEAT OP2:=ORD(READKEY); IF OP2=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>5 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF YYY=4 THEN OUTTEXTXY(400,450,1 V/div); IF YYY=5 THEN OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF XXX=4 THEN OUTTEXTXY(400,450,1 V/div); IF XXX=5 THEN OUTTEXTXY(500,450,0.25 V/div) END; IF OP2=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<3 THEN XXX:=5; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,2.5 V/div);

35

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=4 THEN OUTTEXTXY(400,450,1 V/div); IF YYY=5 THEN OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF XXX=4 THEN OUTTEXTXY(400,450,1 V/div); IF XXX=5 THEN OUTTEXTXY(500,450,0.25 V/div) END UNTIL (OP2=13) OR (OP2=64); IF OP2=13 THEN BEGIN IF XXX=3 THEN BEGIN SS1:=12.8; RR1:=0; TT:=20; VV:=10; ESCALA1:=2.5 END; IF XXX=4 THEN BEGIN SS1:=5.12; RR1:=240; TT:=8; VV:=4; ESCALA1:=1 END; IF XXX=5 THEN BEGIN SS1:=1.28; RR1:=1440; TT:=2; VV:=1; ESCALA1:=0.25 END; XXX1:=XXX END END; (**********************************************************) PROCEDURE CANAL2; BEGIN SETFILLSTYLE(1,BLACK); BAR(200,448,640,460); SETCOLOR(YELLOW); OUTTEXTXY(200,450,CANAL 2); OUTTEXTXY(300,450,2.5 V/div); OUTTEXTXY(400,450,1 V/div); OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR(300,448,375,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450,2.5 V/div); XXX:=3; REPEAT OP2:=ORD(READKEY); IF OP2=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>5 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,2.5 V/div);

36

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=4 THEN OUTTEXTXY(400,450,1 V/div); IF YYY=5 THEN OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF XXX=4 THEN OUTTEXTXY(400,450,1 V/div); IF XXX=5 THEN OUTTEXTXY(500,450,0.25 V/div) END; IF OP2=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<3 THEN XXX:=5; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF YYY=4 THEN OUTTEXTXY(400,450,1 V/div); IF YYY=5 THEN OUTTEXTXY(500,450,0.25 V/div); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,2.5 V/div); IF XXX=4 THEN OUTTEXTXY(400,450,1 V/div); IF XXX=5 THEN OUTTEXTXY(500,450,0.25 V/div) END UNTIL (OP2=13) OR (OP2=64); IF OP2=13 THEN BEGIN IF XXX=3 THEN BEGIN SS2:=12.8; RR2:=0; TT:=20; VV:=10; ESCALA2:=2.5 END; IF XXX=4 THEN BEGIN SS2:=5.12; RR2:=240; TT:=8; VV:=4; ESCALA2:=1 END; IF XXX=5 THEN BEGIN SS2:=1.28; RR2:=1440; TT:=2; VV:=1; ESCALA2:=0.25 END; XXX2:=XXX END END; (**********************************************************) PROCEDURE VOLTIOS; BEGIN WWA:=25; VVA:=390; WWB:=75; VVB:=390;

37

MANUAL DEL PROGRAMADOR: Unidades

REPEAT SETFILLSTYLE(1,BLACK); BAR(200,448,640,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450,CANAL ); OUTTEXTXY(400,450,CANAL ); OUTTEXTXY(500,450, ALIR); SETFILLSTYLE(1,RED); BAR(300,448,355,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450,CANAL ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S); XXX:=3; OP:=0; REPEAT OP1:=ORD(READKEY); IF OP1=77 THEN BEGIN YYY:=XXX; XXX:=XXX+1; IF XXX>5 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+55,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,CANAL ); IF YYY=4 THEN OUTTEXTXY(400,450,CANAL ); IF YYY=5 THEN OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+55,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,CANAL ); IF XXX=4 THEN OUTTEXTXY(400,450,CANAL ); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S) END; IF OP1=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<3 THEN XXX:=5; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+55,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450,CANAL ); IF YYY=4 THEN OUTTEXTXY(400,450,CANAL ); IF YYY=5 THEN OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+55,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450,CANAL );

38

MANUAL DEL PROGRAMADOR: Unidades

IF XXX=4 THEN OUTTEXTXY(400,450,CANAL ); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, 1); OUTTEXTXY(400,450, 2); OUTTEXTXY(500,450, S) END UNTIL (OP1=13) OR (OP1=64) OR (OP1=49) OR (OP1=50) OR (OP1=115) OR (OP1=83); IF (OP1=13) OR (OP1=49) OR (OP1=50) THEN BEGIN IF ((XXX=3) AND (OP1=13)) OR (OP1=49) THEN CANAL1; IF ((XXX=4) AND (OP1=13)) OR (OP1=50) THEN CANAL2 END UNTIL ((XXX=5) AND (OP1=13)) OR (OP1=64) OR (OP1=115) OR (OP1=83); SETFILLSTYLE(1,BLACK); BAR(100,375,150,385); BAR(100,415,150,425); STR(ESCALA1:1:2,TIRO); SETCOLOR(LIGHTGREEN); OUTTEXTXY(100,380,TIRO); OUTTEXTXY(150,380,VOLTS/DIV); STR(ESCALA2:1:2,TIRO); SETCOLOR(WHITE); OUTTEXTXY(100,420,TIRO); OUTTEXTXY(150,420,VOLTS/DIV) END; (**********************************************************) PROCEDURE DIBUJAR; BEGIN N:=0; DEF:=0; REPEAT X:=70; C:=X+N; D:=VMUESTRAS[DEF]; PUTPIXEL(C,D,LIGHTGREEN); PUTPIXEL(C+INCREMENTO,BORRAR[DEF],BLACK); DEF:=DEF+1; N:=N+INCREMENTO UNTIL N=HASTA END; (**********************************************************) PROCEDURE PROGRAMA (SS,RR:REAL;CANAL:INTEGER); VAR F:BYTE; BEGIN PORT[REGCONTROL]:=0; PORT[CANALMUX]:=CANAL;

39

MANUAL DEL PROGRAMADOR: Unidades

PORT[REGCONTROL]:=1; FOR I:=0 TO 500 DO BEGIN PORT[REGDISPARO]:=0; REPEAT FIN_CONVERSION:=PORT[DATOADH]; UNTIL FIN_CONVERSION<=$F; DATO_BAJO:=PORT[DATOADL]; DATO_ALTO:=PORT[DATOADH] MOD 16; A:=DATO_ALTO*256+DATO_BAJO; B:=335-ROUND((A / SS)-RR); BORRAR[I]:=VMUESTRAS[I+1]; VMUESTRAS[I]:=B END; DIBUJAR {UNTIL KEYPRESSED; PORT[REGCONTROL]:=0;} END; (**********************************************************) PROCEDURE AMBOS (SS1,SS2,RR1,RR2:REAL;CAN1,CAN2:INTEGER); VAR F:BYTE; BEGIN REPEAT REJILLA; FOR NN:=0 TO 10 DO BEGIN FOR NNNN:=1 TO 2 DO BEGIN IF NNNN=1 THEN BEGIN SS:=SS1; RR:=RR1; CANAL:=CAN1; PORT[REGCONTROL]:=0; PORT[CANALMUX]:=CANAL; PORT[REGCONTROL]:=1; FOR I:=0 TO 500 DO BEGIN PORT[REGDISPARO]:=0; REPEAT FIN_CONVERSION:=PORT[DATOADH]; UNTIL FIN_CONVERSION<=$F; DATO_BAJO:=PORT[DATOADL]; DATO_ALTO:=PORT[DATOADH] MOD 16; A:=DATO_ALTO*256+DATO_BAJO; B:=335-ROUND((A / SS)-RR); BORRAR1[I]:=VMUESTRAS1[I+1]; VMUESTRAS1[I]:=B END END; IF NNNN=2 THEN BEGIN

40

MANUAL DEL PROGRAMADOR: Unidades

SS:=SS2; RR:=RR2; CANAL:=CAN2; PORT[REGCONTROL]:=0; PORT[CANALMUX]:=CANAL; PORT[REGCONTROL]:=1; FOR I:=0 TO 500 DO BEGIN PORT[REGDISPARO]:=0; REPEAT FIN_CONVERSION:=PORT[DATOADH]; UNTIL FIN_CONVERSION<=$F; DATO_BAJO:=PORT[DATOADL]; DATO_ALTO:=PORT[DATOADH] MOD 16; A:=DATO_ALTO*256+DATO_BAJO; B:=335-ROUND((A / SS)-RR); BORRAR2[I]:=VMUESTRAS2[I+1]; VMUESTRAS2[I]:=B END END; DEF:=0; N:=0; REPEAT X:=70; C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); PUTPIXEL(C+INCREMENTO,BORRAR1[DEF],BLACK); PUTPIXEL(C+INCREMENTO,BORRAR2[DEF],BLACK); DEF:=DEF+1; N:=N+INCREMENTO UNTIL N=HASTA END END UNTIL KEYPRESSED; PORT[REGCONTROL]:=0 END; (**********************************************************) PROCEDURE HORIZONTALES(ESCALA:REAL); BEGIN SETCOLOR(BLACK); LINE(70,CUR,570,CUR); LINE(70,CUR2,570,CUR2); CUR:=175; CUR2:=175; SETCOLOR(MAGENTA); LINE(70,CUR,570,CUR); REPEAT RECTA:=ORD(READKEY);

41

MANUAL DEL PROGRAMADOR: Unidades

IF RECTA=72 THEN BEGIN BCUR:=CUR;CUR:=CUR-1; IF CUR<15 THEN CUR :=335; SETCOLOR(BLACK); LINE(70,BCUR,570,BCUR); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR,570,CUR) END; IF RECTA=80 THEN BEGIN BCUR:=CUR;CUR:=CUR+1; IF CUR>335 THEN CUR :=15; SETCOLOR(BLACK); LINE(70,BCUR,570,BCUR); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR,570,CUR) END; IF RECTA=75 THEN BEGIN BCUR:=CUR;CUR:=CUR+20; IF CUR>335 THEN CUR :=15; SETCOLOR(BLACK); LINE(70,BCUR,570,BCUR); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF];

42

MANUAL DEL PROGRAMADOR: Unidades

PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR,570,CUR) END; IF RECTA=77 THEN BEGIN BCUR:=CUR;CUR:=CUR-20; IF CUR<15 THEN CUR :=335; SETCOLOR(BLACK); LINE(70,BCUR,570,BCUR); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR,570,CUR) END UNTIL RECTA=13; SETCOLOR(MAGENTA); LINE(70,CUR2,570,CUR2); REPEAT RECTA2:=ORD(READKEY); IF RECTA2=72 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2-1; IF CUR2<15 THEN CUR2 :=335; SETCOLOR(BLACK); LINE(70,BCUR2,570,BCUR2); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA);

43

MANUAL DEL PROGRAMADOR: Unidades

LINE(70,CUR2,570,CUR2); LINE(70,CUR,570,CUR) END; IF RECTA2=80 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2+1; IF CUR2>335 THEN CUR2 :=15; SETCOLOR(BLACK); LINE(70,BCUR2,570,BCUR2); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR2,570,CUR2); LINE(70,CUR,570,CUR) END; IF RECTA2=75 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2+20; IF CUR2>335 THEN CUR2 :=15; SETCOLOR(BLACK); LINE(70,BCUR2,570,BCUR2); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR2,570,CUR2); LINE(70,CUR,570,CUR) END; IF RECTA2=77 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2-20; IF CUR2<15 THEN CUR2 :=335; SETCOLOR(BLACK); LINE(70,BCUR2,570,BCUR2); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR;

44

MANUAL DEL PROGRAMADOR: Unidades

IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(MAGENTA); LINE(70,CUR2,570,CUR2); LINE(70,CUR,570,CUR) END UNTIL RECTA2=13; IF DISC=0 THEN BEGIN ESCALA:=0 END; IF DISC=1 THEN BEGIN ESCALA:=ESCALA1 END; IF DISC=2 THEN BEGIN REPEAT SETCOLOR(WHITE); OUTTEXTXY(100,350,QUE ONDA QUIERES MEDIR: VERDE o BLANCA? (V/B)); DESCARGARTECLADO; AMARILLA:=READKEY; SETFILLSTYLE(1,BLACK); BAR(100,345,640,357) UNTIL (AMARILLA=V) OR (AMARILLA=B) OR (AMARILLA=v) OR (AMARILLA=b); IF (AMARILLA=V) OR (AMARILLA=v) THEN ESCALA:=ESCALA1; IF (AMARILLA=B) OR (AMARILLA=b) THEN ESCALA:=ESCALA2 END; IF DISC=3 THEN BEGIN ESCALA:=ESCALA2 END; IF CUR>CUR2 THEN BEGIN MEDIDA:=(ESCALA/40)*(CUR2-CUR); SETFILLSTYLE(1,BLACK); BAR(0,395,449,407); STR(MEDIDA:5:4,TIRA); SETCOLOR(MAGENTA); OUTTEXTXY(235,400,TIRA); OUTTEXTXY(300,400,VOLTS) END; IF CUR<CUR2 THEN BEGIN MEDIDA:=(ESCALA/40)*(CUR2-CUR); SETFILLSTYLE(1,BLACK); BAR(0,395,449,407); STR(MEDIDA:5:4,TIRA); SETCOLOR(MAGENTA);

45

MANUAL DEL PROGRAMADOR: Unidades

OUTTEXTXY(235,400,TIRA); OUTTEXTXY(300,400,VOLTS) END END; (**********************************************************) PROCEDURE VERTICALES; BEGIN SETCOLOR(BLACK); LINE(CUR,15,CUR,335); LINE(CUR2,15,CUR2,335); CUR:=320; CUR2:=320; SETCOLOR(BROWN); LINE(CUR,15,CUR,335); REPEAT RECTA:=ORD(READKEY); IF RECTA=75 THEN BEGIN BCUR:=CUR;CUR:=CUR-1; IF CUR<70 THEN CUR :=570; SETCOLOR(BLACK); LINE(BCUR,15,BCUR,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR,15,CUR,335) END; IF RECTA=77 THEN BEGIN BCUR:=CUR;CUR:=CUR+1; IF CUR>570 THEN CUR :=70; SETCOLOR(BLACK); LINE(BCUR,15,BCUR,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO

46

MANUAL DEL PROGRAMADOR: Unidades

UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR,15,CUR,335) END; IF RECTA=72 THEN BEGIN BCUR:=CUR;CUR:=CUR+25; IF CUR>570 THEN CUR :=70; SETCOLOR(BLACK); LINE(BCUR,15,BCUR,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR,15,CUR,335) END; IF RECTA=80 THEN BEGIN BCUR:=CUR;CUR:=CUR-25; IF CUR<70 THEN CUR :=570; SETCOLOR(BLACK); LINE(BCUR,15,BCUR,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR,15,CUR,335) END UNTIL RECTA=13; SETCOLOR(BROWN); LINE(CUR2,15,CUR2,335); REPEAT RECTA2:=ORD(READKEY); IF RECTA2=75 THEN BEGIN

47

MANUAL DEL PROGRAMADOR: Unidades

BCUR2:=CUR2;CUR2:=CUR2-1; IF CUR2<70 THEN CUR2 :=570; SETCOLOR(BLACK); LINE(BCUR2,15,BCUR2,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR2,15,CUR2,335); LINE(CUR,15,CUR,335) END; IF RECTA2=77 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2+1; IF CUR2>570 THEN CUR2 :=70; SETCOLOR(BLACK); LINE(BCUR2,15,BCUR2,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR2,15,CUR2,335); LINE(CUR,15,CUR,335) END; IF RECTA2=72 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2+25; IF CUR2>570 THEN CUR2 :=70; SETCOLOR(BLACK); LINE(BCUR2,15,BCUR2,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF];

48

MANUAL DEL PROGRAMADOR: Unidades

D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR2,15,CUR2,335); LINE(CUR,15,CUR,335) END; IF RECTA2=80 THEN BEGIN BCUR2:=CUR2;CUR2:=CUR2-25; IF CUR2<70 THEN CUR2 :=570; SETCOLOR(BLACK); LINE(BCUR2,15,BCUR2,335); REJILLA; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; SETCOLOR(BROWN); LINE(CUR2,15,CUR2,335); LINE(CUR,15,CUR,335) END UNTIL RECTA2=13; IF CUR>CUR2 THEN BEGIN MEDIDA:=1/((TIEMPO/50)*(CUR2-CUR)); SETFILLSTYLE(1,BLACK); BAR(450,395,640,407); STR(MEDIDA:5:4,TIRA); SETCOLOR(BROWN); OUTTEXTXY(450,400,TIRA); OUTTEXTXY(515,400,KHz) END; IF CUR<CUR2 THEN BEGIN MEDIDA:=1/((TIEMPO/50)*(CUR2-CUR)); SETFILLSTYLE(1,BLACK); BAR(450,395,640,407); STR(MEDIDA:5:4,TIRA); SETCOLOR(BROWN); OUTTEXTXY(450,400,TIRA); OUTTEXTXY(515,400,KHz) END END;

49

MANUAL DEL PROGRAMADOR: Unidades

(**********************************************************) PROCEDURE CURSOR; BEGIN REPEAT SETFILLSTYLE(1,BLACK); BAR(0,440,640,460); SETFILLSTYLE(1,BLACK); BAR(310,370,640,390); SETCOLOR(YELLOW); OUTTEXTXY(300,450, ENSION ); OUTTEXTXY(400,450, RECUENCIA); OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR(300,448,380,460); SETCOLOR(YELLOW); OUTTEXTXY(300,450, ENSION ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, T); OUTTEXTXY(400,450,F); OUTTEXTXY(500,450, S); XXX:=3; OP:=0; REPEAT OP1:=ORD(READKEY); IF OP1=77 THEN BEGIN YYY:=XXX; XXX:=XXX+1; IF XXX>5 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450, ENSION ); IF YYY=4 THEN OUTTEXTXY(400,450, RECUENCIA); IF YYY=5 THEN OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450, ENSION ); IF XXX=4 THEN OUTTEXTXY(400,450, RECUENCIA); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, T); OUTTEXTXY(400,450,F); OUTTEXTXY(500,450, S) END; IF OP1=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<3 THEN XXX:=5; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-4,448,(100*YYY)+80,460); SETCOLOR(YELLOW); IF YYY=3 THEN OUTTEXTXY(300,450, ENSION ); IF YYY=4 THEN OUTTEXTXY(400,450, RECUENCIA);

50

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=5 THEN OUTTEXTXY(500,450, ALIR ); SETFILLSTYLE(1,RED); BAR((100*XXX)-4,448,(100*XXX)+80,460); SETCOLOR(YELLOW); IF XXX=3 THEN OUTTEXTXY(300,450, ENSION ); IF XXX=4 THEN OUTTEXTXY(400,450, RECUENCIA); IF XXX=5 THEN OUTTEXTXY(500,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(300,450, T); OUTTEXTXY(400,450,F); OUTTEXTXY(500,450, S) END UNTIL (OP1=13) OR (OP1=64) OR (OP1=116) OR (OP1=84) OR (OP1=102) OR (OP1=70) OR (OP1=115) OR (OP1=83); IF (OP1=13) OR (OP1=116) OR (OP1=84) OR (OP1=102) OR (OP1=70) THEN BEGIN IF ((XXX=3) AND (OP1=13)) OR (OP1=116) OR (OP1=84) THEN BEGIN HORIZONTALES(ESCALA) END; IF ((XXX=4) AND (OP1=13)) OR (OP1=102) OR (OP1=70) THEN BEGIN VERTICALES END END UNTIL ((XXX=5) AND (OP1=13)) OR (OP1=64) OR (OP1=115) OR (OP1=83) END; (**********************************************************) PROCEDURE PRINTSCREEN; VAR REG:REGISTERS; BEGIN SETFILLSTYLE(1,BLACK); BAR(580,100,630,135); {borrado de salir} BAR(70,340,570,470); {borrado del resto} SETCOLOR(WHITE); OUTTEXTXY(80,345,GRAFICA : EVALUACION VERSION 1.00); OUTTEXTXY(80,360,Emilio Sahuquillo & Julio Martinez); OBTENERFECHA(LAFECHA); OUTTEXTXY(80,375,LAFECHA); OUTTEXTXY(80,390,TEMPERATURA AMBIENTE : 27 C); STR(ESCALA1:1:2,TIRO); OUTTEXTXY(80,405,CANAL1 : VOLT/DIV); OUTTEXTXY(160,405,TIRO); STR(ESCALA2:1:2,TIRO); OUTTEXTXY(80,420,CANAL2 : VOLT/DIV); OUTTEXTXY(160,420,TIRO); STR(TIEMPO:2:2,TIRO); OUTTEXTXY(280,415,TIEMPO : mSEG/DIV); OUTTEXTXY(350,415,TIRO); OUTTEXTXY(500,345,TIEMPOS); SETTEXTSTYLE(0,1,0);

51

MANUAL DEL PROGRAMADOR: Unidades

OUTTEXTXY(60,30,TENSIONES); SETTEXTSTYLE(0,0,1); {ejecutamos la primera vez graphics del MS-Dos} IF EJECUTARGRAFICOS=TRUE THEN BEGIN SWAPVECTORS; EXEC(GRAPHICS.COM,); SWAPVECTORS; EJECUTARGRAFICOS:=FALSE END; {llamamos a la interrupcin del bios para imprimir} REG.AH:=9; INTR($5,REG); {borramos y dibujamos salir} BAR(70,340,570,470); BAR(50,25,65,120); BAR(490,340,550,350); SETFILLSTYLE(1,MAGENTA); SETCOLOR(WHITE); BAR(580,100,630,135); OUTTEXTXY(598,105,F6); OUTTEXTXY(585,120,SALIR); RECTANGLE(580,100,630,135) END; (**********************************************************) PROCEDURE DISCO(DISC:INTEGER); LABEL SALIMOS,SALIMOS2,SALIMOS3; BEGIN IF (DISC=1) OR (DISC=3) THEN BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT CURSORON; MAS:=#251; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); GOTOXY(3,2); TEXTCOLOR(YELLOW); WRITELN(NOMBRE DEL FICHERO : ); RAYA_HORIZONTAL(2,79,3,WHITE); TEXTBACKGROUND(LIGHTBLUE); TEXTCOLOR(YELLOW); WINDOW(3,4,78,5); REPEAT

52

MANUAL DEL PROGRAMADOR: Unidades

READLN(FILENAME); UNTIL FILENAME<>; WINDOW(3,4,78,24); ASSIGN(FICHA,FILENAME); {$I-} REWRITE(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} WRITE(FICHA,VMUESTRAS) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS; WINDOW(5,10,76,24);

53

MANUAL DEL PROGRAMADOR: Unidades

CLRSCR END UNTIL ERROROSC=0; SALIMOS : MODO:=2; SETGRAPHMODE(MODO) END;

IF DISC=2 THEN BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT CURSORON; WINDOW(1,1,80,25); MAS:=#251; CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); GOTOXY(3,2); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITELN(NOMBRE DEL FICHERO PARA ONDA 1); RAYA_HORIZONTAL(2,79,3,WHITE); TEXTCOLOR(YELLOW); WINDOW(3,4,78,5); REPEAT READLN(FILENAME); UNTIL FILENAME<>; WINDOW(3,4,78,24); ASSIGN(FICHA,FILENAME); {$I-} REWRITE(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS2; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} WRITE(FICHA,VMUESTRAS1) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF;

54

MANUAL DEL PROGRAMADOR: Unidades

WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS2; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS2; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; SALIMOS2 : RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); TEXTBACKGROUND(LIGHTBLUE); TEXTCOLOR(YELLOW); GOTOXY(3,2); WRITELN(NOMBRE DEL FICHERO PARA ONDA 2 : ); RAYA_HORIZONTAL(2,79,3,WHITE); TEXTCOLOR(YELLOW); WINDOW(3,4,78,5); REPEAT READLN(FILENAME); UNTIL FILENAME<>; WINDOW(3,4,78,24); ASSIGN(FICHA2,FILENAME); {$I-} REWRITE(FICHA2) {$I+}; ERROROSC:=IORESULT;

55

MANUAL DEL PROGRAMADOR: Unidades

IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS3; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} WRITE(FICHA2,VMUESTRAS2) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS3; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA2) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(18,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS3; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; SALIMOS3 : MODO:=2; SETGRAPHMODE(MODO); MAS:=#251

56

MANUAL DEL PROGRAMADOR: Unidades

END; IF (DISC=1) OR (DISC=3) THEN DIBUJAR; IF DISC=2 THEN BEGIN DEF:=0;N:=0; REPEAT X:=70;C:=X+N; D1:=VMUESTRAS1[DEF]; D2:=VMUESTRAS2[DEF]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE); DEF:=DEF+1;N:=N+INCREMENTO UNTIL N=HASTA END; END; (**********************************************************) PROCEDURE SALVAR; BEGIN SETFILLSTYLE(1,RED); BAR(150,448,220,460); REPEAT SETCOLOR(YELLOW); OUTTEXTXY(150,450, MPRESORA); OUTTEXTXY(300,450, ISCO ); OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,I); OUTTEXTXY(300,450, D); OUTTEXTXY(450,450, S); XXX:=1; OP:=0; REPEAT OP6:=ORD(READKEY); IF OP6=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>3 THEN XXX:=1; SETFILLSTYLE(1,BLACK); BAR((150*YYY)-5,448,(150*YYY)+75,460); SETCOLOR(YELLOW); IF YYY=1 THEN OUTTEXTXY(150,450, MPRESORA); IF YYY=2 THEN OUTTEXTXY(300,450, ISCO ); IF YYY=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,I); OUTTEXTXY(300,450, D); OUTTEXTXY(450,450, S); SETFILLSTYLE(1,RED); BAR((150*XXX)-5,448,(150*XXX)+75,460); SETCOLOR(YELLOW); IF XXX=1 THEN OUTTEXTXY(150,450, MPRESORA);

57

MANUAL DEL PROGRAMADOR: Unidades

IF XXX=2 THEN OUTTEXTXY(300,450, ISCO ); IF XXX=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,I); OUTTEXTXY(300,450, D); OUTTEXTXY(450,450, S) END; IF OP6=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<1 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((150*YYY)-5,448,(150*YYY)+75,460); SETCOLOR(YELLOW); IF YYY=1 THEN OUTTEXTXY(150,450, MPRESORA); IF YYY=2 THEN OUTTEXTXY(300,450, ISCO ); IF YYY=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,I); OUTTEXTXY(300,450, D); OUTTEXTXY(450,450, S); SETFILLSTYLE(1,RED); BAR((150*XXX)-5,448,(150*XXX)+75,460); SETCOLOR(YELLOW); IF XXX=1 THEN OUTTEXTXY(150,450, MPRESORA); IF XXX=2 THEN OUTTEXTXY(300,450, ISCO ); IF XXX=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,I); OUTTEXTXY(300,450, D); OUTTEXTXY(450,450, S) END UNTIL (OP6=13) OR (OP6=64) OR (OP6=105) OR (OP6=73) OR (OP6=100) OR (OP6=68) OR (OP6=115) OR (OP6=83); IF (OP6=13) OR (OP6=105) OR (OP6=73) OR (OP6=100) OR (OP6=68) OR (OP6=115) OR (OP6=83) THEN BEGIN IF ((XXX=1) AND (OP6=13)) OR (OP6=105) OR (OP6=73) THEN BEGIN PRINTSCREEN; SETFILLSTYLE(1,RED); BAR(150,448,220,460); SETCOLOR(BLACK); STR(ESCALA1:1:2,TIRO); SETCOLOR(LIGHTGREEN); OUTTEXTXY(100,380,TIRO); OUTTEXTXY(150,380,VOLTS/DIV); STR(ESCALA2:1:2,TIRO); SETCOLOR(WHITE); OUTTEXTXY(100,420,TIRO); OUTTEXTXY(150,420,VOLTS/DIV); STR(TIEMPO:2:2,TIRO); SETCOLOR(RED); OUTTEXTXY(310,380,TIRO); OUTTEXTXY(350,380,ms/div)

58

MANUAL DEL PROGRAMADOR: Unidades

END; IF ((XXX=2) AND (OP6=13)) OR (OP6=100) OR (OP6=68) THEN BEGIN DISCO(DISC); SETFILLSTYLE(1,BLACK); BAR(145,440,430,465); REJILLA; SETFILLSTYLE(1,RED); BAR(150,448,220,460) END END UNTIL (XXX=3) OR (OP6=64) OR (OP6=115) OR (OP6=83) END; (**********************************************************) PROCEDURE CARGAR; LABEL SALIMOS4,SALIMOS5; BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT REPEAT WINDOW(1,1,80,25); CLRSCR; CURSORON; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(3,2); WRITELN( CUANTAS ONDAS CONTIENE SU ARCHIVO (1 2) ?); RAYA_HORIZONTAL(2,79,3,WHITE); DESCARGARTECLADO; WINDOW(3,4,78,5); TEXTCOLOR(YELLOW); {$I-} READLN(ONDAS) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); GOTOXY(33,24); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITE(>>> pulsa CUALQUIER TECLA para repetir); DESCARGARTECLADO; MAS:=READKEY END UNTIL ERROROSC=0; IF (ONDAS<>1) AND (ONDAS<>2) THEN BEGIN

59

MANUAL DEL PROGRAMADOR: Unidades

SOUND(1000); DELAY(100); NOSOUND END UNTIL ONDAS IN [1,2]; WINDOW(1,1,80,25); IF ONDAS=1 THEN BEGIN MAS:=#251; DISC:=1; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); GOTOXY(3,2); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITELN(NOMBRE DEL FICHERO : ); RAYA_HORIZONTAL(2,79,3,WHITE); WINDOW(3,4,78,5); TEXTCOLOR(YELLOW); REPEAT READLN(FILENAME); UNTIL FILENAME<>; WINDOW(3,4,78,24); ASSIGN(FICHA,FILENAME); {$I-} RESET(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS4; END; UNTIL ERROROSC=0; {comprobamos la longitud del fichero por sus componentes} LONGITUDDEDISCO:=FILESIZE(FICHA); IF LONGITUDDEDISCO<>1 THEN BEGIN MAS:=#27; WINDOW(1,1,80,25); CURSOROFF; ERROR(32762); DELAY(8000); DISC:=0; GOTO SALIMOS4

60

MANUAL DEL PROGRAMADOR: Unidades

END; REPEAT {$I-} READ(FICHA,VMUESTRAS) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS4; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS4; WINDOW(5,10,76,24); CLRSCR END UNTIL ERROROSC=0; MODO:=2; SETGRAPHMODE(MODO); REJILLA; DIBUJAR; SALIMOS4 : IF MAS=#27 THEN BEGIN MAS:=#251; DISC:=0; MODO:=2; SETGRAPHMODE(MODO); REJILLA END END; IF ONDAS=2 THEN BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE);

61

MANUAL DEL PROGRAMADOR: Unidades

CLRSCR; MAS:=#251; DISC:=2; REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); GOTOXY(3,2); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); WRITELN(NOMBRE DEL FICHERO DE ONDA 1 :); RAYA_HORIZONTAL(2,79,3,WHITE); WINDOW(3,4,78,5); TEXTCOLOR(YELLOW); REPEAT READLN(FILENAME); UNTIL FILENAME<>; ASSIGN(FICHA,FILENAME); {$I-} RESET(FICHA) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; {comprobamos la longitud del fichero por sus componentes} LONGITUDDEDISCO:=FILESIZE(FICHA); IF LONGITUDDEDISCO<>1 THEN BEGIN MAS:=#27; WINDOW(1,1,80,25); ERROR(32762); DELAY(8000); GOTO SALIMOS5 END; REPEAT {$I-} READ(FICHA,VMUESTRAS1) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24);

62

MANUAL DEL PROGRAMADOR: Unidades

WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA) {$I+}; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; WINDOW(1,1,80,25); TEXTBACKGROUND(LIGHTBLUE); CLRSCR; REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,LIGHTBLUE); TEXTBACKGROUND(LIGHTBLUE); RAYA_HORIZONTAL(2,79,3,WHITE); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(3,2); WRITELN(NOMBRE DEL FICHERO DE ONDA 2 : ); WINDOW(3,4,78,5); REPEAT READLN(FILENAME); UNTIL FILENAME<>; ASSIGN(FICHA2,FILENAME); {$I-} RESET(FICHA2) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO;

63

MANUAL DEL PROGRAMADOR: Unidades

MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; {comprobamos la longitud del fichero por sus componentes} LONGITUDDEDISCO:=FILESIZE(FICHA2); IF LONGITUDDEDISCO<>1 THEN BEGIN CURSOROFF; MAS:=#27; WINDOW(1,1,80,25); ERROR(32762); DELAY(8000); GOTO SALIMOS5 END; REPEAT {$I-} READ(FICHA2,VMUESTRAS2) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; REPEAT {$I-} CLOSE(FICHA2) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERROROSC); TEXTCOLOR(YELLOW); TEXTBACKGROUND(LIGHTBLUE); GOTOXY(18,24); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; MAS:=READKEY; IF MAS=#27 THEN GOTO SALIMOS5; WINDOW(5,10,78,24); CLRSCR END UNTIL ERROROSC=0; MODO:=2; SETGRAPHMODE(MODO); REJILLA;

64

MANUAL DEL PROGRAMADOR: Unidades

FOR N:=0 TO 500 DO BEGIN X:=70;C:=X+N; D1:=VMUESTRAS1[N]; D2:=VMUESTRAS2[N]; PUTPIXEL(C,D1,LIGHTGREEN); PUTPIXEL(C,D2,WHITE) END; SALIMOS5 : IF MAS=#27 THEN BEGIN MAS:=#251; DISC:=0; MODO:=2; SETGRAPHMODE(MODO); REJILLA END END END; (**********************************************************) PROCEDURE MIRARPCLAB; LABEL TERMINA; VAR PUNTO : POINTER; CTDOR : INTEGER; BEGIN CTDOR:=0; PORT[REGCONTROL]:=1; PORT[REGDISPARO]:=0; REPEAT FIN_CONVERSION:=PORT[DATOADH]; CTDOR:=CTDOR+1; IF CTDOR>=10000 THEN FIN_CONVERSION:=$F; UNTIL FIN_CONVERSION<=$F; IF CTDOR=10000 THEN BEGIN {$I-} GETMEM(PUNTO,IMAGESIZE(150,200,490,280)) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN GOTO TERMINA; {$I-} GETIMAGE(150,200,490,280,PUNTO^) {$I+}; ERROROSC:=IORESULT; IF ERROROSC<>0 THEN GOTO TERMINA; SETFILLSTYLE(1,RED); BAR(150,200,490,280); SETCOLOR(YELLOW); SETLINESTYLE(0,1,3); RECTANGLE(160,210,480,270); SETLINESTYLE(0,0,1); OUTTEXTXY(200,225, NO LLEGAN DATOS AL PUERTO); OUTTEXTXY(200,245,POSIBLEMENTE PCLAB NO CONECTADA); WRITELN(^g); DELAY(8000);

65

MANUAL DEL PROGRAMADOR: Unidades

PUTIMAGE(150,200,PUNTO^,COPYPUT); TERMINA : PCLAB:=FALSE END ELSE PCLAB:=TRUE END; (**********************************************************) PROCEDURE VISUALIZAR; LABEL SINPCLAB,SINPCLAB1,SINPCLAB2; BEGIN REPEAT SETFILLSTYLE(1,BLACK); BAR(0,448,640,473); SETCOLOR(YELLOW); OUTTEXTXY(0,450,CANAL ); OUTTEXTXY(100,450,CANAL ); OUTTEXTXY(200,450, MBOS); OUTTEXTXY(300,450, ALVAR); OUTTEXTXY(400,450, ARGAR); OUTTEXTXY(500,450,C RSOR); OUTTEXTXY(600,450,SA IR); SETFILLSTYLE(1,RED); BAR(0,448,55,460); SETCOLOR(YELLOW); OUTTEXTXY(0,450,CANAL ); SETCOLOR(3); {azul claro} OUTTEXTXY(0,450, 1); OUTTEXTXY(100,450, 2); OUTTEXTXY(200,450,A); OUTTEXTXY(300,450,S); OUTTEXTXY(400,450,C); OUTTEXTXY(500,450, U); OUTTEXTXY(600,450, L); XXX:=0; OP:=0; REPEAT OP5:=ORD(READKEY); IF OP5=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>6 THEN XXX:=0; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-5,448,(100*YYY)+55,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(0,450,CANAL ); IF YYY=1 THEN OUTTEXTXY(100,450,CANAL ); IF YYY=2 THEN OUTTEXTXY(200,450, MBOS); IF YYY=3 THEN OUTTEXTXY(300,450, ALVAR); IF YYY=4 THEN OUTTEXTXY(400,450, ARGAR); IF YYY=5 THEN OUTTEXTXY(500,450,C RSOR);

66

MANUAL DEL PROGRAMADOR: Unidades

IF YYY=6 THEN OUTTEXTXY(600,450,SA IR); SETFILLSTYLE(1,RED); BAR((100*XXX)-5,448,(100*XXX)+55,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(0,450,CANAL ); IF XXX=1 THEN OUTTEXTXY(100,450,CANAL ); IF XXX=2 THEN OUTTEXTXY(200,450, MBOS); IF XXX=3 THEN OUTTEXTXY(300,450, ALVAR); IF XXX=4 THEN OUTTEXTXY(400,450, ARGAR); IF XXX=5 THEN OUTTEXTXY(500,450,C RSOR); IF XXX=6 THEN OUTTEXTXY(600,450,SA IR) END; SETCOLOR(3); {azul claro} OUTTEXTXY(0,450, 1); OUTTEXTXY(100,450, 2); OUTTEXTXY(200,450,A); OUTTEXTXY(300,450,S); OUTTEXTXY(400,450,C); OUTTEXTXY(500,450, U); OUTTEXTXY(600,450, L); IF OP5=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<0 THEN XXX:=6; SETFILLSTYLE(1,BLACK); BAR((100*YYY)-5,448,(100*YYY)+55,460); SETCOLOR(YELLOW); IF YYY=0 THEN OUTTEXTXY(0,450,CANAL ); IF YYY=1 THEN OUTTEXTXY(100,450,CANAL ); IF YYY=2 THEN OUTTEXTXY(200,450, MBOS); IF YYY=3 THEN OUTTEXTXY(300,450, ALVAR); IF YYY=4 THEN OUTTEXTXY(400,450, ARGAR); IF YYY=5 THEN OUTTEXTXY(500,450,C RSOR); IF YYY=6 THEN OUTTEXTXY(600,450,SA IR); SETFILLSTYLE(1,RED); BAR((100*XXX)-5,448,(100*XXX)+55,460); SETCOLOR(YELLOW); IF XXX=0 THEN OUTTEXTXY(0,450,CANAL ); IF XXX=1 THEN OUTTEXTXY(100,450,CANAL ); IF XXX=2 THEN OUTTEXTXY(200,450, MBOS); IF XXX=3 THEN OUTTEXTXY(300,450, ALVAR); IF XXX=4 THEN OUTTEXTXY(400,450, ARGAR); IF XXX=5 THEN OUTTEXTXY(500,450,C RSOR); IF XXX=6 THEN OUTTEXTXY(600,450,SA IR) END; SETCOLOR(3); {azul claro} OUTTEXTXY(0,450, 1); OUTTEXTXY(100,450, 2); OUTTEXTXY(200,450,A); OUTTEXTXY(300,450,S); OUTTEXTXY(400,450,C); OUTTEXTXY(500,450, U); OUTTEXTXY(600,450, L); UNTIL (OP5=13) OR (OP5=64) OR (OP5=49) OR (OP5=50) OR (OP5=97) OR (OP5=65) OR (OP5=115) OR (OP5=83) OR (OP5=99) OR (OP5=67)

67

MANUAL DEL PROGRAMADOR: Unidades

OR (OP5=117) OR (OP5=85) OR (OP5=108) OR (OP5=76); IF (OP5=13) OR (OP5=49) OR (OP5=50) OR (OP5=97) OR (OP5=65) OR (OP5=115) OR (OP5=83) OR (OP5=99) OR (OP5=67) OR (OP5=117) OR (OP5=85) THEN BEGIN IF ((XXX=0) AND (OP5=13)) OR (OP5=49) THEN BEGIN MIRARPCLAB; IF PCLAB=FALSE THEN BEGIN PCLAB:=TRUE; GOTO SINPCLAB END; DISC:=1; SETFILLSTYLE(1,BLACK); BAR(0,0,640,340); SS:=SS1; RR:=RR1; CANAL:=CAN1; REPEAT REJILLA; FOR NN:=0 TO 10 DO BEGIN PROGRAMA(SS,RR,CANAL) END UNTIL KEYPRESSED; SINPCLAB : PORT[REGCONTROL]:=0 END; IF ((XXX=1) AND (OP5=13)) OR (OP5=50) THEN BEGIN MIRARPCLAB; IF PCLAB=FALSE THEN BEGIN PCLAB:=TRUE; GOTO SINPCLAB1 END; DISC:=3; SETFILLSTYLE(1,BLACK); BAR(0,0,640,340); SS:=SS2; RR:=RR2; CANAL:=CAN2; REPEAT REJILLA; FOR NN:=0 TO 10 DO BEGIN PROGRAMA(SS,RR,CANAL) END UNTIL KEYPRESSED; SINPCLAB1 : PORT[REGCONTROL]:=0 END; IF ((XXX=2) AND (OP5=13)) OR (OP5=97) OR (OP5=65) THEN BEGIN MIRARPCLAB; IF PCLAB=FALSE THEN BEGIN PCLAB:=TRUE; GOTO SINPCLAB2 END; DISC:=2; SETFILLSTYLE(1,BLACK); BAR(0,0,640,340); AMBOS(SS1,SS2,RR1,RR2,CAN1,CAN2); SINPCLAB2 : END; IF ((XXX=3) AND (OP5=13)) OR (OP5=115) OR (OP5=83) THEN BEGIN

68

MANUAL DEL PROGRAMADOR: Unidades

SETFILLSTYLE(1,BLACK); BAR(0,448,640,460); SALVAR END; IF ((XXX=4) AND (OP5=13)) OR (OP5=99) OR (OP5=67) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(0,448,640,460); CARGAR END; IF ((XXX=5) AND (OP5=13)) OR (OP5=117) OR (OP5=85) THEN BEGIN CURSOR END END UNTIL (XXX=6) OR (OP5=64) OR (OP5=108) OR (OP5=76) END; (**********************************************************) PROCEDURE TIME; BEGIN SETFILLSTYLE(1,RED); BAR(145,448,240,460); SETCOLOR(YELLOW); OUTTEXTXY(150,450, 1.6 ms/div); OUTTEXTXY(300,450,1. ms/div ); OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,1); OUTTEXTXY(300,450, 6); OUTTEXTXY(450,450, S); SETCOLOR(YELLOW); XXX:=1; OP:=0; REPEAT OP7:=ORD(READKEY); IF OP7=77 THEN BEGIN YYY:=XXX;XXX:=XXX+1; IF XXX>3 THEN XXX:=1; SETFILLSTYLE(1,BLACK); BAR((150*YYY)-5,448,(150*YYY)+90,460); SETCOLOR(YELLOW); IF YYY=1 THEN OUTTEXTXY(150,450, 1.6 ms/div); IF YYY=2 THEN OUTTEXTXY(300,450,1. ms/div ); IF YYY=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,1); OUTTEXTXY(300,450, 6); OUTTEXTXY(450,450, S); SETCOLOR(YELLOW); SETFILLSTYLE(1,RED); BAR((150*XXX)-5,448,(150*XXX)+90,460); SETCOLOR(YELLOW);

69

MANUAL DEL PROGRAMADOR: Unidades

IF XXX=1 THEN OUTTEXTXY(150,450, 1.6 ms/div); IF XXX=2 THEN OUTTEXTXY(300,450,1. ms/div ); IF XXX=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,1); OUTTEXTXY(300,450, 6); OUTTEXTXY(450,450, S); SETCOLOR(YELLOW) END; IF OP7=75 THEN BEGIN YYY:=XXX;XXX:=XXX-1; IF XXX<1 THEN XXX:=3; SETFILLSTYLE(1,BLACK); BAR((150*YYY)-5,448,(150*YYY)+90,460); SETCOLOR(YELLOW); IF YYY=1 THEN OUTTEXTXY(150,450, 1.6 ms/div); IF YYY=2 THEN OUTTEXTXY(300,450,1. ms/div ); IF YYY=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,1); OUTTEXTXY(300,450, 6); OUTTEXTXY(450,450, S); SETCOLOR(YELLOW); SETFILLSTYLE(1,RED); BAR((150*XXX)-5,448,(150*XXX)+90,460); SETCOLOR(YELLOW); IF XXX=1 THEN OUTTEXTXY(150,450, 1.6 ms/div); IF XXX=2 THEN OUTTEXTXY(300,450,1. ms/div ); IF XXX=3 THEN OUTTEXTXY(450,450, ALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(150,450,1); OUTTEXTXY(300,450, 6); OUTTEXTXY(450,450, S); SETCOLOR(YELLOW) END UNTIL (OP7=13) OR (OP7=64) OR (OP7=49) OR (OP7=54) OR (OP7=115) OR (OP7=83); IF (OP7=13) OR (OP7=49) OR (OP7=54) THEN BEGIN IF (XXX=1) OR (OP7=49) THEN BEGIN INCREMENTO:=1; HASTA:=500; TIEMPO:=11.6; SETFILLSTYLE(1,BLACK); BAR(310,375,400,390); STR(TIEMPO:2:2,TIRO); SETCOLOR(RED); OUTTEXTXY(310,380,TIRO); OUTTEXTXY(350,380,ms/div) END; IF (XXX=2) OR (OP7=54) THEN BEGIN INCREMENTO:=30; HASTA:=510; TIEMPO:=1.6;

70

MANUAL DEL PROGRAMADOR: Unidades

SETFILLSTYLE(1,BLACK); BAR(310,375,400,390); STR(TIEMPO:2:2,TIRO); SETCOLOR(RED); OUTTEXTXY(310,380,TIRO); OUTTEXTXY(350,380,ms/div) END END; IF (XXX=3) OR (OP7=64) OR (OP7=115) OR (OP7=83) THEN END; (******************PROCEDIMIENTO.PRINCIPAL*****************) PROCEDURE VISUALIZACION_DE_ONDAS; VAR COTE1,COTE2:REAL; VALOX,VALOY:INTEGER; BEGIN CAN1:=0; CAN2:=1; SS1:=7.12; SS2:=7.12; RR1:=240; RR2:=240; WW:=40; YY:=105; ESCALA1:=2.5; ESCALA2:=2.5; TIEMPO:=11.6; DISC:=0; HASTA:=500; INCREMENTO:=1; MODO:=GETGRAPHMODE; {se ejecutar si la definicin es buena} IF (GETMAXX>638) AND (GETMAXY>478) THEN BEGIN MODO:=2; SETGRAPHMODE(MODO); CLEARVIEWPORT; VALOX:=GETMAXX; COTE1:=VALOX/639; VALOY:=GETMAXY; COTE2:=VALOY/479; FOR INICIAL:=0 TO 5000 DO BEGIN VMUESTRAS[INICIAL]:=0; VMUESTRAS1[INICIAL]:=0; VMUESTRAS2[INICIAL]:=0 END; REJILLA;

REPEAT {dibujado de las teclas de funcin}

71

MANUAL DEL PROGRAMADOR: Unidades

BEGIN SETFILLSTYLE(1,MAGENTA); SETCOLOR(WHITE); BAR(10,100,60,135); OUTTEXTXY(28,105,F1); OUTTEXTXY(15,120,AYUDA); BAR(10,145,60,180); OUTTEXTXY(28,150,F2); OUTTEXTXY(15,165,V/DIV); BAR(10,190,60,225); OUTTEXTXY(28,195,F3); OUTTEXTXY(20,210,TIME); BAR(10,235,60,270); OUTTEXTXY(28,240,F4); OUTTEXTXY(11,255,VISUAL); BAR(10,280,60,315); OUTTEXTXY(28,285,F5); OUTTEXTXY(17,300,CANAL); RECTANGLE(10,100,60,135); RECTANGLE(10,145,60,180); RECTANGLE(10,190,60,225); RECTANGLE(10,235,60,270); RECTANGLE(10,280,60,315) END; SETFILLSTYLE(1,BLACK); BAR(0,448,640,480); SETCOLOR(YELLOW); OUTTEXTXY(10,460, .-VOLTS/DIV ); OUTTEXTXY(140,460, .- TIME ); OUTTEXTXY(271,460, .-VISUALIZA); OUTTEXTXY(400,460, .- CANALES ); OUTTEXTXY(530,460, .- SALIR ); SETFILLSTYLE(1,RED); BAR(10,455,110,473); SETCOLOR(YELLOW); OUTTEXTXY(10,460, .-VOLTS/DIV ); SETCOLOR(3); {azul claro} OUTTEXTXY(10,460,1); OUTTEXTXY(140,460, 2); OUTTEXTXY(271,460,3); OUTTEXTXY(400,460, 4); OUTTEXTXY(530,460, 5); SETCOLOR(YELLOW); XX:=0; REPEAT OP:=ORD(READKEY); IF OP=77 THEN BEGIN YY:=XX; XX:=XX+1; IF XX>4 THEN XX:=0; SETFILLSTYLE(1,BLACK); BAR((130*YY)+10,455,(130*YY)+110,473); SETCOLOR(YELLOW); IF YY=0 THEN OUTTEXTXY(10,460, .-VOLTS/DIV ); IF YY=1 THEN OUTTEXTXY(140,460, .- TIME );

72

MANUAL DEL PROGRAMADOR: Unidades

IF YY=2 THEN OUTTEXTXY(271,460, .-VISUALIZA); IF YY=3 THEN OUTTEXTXY(400,460, .- CANALES ); IF YY=4 THEN OUTTEXTXY(530,460, .- SALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(10,460,1); OUTTEXTXY(140,460, 2); OUTTEXTXY(271,460,3); OUTTEXTXY(400,460, 4); OUTTEXTXY(530,460, 5); SETCOLOR(YELLOW); SETFILLSTYLE(1,RED); BAR((130*XX)+10,455,(130*XX)+110,473); SETCOLOR(YELLOW); IF XX=0 THEN OUTTEXTXY(10,460, .-VOLTS/DIV ); IF XX=1 THEN OUTTEXTXY(140,460, .- TIME ); IF XX=2 THEN OUTTEXTXY(271,460, .-VISUALIZA); IF XX=3 THEN OUTTEXTXY(400,460, .- CANALES ); IF XX=4 THEN OUTTEXTXY(530,460, .- SALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(10,460,1); OUTTEXTXY(140,460, 2); OUTTEXTXY(271,460,3); OUTTEXTXY(400,460, 4); OUTTEXTXY(530,460, 5); SETCOLOR(YELLOW) END; IF OP=75 THEN BEGIN YY:=XX; XX:=XX-1; IF XX<0 THEN XX:=4; SETFILLSTYLE(1,BLACK); BAR((130*YY)+10,455,(130*YY)+110,473); SETCOLOR(YELLOW); IF YY=0 THEN OUTTEXTXY(10,460, .-VOLTS/DIV ); IF YY=1 THEN OUTTEXTXY(140,460, .- TIME ); IF YY=2 THEN OUTTEXTXY(271,460, .-VISUALIZA); IF YY=3 THEN OUTTEXTXY(400,460, .- CANALES ); IF YY=4 THEN OUTTEXTXY(530,460, .- SALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(10,460,1); OUTTEXTXY(140,460, 2); OUTTEXTXY(271,460,3); OUTTEXTXY(400,460, 4); OUTTEXTXY(530,460, 5); SETCOLOR(YELLOW); SETFILLSTYLE(1,RED); BAR((130*XX)+10,455,(130*XX)+110,473); SETCOLOR(YELLOW); IF XX=0 THEN OUTTEXTXY(10,460, .-VOLTS/DIV ); IF XX=1 THEN OUTTEXTXY(140,460, .- TIME ); IF XX=2 THEN OUTTEXTXY(271,460, .-VISUALIZA); IF XX=3 THEN OUTTEXTXY(400,460, .- CANALES ); IF XX=4 THEN OUTTEXTXY(530,460, .- SALIR ); SETCOLOR(3); {azul claro} OUTTEXTXY(10,460,1); OUTTEXTXY(140,460, 2);

73

MANUAL DEL PROGRAMADOR: Unidades

OUTTEXTXY(271,460,3); OUTTEXTXY(400,460, 4); OUTTEXTXY(530,460, 5); SETCOLOR(YELLOW) END

UNTIL (OP=13) OR (OP=60) OR (OP=61) OR (OP=62) OR (OP=63) OR (OP=64) OR (OP=49) OR (OP=50) OR (OP=51) OR (OP=52) OR (OP=53) OR (OP=59); {desdibujado de algunas teclas de funcin} BEGIN SETFILLSTYLE(1,BLACK); BAR(10,100,60,135); BAR(10,145,60,180); BAR(10,190,60,225); BAR(10,235,60,270); BAR(10,280,60,315) END; IF OP=13 THEN BEGIN IF XX=0 THEN IF XX=1 THEN IF XX=2 THEN IF XX=3 THEN END;

OP:=60; OP:=61; OP:=62; OP:=63

IF OP=59 THEN AYUDA_OSCILOSCOPIO; IF (OP=60) OR (OP=49) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(0,455,640,473); VOLTIOS END; IF (OP=61) OR (OP=50) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(0,455,640,473); TIME END; IF (OP=62) OR (OP=51) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(0,455,640,473); VISUALIZAR END; IF (OP=63) OR (OP=52) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(0,455,640,473); CANALES END;

74

MANUAL DEL PROGRAMADOR: Unidades

UNTIL (OP=13) OR (OP=64) OR (OP=53); SETFILLSTYLE(1,BLACK); {borrado de salir} BAR(580,100,630,135); SETCOLOR (BLACK); OUTTEXTXY(1,70, ); SETCOLOR(WHITE); OUTTEXTXY(1,70,APAGADO); REPEAT UNTIL KEYPRESSED END {de la definicin de condicin}

ELSE BEGIN VALOX:=GETMAXX; COTE1:=VALOX/639; VALOY:=GETMAXY; COTE2:=VALOY/479; SETFILLSTYLE(1,7); BAR (ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK); RECTANGLE (ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); OUTTEXTXY (ROUND(190*COTE1),ROUND(220*COTE2),NO EXISTE DEFINICION SUFICIENTE); OUTTEXTXY (ROUND(190*COTE1),ROUND(240*COTE2), PARA EJECUTAR EL OSCILOSCOPIO); FOR VALOX:=1 TO 5 DO BEGIN SOUND(1000); DELAY(100); SOUND(800); DELAY(80); NOSOUND; END; DELAY(4000); SETFILLSTYLE(1,BLACK); BAR (ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); END END; {del conjunto} (*************************************************************************) END.

75

3.- FICHEROS INCLUDE

La utilizacin de ficheros Include hace comprensible el programa principal. Por un lado, cada fichero, al contener una aplicacin o conjunto de procedimientos acorta el tamao del programa principal; y por otro, al aadirlo el compilador al programa principal, ste se ejecutar como perteneciente a l adquiriendo todas las directivas y variables globales que son utilizadas en el mismo.

Los ficheros Include se definen, pus, como archivos de texto en ASCII que aadir el compilador en forma de cdigo en el lugar del programa principal donde sean llamados mediante la directiva {$I <nombre de fichero>}. Obedecern, por tanto a las directivas de compilacin con que se compile el programa principal.

Estos archivos son : AYUDA, GEN, EJECUTA.

3.1.- AYUDA

3.1.1.- DESCRIPCIN DEL ARCHIVO.

Es el archivo que contiene los procedimientos de desarrollo de la ayuda en lnea del osciloscopio (visualizacin de formas de onda). Por ello es llamado en dicha unidad en su compilacin como archivo .TPU (unidad de Turbo Pascal).

3.1.2.- VARIABLES GLOBALES. 76

MANUAL DEL PROGRAMADOR: Ficheros Include

Son las que se declaran como tal en la unidad VISUAL.

3.1.3.- VARIABLES LOCALES.

Son las definidas en cada procedimiento, y que aqu son las siguientes :

LABEL SAL; VAR TECLA APUNTE DIME ER

: CHAR; : POINTER; : WORD; : INTEGER;

3.1.4.- LISTADO.

PROCEDURE AYUDA_OSCILOSCOPIO; LABEL SAL; VAR TECLA:CHAR; APUNTE:POINTER; DIME:WORD; ER:INTEGER; BEGIN DIME:=IMAGESIZE(98,48,402,302); {$I-} GETMEM(APUNTE,DIME) {$I+}; ER:=IORESULT; IF ER<>0 THEN GOTO SAL; {$I-} GETIMAGE(98,48,402,302,APUNTE^) {$I+}; ER:=IORESULT; IF ER<>0 THEN GOTO SAL; BEGIN SETFILLSTYLE(1,BLUE); SETCOLOR(YELLOW); BAR(98,48,402,302); OUTTEXTXY(115,55,>>> VOLT/DIV);

77

MANUAL DEL PROGRAMADOR: Ficheros Include

SETCOLOR(LIGHTMAGENTA); OUTTEXTXY(370,55,F2); SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,Funcin para determinar en eje de); OUTTEXTXY(115,85,ordenadas la tensin por divisin,); OUTTEXTXY(115,95,con unos rangos de tensin deter-); OUTTEXTXY(115,105,minados de: 2.5, 1, 0.25 VOLT/DIV.); OUTTEXTXY(115,115,Se tendr presente que la inicia-); OUTTEXTXY(115,125,lizacin la realiza el programa); OUTTEXTXY(115,135,en 2.5 VOLT/DIV. Por tanto en el); OUTTEXTXY(115,145,caso de utilizar la aplicacin de); OUTTEXTXY(115,155,cargar ondas desde fichero, el u-); OUTTEXTXY(115,165,suario inicializar de forma ade-); OUTTEXTXY(115,175,cuada el valor de la tensin.); OUTTEXTXY(115,185,La pantalla de visualin de formas); OUTTEXTXY(115,195,de onda est dividida con una al-); OUTTEXTXY(115,205,tura de ocho cuadrculas, consi-); OUTTEXTXY(115,215,guiendo una escala mxima de 20); OUTTEXTXY(115,225,voltios de pico a pico, y mnima); OUTTEXTXY(115,235,de 2 voltios de pico a pico.Cada); OUTTEXTXY(115,245,cuadrcula a su vez contiene cin-); OUTTEXTXY(115,255,co divisiones, aumentando la pre-); OUTTEXTXY(115,265,cisin en diez veces cada una de); OUTTEXTXY(115,275,stas ltimas con el cursor.); OUTTEXTXY(185,290,>>> siguiente, pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; BEGIN BAR(98,48,402,302); SETCOLOR(YELLOW); OUTTEXTXY(115,55,>>> TIME); SETCOLOR(LIGHTMAGENTA); OUTTEXTXY(370,55,F3); SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,Funcin para determinar en eje de); OUTTEXTXY(115,85,abcisas los tiempos de representa-); OUTTEXTXY(115,95,cin de las ondas. Estos tiempos); OUTTEXTXY(115,105,son para ambos canales y pueden); OUTTEXTXY(115,115,variarse en dos valores distintos.); OUTTEXTXY(115,125,11.6 ms/DIV 1.6 ms/DIV. La pan-); OUTTEXTXY(115,135,talla se halla dividida horizon--); OUTTEXTXY(115,145,talmente en diez cuadrculas con); OUTTEXTXY(115,155,cinco partes cada una, obtenien-); OUTTEXTXY(115,165,do una divisin de 50 partes por); OUTTEXTXY(115,175,cuadrcula, si realizamos segui-); OUTTEXTXY(115,185,miento con el cursor.); OUTTEXTXY(115,195, ); OUTTEXTXY(115,205, ); OUTTEXTXY(115,215, ); OUTTEXTXY(115,225, ); OUTTEXTXY(115,235, ); OUTTEXTXY(115,245, );

78

MANUAL DEL PROGRAMADOR: Ficheros Include

OUTTEXTXY(115,255, ); OUTTEXTXY(115,265, ); OUTTEXTXY(115,275, ); OUTTEXTXY(185,290,>>> siguiente, pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; BEGIN BAR(98,48,402,302); SETCOLOR(YELLOW); OUTTEXTXY(115,55,>>> VISUALIZA); SETCOLOR(LIGHTMAGENTA); OUTTEXTXY(370,55,F4); SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,Es la opcin ms compleja de las); OUTTEXTXY(115,85,que se presentan. Con ella se per-); OUTTEXTXY(115,95,mite realizar el conjunto de ope-); OUTTEXTXY(115,105,raciones que caracterizan el osci-); OUTTEXTXY(115,115,loscopio.); OUTTEXTXY(115,125,Segn la eleccin visualizamos el); OUTTEXTXY(115,135,CANAL 1, el CANAL 2 o AMBOS; man-); OUTTEXTXY(115,145,teniendose la visualizacin en); OUTTEXTXY(115,155,pantalla hasta la pulsacin de una); OUTTEXTXY(115,165,tecla.); OUTTEXTXY(115,175,Una vez determinada la(s) onda(s)); OUTTEXTXY(115,185,que permanece(n) en pantalla, po-); OUTTEXTXY(115,195,demos salvarla(s) sobre impresora); OUTTEXTXY(115,205,o sobre disco, siguiendo las ins-); OUTTEXTXY(115,215,trucciones que se dan a tal efecto.); OUTTEXTXY(115,225,Por ltimo sta opcin permite); OUTTEXTXY(115,235,cargar formas de onda que se han); OUTTEXTXY(115,245,salvado previamente sobre disco;); OUTTEXTXY(115,255,adems de realizar seguimiento con); OUTTEXTXY(115,265,el cursor en tensin y en frecuen-); OUTTEXTXY(115,275,cia.); OUTTEXTXY(185,290,>>> siguiente, pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; BEGIN BAR(98,48,402,302); SETCOLOR(YELLOW); OUTTEXTXY(115,55,>>> CANALES); SETCOLOR(LIGHTMAGENTA); OUTTEXTXY(370,55,F5); SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,Opcin simple para la asignacin); OUTTEXTXY(115,85,a los canales (1 y/o 2) del osci-); OUTTEXTXY(115,95,loscopio de los correspondientes); OUTTEXTXY(115,105,de la tarjeta PCLAB-812 sobre los); OUTTEXTXY(115,115,que realizar el test. ); OUTTEXTXY(115,125,(Con un total de 16, numerados de); OUTTEXTXY(115,135,0 a 15).);

79

MANUAL DEL PROGRAMADOR: Ficheros Include

OUTTEXTXY(115,145,Por defecto al arrancar el progra-); OUTTEXTXY(115,155,ma se hallan asignados el canal 0); OUTTEXTXY(115,165,de la targeta PCLAB-812 al canal 1); OUTTEXTXY(115,175,del osciloscopio, y el canal 1 de); OUTTEXTXY(115,185,la targeta al canal 2 del oscilos-); OUTTEXTXY(115,195,copio.); OUTTEXTXY(115,205, ); OUTTEXTXY(115,215, ); OUTTEXTXY(115,225, ); OUTTEXTXY(115,235, ); OUTTEXTXY(115,245, ); OUTTEXTXY(115,255, ); OUTTEXTXY(115,265, ); OUTTEXTXY(115,275, ); OUTTEXTXY(185,290,>>> siguiente, pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; BEGIN BAR(98,48,402,302); SETCOLOR(YELLOW); OUTTEXTXY(115,55,>>> SALIR); SETCOLOR(LIGHTMAGENTA); OUTTEXTXY(370,55,F6); SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,Opcin para salir del osciloscopio); OUTTEXTXY(115,85,y regresar al men principal.); OUTTEXTXY(115,95,Con la verificacin mediante la); OUTTEXTXY(115,105,seal de APAGADO, se ha materia-); OUTTEXTXY(115,115,lizado la salida, y cualquier re-); OUTTEXTXY(115,125,torno ser imposible. En este mo-); OUTTEXTXY(115,135,mento la pulsacin de cualquier); OUTTEXTXY(115,145,tecla nos devolver al men prin-); OUTTEXTXY(115,155,cipal. ); OUTTEXTXY(115,165,); OUTTEXTXY(115,175,Desde cualquier men o submen se); OUTTEXTXY(115,185,puede salir al men o submen an-); OUTTEXTXY(115,195,terior con slo pulsar la tecla); OUTTEXTXY(115,205,F6. O elegir la opcin "SALIR".); OUTTEXTXY(115,215, ); OUTTEXTXY(115,225, ); OUTTEXTXY(115,235, ); OUTTEXTXY(115,245, ); OUTTEXTXY(115,255, ); OUTTEXTXY(115,265, ); OUTTEXTXY(115,275, ); OUTTEXTXY(185,290,>>> siguiente, pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; BEGIN BAR(98,48,402,302); SETCOLOR(YELLOW); OUTTEXTXY(115,55, GENERAL);

80

MANUAL DEL PROGRAMADOR: Ficheros Include

SETCOLOR(WHITE); RECTANGLE(102,52,398,298); OUTTEXTXY(115,75,El entorno de utilizacin del os-); OUTTEXTXY(115,85,ciloscopio ha sido ideado para que); OUTTEXTXY(115,95,su manejo sea sencillo y cmodo); OUTTEXTXY(115,105,al usuario. Por ello las letras); OUTTEXTXY(115,115,en azul claro para el monitor en); OUTTEXTXY(115,125,color permiten un eficaz y rpido); OUTTEXTXY(115,135,uso de las opciones presentadas en); OUTTEXTXY(115,145,pantalla. Esto unido a las teclas); OUTTEXTXY(115,155,de funcin del men principal y a); OUTTEXTXY(115,165,la eleccin si procede con teclas); OUTTEXTXY(115,175,de cursor (e INTRO), hace que se); OUTTEXTXY(115,185,optimice el tiempo de eleccin y); OUTTEXTXY(115,195,que la misma no sea una tarea pe-); OUTTEXTXY(115,205,sada.); OUTTEXTXY(115,215, ); OUTTEXTXY(115,225, ); OUTTEXTXY(115,235, ); OUTTEXTXY(115,245, ); OUTTEXTXY(115,255, ); OUTTEXTXY(115,265, FIN ); OUTTEXTXY(115,275, ); OUTTEXTXY(270,290,>>> pulse TECLA) END; DESCARGARTECLADO; TECLA:=READKEY; PUTIMAGE(98,48,APUNTE^,COPYPUT); FREEMEM(APUNTE,DIME); SAL : END;

81

MANUAL DEL PROGRAMADOR: Ficheros Include

3.2.- GEN

3.2.1.- DESCRIPCIN DEL ARCHIVO.

Es el archivo que contiene los procedimientos utilizados en la opcin FICHERO PSP, y que verifica y convierte el formato del fichero PSPICE que se le pasa.

3.2.2.- VARIABLES GLOBALES.

Como fichero Include, son las pertenecientes como globales al programa principal.

3.2.3.- VARIABLES LOCALES.

Son las determinadas en cada procedimiento, y se limita su uso al mismo (o funcin). (Ver listado).

3.2.4.- LISTADO.

PROCEDURE FICHERO_PSPICE; LABEL FIN; CONST SALIDA : CHAR = ; VAR AMPLI : FILE OF CHAR;

82

MANUAL DEL PROGRAMADOR: Ficheros Include

NOM2 : STRING[255]; (**********************************************************) PROCEDURE PROCESO_DE_ERROR(ERROR0:INTEGER); VAR X,Y:BYTE; BEGIN X:=WHEREX; Y:=WHEREY; WINDOW(1,1,80,25); ERROR(ERROR0); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(17,22); WRITE(>> pulse CUALQUIER TECLA para reintentar, ESC. men principal); DESCARGARTECLADO; SALIDA:=READKEY; WINDOW(3,14,78,22);{----------borrado parcial de pantalla} CLRSCR; WINDOW(3,2,78,22);{------------recuperacin de la pantalla principal} GOTOXY(X,Y); END; (**********************************************************) PROCEDURE CERRAR_FICHERO; LABEL FIN; VAR ERROR3:INTEGER; BEGIN REPEAT {$I-} CLOSE(AMPLI) {$I+}; ERROR3:=IORESULT; IF ERROR3<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR3); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR3=0; FIN: END; (**********************************************************) (*--rutina de apertura del fichero--*) PROCEDURE PRIMERA_APERTURA_DE_FICHERO; LABEL FIN;

83

MANUAL DEL PROGRAMADOR: Ficheros Include

VAR ERROR1,JC:INTEGER; X,Y:BYTE; NOMPSP1:STRING; BEGIN REPEAT REPEAT CLRSCR; PULSA:= ; TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); WRITELN (>>> INTRODUZCA UNIDAD Y NOMBRE DEL FICHERO (FICHERO PSPICE .TXT): ); RAYA_HORIZONTAL(0,77,3,15); TEXTCOLOR(COLOR6); GOTOXY(2,2); CURSORON; DESCARGARTECLADO; REPEAT X:=WHEREX; Y:=WHEREY; {$I-} READLN (NOM) {$I+}; WRITELN; ERROR1:=IORESULT; IF NOM= THEN GOTOXY(X,Y); UNTIL (NOM<>) AND (ERROR1=0); CURSOROFF; IF ERROR1<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR1); IF SALIDA=#27 THEN GOTO FIN END; IF ( POS( ,NOM) <> 0 ) OR ( POS(",NOM) <> 0 ) OR ( POS(#,NOM) <> 0 ) OR ( POS(;,NOM) <> 0 ) THEN BEGIN ERROR1:=32765; PROCESO_DE_ERROR(ERROR1); IF SALIDA=#27 THEN GOTO FIN END; IF LENGTH(NOM)>77 THEN ERROR1:=2; UNTIL ERROR1=0; ASSIGN (AMPLI,NOM); {$I-} RESET (AMPLI) {$I+}; ERROR1:=IORESULT; IF ERROR1<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR1); IF SALIDA=#27 THEN BEGIN GOTO FIN; CERRAR_FICHERO END END;

84

MANUAL DEL PROGRAMADOR: Ficheros Include

IF ERROR1=0 THEN BEGIN NOMPSP1:=NOM; WHILE POS(\,NOMPSP1)<>0 DO DELETE(NOMPSP1,1,POS(\,NOMPSP1)); FOR JC:=1 TO LENGTH(NOMPSP1) DO NOMPSP1[JC]:=UPCASE(NOMPSP1[JC]); DELETE(NOMPSP1,1,POS(.,NOMPSP1)); IF NOMPSP1<>TXT THEN BEGIN PROCESO_DE_ERROR(32767); ERROR1:=1; IF SALIDA=#27 THEN GOTO FIN END END UNTIL ERROR1=0; FIN: END; (**********************************************************) PROCEDURE APERTURA_DE_FICHERO_IMPLICITA; VAR ERROR2:INTEGER; BEGIN REPEAT {$I-} RESET (AMPLI) {$I+}; ERROR2:=IORESULT; IF ERROR2<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR2); END UNTIL ERROR2=0 END; (**********************************************************) PROCEDURE CONTAR_PASOS_DE_TIEMPO; LABEL FIN; VAR PAS:CHAR; PASOS1,ERROR4:INTEGER; X,Y,A,B:BYTE; BEGIN TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); BEGIN APERTURA_DE_FICHERO_IMPLICITA; IF SALIDA=#27 THEN GOTO FIN;

85

MANUAL DEL PROGRAMADOR: Ficheros Include

PASOS1:=0; REPEAT REPEAT {$I-} READ(AMPLI,PAS) {$I+}; ERROR4:=IORESULT; IF ERROR4<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR4); IF SALIDA=#27 THEN GOTO FIN; END UNTIL ERROR4=0 UNTIL PAS=#; PASOS1:=PASOS1+1; REPEAT REPEAT {$I-} READ(AMPLI,PAS) {$I+}; ERROR4:=IORESULT; IF ERROR4<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR4); IF SALIDA=#27 THEN GOTO FIN; END UNTIL ERROR4=0 UNTIL PAS=#; PASOS1:=PASOS1+1; REPEAT REPEAT {$I-} READ(AMPLI,PAS) {$I+}; ERROR4:=IORESULT; IF ERROR4<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR4); IF SALIDA=#27 THEN GOTO FIN; END; UNTIL ERROR4=0 UNTIL PAS=#; PASOS1:=PASOS1+1; REPEAT REPEAT {$I-} READ(AMPLI,PAS) {$I+}; ERROR4:=IORESULT; IF ERROR4<>0 THEN IF ERROR4=100 THEN BEGIN GOTOXY(26,11); WRITELN( ); GOTOXY(1,10); PROCESO_DE_ERROR(32763); IF SALIDA=#27 THEN GOTO FIN END ELSE BEGIN PROCESO_DE_ERROR(ERROR4); IF SALIDA=#27 THEN GOTO FIN; END;

86

MANUAL DEL PROGRAMADOR: Ficheros Include

UNTIL ERROR4=0; IF PAS=# THEN BEGIN PASOS1:=PASOS1+1; END UNTIL PAS=;; WRITELN(SE PRODUCEN ,PASOS1-3, PASOS DE TIEMPO); WRITELN(contando el primer valor y el ltimo); END; FIN: END; (**********************************************************) PROCEDURE EVALUAR_FICHERO; LABEL PRINCIPIO,FIN; VAR I:CHAR; CABECERA1:STRING[255]; CABECERA2:STRING[255]; CADENA:STRING[50]; POSICION1,POSICION2,ERROR5:INTEGER; NUMERO,CONT,CUENTA,X,Y:BYTE; BEGIN TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); PRINCIPIO: REPEAT BEGIN CLRSCR; CADENA:=ANALYSIS=Transient Analysis; CLRSCR; PRIMERA_APERTURA_DE_FICHERO; IF SALIDA=#27 THEN GOTO FIN; WRITELN(VERIFICANDO FORMATO DEL FICHERO:); RAYA_HORIZONTAL(0,77,5,15); TEXTCOLOR(COLOR6); CABECERA1:=; CABECERA2:=; CUENTA:=0; REPEAT {$I-} READ(AMPLI,I) {$I+}; ERROR5:=IORESULT; IF ERROR5<>0 THEN BEGIN CERRAR_FICHERO; PROCESO_DE_ERROR(ERROR5); IF SALIDA=#27 THEN GOTO FIN; GOTO PRINCIPIO END; CABECERA1:=CABECERA1+I; CUENTA:=CUENTA+1; UNTIL (EOF(AMPLI)) OR (CUENTA=255); CUENTA:=POS(TITLE=,CABECERA1);

87

MANUAL DEL PROGRAMADOR: Ficheros Include

IF CUENTA=0 THEN BEGIN CERRAR_FICHERO; PROCESO_DE_ERROR(32766); IF SALIDA=#27 THEN GOTO FIN; GOTO PRINCIPIO END; DELETE(CABECERA1,0,CUENTA); DELETE(CABECERA1,POS(SUBTITLE,CABECERA1)-2,2); DELETE(CABECERA1,POS(TIME,CABECERA1)-2,255); CUENTA:=POS(#,CABECERA1); IF CUENTA<>0 THEN BEGIN CERRAR_FICHERO; PROCESO_DE_ERROR(32764); IF SALIDA=#27 THEN GOTO FIN; GOTO PRINCIPIO END; CERRAR_FICHERO; IF SALIDA=#27 THEN GOTO FIN; APERTURA_DE_FICHERO_IMPLICITA; IF SALIDA=#27 THEN GOTO FIN; BEGIN CABECERA1:=; CABECERA2:=; REPEAT {$I-} READ(AMPLI,I) {$I+}; ERROR5:=IORESULT; IF ERROR5=100 THEN BEGIN PROCESO_DE_ERROR(32766); BEGIN CERRAR_FICHERO; GOTO FIN END END ELSE IF ERROR5<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR5); IF SALIDA=#27 THEN BEGIN CERRAR_FICHERO; GOTO FIN END; UNTIL ERROR5=0; CUENTA:=0; REPEAT REPEAT {$I-} READ(AMPLI,I) {$I+}; ERROR5:=IORESULT; IF ERROR5=100 THEN BEGIN PROCESO_DE_ERROR(32766); BEGIN

END;

88

MANUAL DEL PROGRAMADOR: Ficheros Include

CERRAR_FICHERO; GOTO FIN END END ELSE IF ERROR5<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR5); IF SALIDA=#27 THEN BEGIN CERRAR_FICHERO; GOTO FIN END END UNTIL ERROR5=0; CABECERA1:=CABECERA1+I; CUENTA:=CUENTA+1; IF CUENTA=125 THEN BEGIN REPEAT REPEAT {$I-} READ(AMPLI,I) {$I+}; ERROR5:=IORESULT; IF ERROR5=100 THEN BEGIN PROCESO_DE_ERROR(32766); BEGIN CERRAR_FICHERO; GOTO FIN END END ELSE IF ERROR5<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR5); IF SALIDA=#27 THEN BEGIN CERRAR_FICHERO; GOTO FIN END END UNTIL ERROR5=0; CABECERA2:=CABECERA2+I; UNTIL (I=#) OR EOF(AMPLI); END UNTIL ((I=#) OR EOF(AMPLI)) AND (CUENTA>=125); END; POSICION1:=POS(CADENA,CABECERA1); POSICION2:=POS(CADENA,CABECERA2); IF (POSICION1=0) AND (POSICION2=0) THEN BEGIN TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(1,6); WRITELN(EL FICHERO NO ES DE PSPICE (en transitorio) O CONTIENE ERRORES);

89

MANUAL DEL PROGRAMADOR: Ficheros Include

WRITELN(^g); GOTOXY(23,21); WRITE(>>> pulse CUALQUIER TECLA para reintentar, ESC. salir); DESCARGARTECLADO; I:=READKEY; IF I=#27 THEN BEGIN SALIDA:=#27; GOTO FIN END END ELSE BEGIN I:=0; TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); WRITELN; WRITELN(FICHERO CORRECTO DE PSPICE EN ,CADENA); CONT:=WHEREX; CUENTA:=WHEREY; TEXTCOLOR(LIGHTRED+BLINK); GOTOXY(26,11); WRITELN(ESPERE UN MOMENTO, POR FAVOR); CONTAR_PASOS_DE_TIEMPO; {el procedimiento contiene la apertura implicita del fichero determinado} IF SALIDA=#27 THEN GOTO FIN; TEXTCOLOR(WHITE); GOTOXY(26,11); WRITELN( ); RAYA_HORIZONTAL(0,77,10,15); GOTOXY(CONT,CUENTA); {-----------------------ver tiempos--------------------------} NUMERO:=POS(XBEGIN,CABECERA2); TIEMPO:=COPY(CABECERA2,NUMERO,35); TEXTCOLOR(COLOR6); WRITELN(TIEMPO); WRITE(EL FICHERO SE HA EVALUADO ); TEXTCOLOR(COLOR6+BLINK); WRITELN(CORRECTAMENTE); TEXTCOLOR(COLOR6); END; IF I=0 THEN BEGIN GOTOXY(20,21); WRITE(>>> pulse CUALQUIER TECLA para repetir, 0 siguiente paso); DESCARGARTECLADO; I:=READKEY END END; UNTIL I=0; CERRAR_FICHERO; FIN: END;

90

MANUAL DEL PROGRAMADOR: Ficheros Include

(**********************************************************) {dispone la posible memoria ocupada por anteriores ficheros .txt} PROCEDURE DEL_MEMDIN_OCUPADA_ANTERIORFICH; BEGIN ANTE:=PRIM; REPEAT ACTU:=ANTE^.SIG; DISPOSE(ANTE); ANTE:=ACTU UNTIL ANTE^.SIG=NIL END; (**********************************************************) {dispone la posible memoria ocupada por los nudos de anteriores fich} PROCEDURE LIBERA_MEMDIN_NUDOS; BEGIN COMODIN:=INICIAL; REPEAT BEGIN PRESENTE:=COMODIN^.SIG; DISPOSE(COMODIN); COMODIN:=PRESENTE END; UNTIL COMODIN^.SIG=NIL; END; (**********************************************************) PROCEDURE TRANSFORMAR_FORMATO_PSPICE; {transformacion del fichero xxx.dat a ns reales,} {con transferencia a disco en formato xxx.eva} LABEL FIN; VAR SENAL_ERROR:BOOLEAN; CARGA1,NUMEROS:CHAR; LECTURA:STRING[20]; NOMFICH:STRING[12]; X,Y:BYTE; CONTADOR1,CONTADOR2,ERR,control,ERRORLECT:INTEGER; T,V1:REAL; V:ARRAY[1..25] OF REAL; (********) { este procedimiento pasa los datos convertidos a la memoria dinmica} { creando un fichero XXX.EVA directamente accesible por el }

91

MANUAL DEL PROGRAMADOR: Ficheros Include

{ usuario} PROCEDURE DATOS_A_MDINAMICA; VAR C:INTEGER; BEGIN {------paso de los datos a memoria dinmica------} IF PRIM=NIL THEN BEGIN NEW(ACTU); ACTU^.TIEMPOS:=T; FOR C:=1 TO CUNTAPUNTOYCOMA DO BEGIN ACTU^.TENSIONES[C]:=V[C] END; PRIM:=ACTU; ACTU^.SIG:=NIL END ELSE BEGIN ANTE:=ACTU; NEW(ACTU); ACTU^.TIEMPOS:=T; FOR C:=1 TO CUNTAPUNTOYCOMA DO BEGIN ACTU^.TENSIONES[C]:=V[C] END; ANTE^.SIG:=ACTU; ACTU^.SIG:=NIL END END; (********) {guarda los datos leidos del fichero .dat a disco} PROCEDURE DISCO; LABEL FIN; VAR C:INTEGER; CONST EVA=.EVA; EXPLICACION2= SI AL REVISARLO ENCUENTRAS ALGUN DATO EN FORMATO 8.88888888E+10,#13#10; EXPLICACION3= QUIERE DECIR QUE LA LECTURA DEL DATO QUE TENDRIA QUE IR COLOCADO#13#10; EXPLICACION4= EN ESA POSICION HA RESULTADO DEFECTUOSA#13#10; EXPLICACION5= ------(C) 1993 JULIO & EMILIO-----#13#10; EXPLICACION6= FORMATO:#13#10; EXPLICACION7= TIEMPOS#13#10; EXPLICACION8= TENS NDO.1 TENS NDO.2....#13#10; VAR

92

MANUAL DEL PROGRAMADOR: Ficheros Include

EXPLICACION1:STRING[70]; EXPLICACION9:STRING[56]; CADENA1:STRING[19]; CADENA2:STRING[17]; FICH:TEXT; X:PUNTEROV2; ERROR6:INTEGER; BEGIN NOM2:=NOM; WHILE POS(\,NOM)<>0 DO DELETE(NOM,1,POS(\,NOM)); NOMPSP:=NOM; FOR C:=1 TO LENGTH(NOMPSP) DO NOMPSP[C]:=UPCASE(NOMPSP[C]); EXPLICACION1:=( RESULTADO DE LA CONVERSION DEL FICHERO DE PSPICE,#13#10); EXPLICACION9:=( PARA MAS DETALLES CONSULTAR EL FICHERO #13#10); FOR C:=1 TO LENGTH(NOM) DO NOM[C]:=UPCASE(NOM[C]); {------transforma las posibles minusculas} INSERT(NOM,EXPLICACION9,43); INSERT(NOM,EXPLICACION1,43); DELETE(NOM,POS(.,NOM),LENGTH(NOM)); NOMFICH:=NOM+EVA; ASSIGN(FICH,NOMFICH); IF CREAR=A DISCO: SI THEN{--graba a disco el fichero transf., si tiene la orden} BEGIN REPEAT {$I-}REWRITE(FICH){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITE(FICH,EXPLICACION5+EXPLICACION1+EXPLICACION2){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITE(FICH,EXPLICACION3+EXPLICACION4+EXPLICACION6){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITE(FICH,EXPLICACION7+EXPLICACION8+EXPLICACION9){$I+};

93

MANUAL DEL PROGRAMADOR: Ficheros Include

ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITELN(FICH, ){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITELN(FICH, ){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; X:=PRIM; WHILE X<>NIL DO BEGIN STR(X^.TIEMPOS,CADENA1); CADENA1:=CADENA1+#13+#10; WRITE(FICH,CADENA1); FOR C:=1 TO CUNTAPUNTOYCOMA DO BEGIN STR(X^.TENSIONES[C],CADENA2); REPEAT {$I-}WRITE(FICH,CADENA2){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; REPEAT {$I-}WRITE(FICH, ){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0 END; REPEAT {$I-}WRITE(FICH,#10#13){$I+};

94

MANUAL DEL PROGRAMADOR: Ficheros Include

ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; X:=X^.SIG END; REPEAT {$I-}WRITE(FICH,*){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END UNTIL ERROR6=0; {$I-}CLOSE(FICH){$I+}; ERROR6:=IORESULT; IF ERROR6<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR6); IF SALIDA=#27 THEN GOTO FIN END; FIN: END END; (********) PROCEDURE LEER; VAR VALOR:PUNTEROV2; C:INTEGER; BEGIN VALOR:=PRIM; WHILE VALOR<>NIL DO BEGIN WITH VALOR^ DO BEGIN WRITELN(TIEMPOS); FOR C:=1 TO CUNTAPUNTOYCOMA DO BEGIN WRITE(TENSIONES[C]); WRITE( ) END; VALOR:=VALOR^.SIG; WRITELN END END END; (********)

95

MANUAL DEL PROGRAMADOR: Ficheros Include

PROCEDURE PRESENTACION_FINAL; VAR A:BYTE; BEGIN CLRSCR; GOTOXY(14,1); WRITELN( EL FICHERO PSPICE HA SIDO TRANSFORMADO,); IF CREAR=A DISCO: SI THEN BEGIN GOTOXY(14,3); WRITELN(PARA VER SU FORMATO CONSULTAR EL FICHERO ,NOMFICH); GOTOXY(14,5); WRITELN( CREADO EN EL DIRECTORIO ACTUAL); END ELSE BEGIN GOTOXY(1,3); WRITELN( SIGUIENDO LAS ORDENES DEL MENU PRINCIPAL NO HA SIDO CREADO NINGUN); GOTOXY(1,4); WRITELN( FICHERO, COMO RESULTADO DE LA CONVERSION.); GOTOXY(1,5); WRITELN( SI NO ES ESTE SU DESEO RETORNE AL MENU Y CAMBIE LA OPCION A DISCO); END; IF CONTADOR3<>0 THEN BEGIN RAYA_HORIZONTAL(0,77,6,12); WRITELN(^g); GOTOXY(1,8); TEXTCOLOR(LIGHTRED); WRITELN( A T E N C I O N !); TEXTCOLOR(COLOR6); GOTOXY(1,10); WRITELN(EXISTEN ,CONTADOR3, VALORES QUE SOBREPASAN LOS +-10 VOLTIOS EN EL FICHERO PSPICE, ); GOTOXY(1,11); WRITELN(ES NECESARIO INVESTIGAR Y TENER LA PRECAUCION DE NO CONECTAR LA PCLAB ); GOTOXY(1,12); WRITELN(A NINGUN CANAL QUE SUPERE LOS 10 VOLTIOS); RAYA_HORIZONTAL(0,77,13,12); END; IF NO_DE_ERRORES<>0 THEN BEGIN RAYA_HORIZONTAL(0,77,6,12); IF CONTADOR3<>0 THEN Y:=15 ELSE Y:=8; GOTOXY(1,Y); TEXTCOLOR(LIGHTRED); WRITELN( A T E N C I O N !); TEXTCOLOR(COLOR6);

96

MANUAL DEL PROGRAMADOR: Ficheros Include

GOTOXY(1,Y+2); WRITELN( SE HAN PRODUCIDO ERRORES DE LECTURA DEL FICHERO PSPICE); IF CREAR=A DISCO: SI THEN WRITELN( CONSULTESE EL FICHERO ,NOMFICH); RAYA_HORIZONTAL(0,77,13,12); END; IF (NO_DE_ERRORES<>0) OR (CONTADOR3<>0) THEN A:=12 ELSE A:=15; RAYA_HORIZONTAL(0,77,6,A); TEXTCOLOR(COLOR6); GOTOXY(19,21); WRITE(>>> pulse CUALQUIER TECLA para retornar al men principal); DESCARGARTECLADO; PULSA:=READKEY; END; (*******) PROCEDURE LECNUDOS; LABEL FIN; VAR ABORTA:BOOLEAN; CUNTA:BYTE; ERROR20:INTEGER; BEGIN ABORTA:=FALSE; CUNTA:=0; CUNTAPUNTOYCOMA:=0; REPEAT {$I-}RESET(AMPLI){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; REPEAT REPEAT {$I-}READ(AMPLI,NODCHAR){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END

97

MANUAL DEL PROGRAMADOR: Ficheros Include

END; UNTIL ERROR20=0; IF NODCHAR=# THEN CUNTA:=CUNTA+1; UNTIL (NODCHAR=N) AND (CUNTA=2); REPEAT REPEAT {$I-}READ(AMPLI,NODCHAR){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; IF NODCHAR=V THEN BEGIN REPEAT {$I-}READ(AMPLI,NODCHAR){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END UNTIL ERROR20=0; IF NODCHAR=( THEN CUNTAPUNTOYCOMA:=CUNTAPUNTOYCOMA+1; END UNTIL NODCHAR=#; FIN: IF ABORTA=TRUE THEN BEGIN IF MEMDINAMICA=TRUE THEN DEL_MEMDIN_OCUPADA_ANTERIORFICH; IF CARGONUDOS=TRUE THEN LIBERA_MEMDIN_NUDOS; NOMPSP:=Ninguno; EJECUTAR:=FALSE; MEMDINAMICA:=FALSE END END; (********) {programa principal del procedimiento transformar formato pspice} BEGIN LECNUDOS; SENAL_ERROR:=FALSE; CLRSCR;

98

MANUAL DEL PROGRAMADOR: Ficheros Include

IF MEMDINAMICA=TRUE THEN BEGIN DEL_MEMDIN_OCUPADA_ANTERIORFICH; LIBERA_MEMDIN_NUDOS; MEMDINAMICA:=FALSE END; GOTOXY(26,12); TEXTCOLOR(LIGHTRED+BLINK); WRITELN(ESPERE UN MOMENTO POR FAVOR); TEXTCOLOR(COLOR6); CONTADOR1:=0; APERTURA_DE_FICHERO_IMPLICITA; IF SALIDA=#27 THEN GOTO FIN; REPEAT REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN GOTO FIN END; UNTIL ERRORLECT=0; IF CARGA1=#THEN CONTADOR1:=CONTADOR1+1 UNTIL (CARGA1=#) AND (CONTADOR1=3); control:=0; PRIM:=NIL; REPEAT REPEAT {-------lectura de los tiempos-------} LECTURA:= ; IF (CARGA1=#) OR (CARGA1=C) THEN BEGIN REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN END END; UNTIL ERRORLECT=0; IF CONTROL=0 THEN READ(AMPLI,CARGA1); REPEAT REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN

99

MANUAL DEL PROGRAMADOR: Ficheros Include

BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN END END; UNTIL ERRORLECT=0; IF (CARGA1<> ) THEN LECTURA:=LECTURA+CARGA1 UNTIL (CARGA1= ) OR (CARGA1=#10); IF CARGA1=#10 THEN DELETE(LECTURA,LENGTH(LECTURA)-1,2); VAL(LECTURA,T,ERR); {----detecccion de los errores de la conversion---} IF ERR<>0 THEN BEGIN T:=88888888888E00; NO_DE_ERRORES:=NO_DE_ERRORES+1 END END; (*----lectura de las tensiones----*) IF CARGA1= THEN BEGIN REPEAT REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN END END; UNTIL ERRORLECT=0; UNTIL CARGA1=#10 END; CONTADOR2:=0; REPEAT LECTURA:= ; REPEAT REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE;

100

MANUAL DEL PROGRAMADOR: Ficheros Include

GOTO FIN END END; UNTIL ERRORLECT=0; IF CARGA1<># THEN BEGIN IF CARGA1<>: THEN IF CARGA1<>#10 THEN IF CARGA1<>#13 THEN LECTURA:=LECTURA+CARGA1 END UNTIL (CARGA1=:) OR (CARGA1=#); CONTADOR2:=CONTADOR2+1; IF CARGA1<># THEN BEGIN VAL(LECTURA,V1,ERR); {----detecccion de los errores de la conversion--} IF ERR<>0 THEN BEGIN V1:=88888888888E00; NO_DE_ERRORES:=NO_DE_ERRORES+1 END; IF (V1>10) or (V1<-10) THEN {---comprobacion valores<=10} CONTADOR3:=CONTADOR3+1; V[CONTADOR2]:=V1; REPEAT REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN END END; UNTIL ERRORLECT=0 UNTIL (CARGA1= ) OR (CARGA1=#) END UNTIL CARGA1=#; DATOS_A_MDINAMICA; MEMDINAMICA:=TRUE; UNTIL (CARGA1=#); CONTROL:=CONTROL+1; REPEAT {$I-} READ(AMPLI,CARGA1) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN

101

MANUAL DEL PROGRAMADOR: Ficheros Include

END END; UNTIL ERRORLECT=0 UNTIL EOF(AMPLI) OR (CARGA1=;); REPEAT {$I-} CLOSE(AMPLI) {$I+}; ERRORLECT:=IORESULT; IF ERRORLECT<>0 THEN BEGIN PROCESO_DE_ERROR(ERRORLECT); IF SALIDA=#27 THEN BEGIN SENAL_ERROR:=TRUE; GOTO FIN END END; UNTIL ERRORLECT=0; GOTOXY(28,12); TEXTCOLOR(LIGHTRED+BLINK); WRITELN(ESPERE UN MOMENTO POR FAVOR); TEXTCOLOR(COLOR6); LEER; DISCO; IF SALIDA=#27 THEN GOTO FIN; PRESENTACION_FINAL; FIN: IF SENAL_ERROR=TRUE THEN BEGIN NOMPSP:=Ninguno; EJECUTAR:=FALSE; MEMDINAMICA:=FALSE; DEL_MEMDIN_OCUPADA_ANTERIORFICH END END; (**********************************************************) PROCEDURE CARGAR_NUDOS_MEMDIN(CARACNUDOS:CHAR); BEGIN IF INICIAL=NIL THEN BEGIN NEW(INICIAL); INICIAL^.CARACTERN:=CARACNUDOS; INICIAL^.SIG:=NIL ; PRESENTE:=INICIAL; END ELSE BEGIN COMODIN:=PRESENTE; NEW(PRESENTE); PRESENTE^.CARACTERN:=CARACNUDOS; PRESENTE^.SIG:=NIL; COMODIN^.SIG:=PRESENTE; END

102

MANUAL DEL PROGRAMADOR: Ficheros Include

END; (**********************************************************) PROCEDURE NUDOS; LABEL FIN; CONST CUNTA:BYTE=0; VAR ERROR20:INTEGER; ABORTA:BOOLEAN; CARGONUDOS:BOOLEAN; C:CHAR; BEGIN ABORTA:=FALSE; CARGONUDOS:=FALSE; ASSIGN(AMPLI,NOM2); CUNTA:=0; CUNTAPUNTOYCOMA:=1; MAXCADENUDOS1:=0; MAXCADENUDOS2:=0; REPEAT {$I-}RESET(AMPLI){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; REPEAT REPEAT {$I-}READ(AMPLI,NODCHAR){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; IF NODCHAR=# THEN CUNTA:=CUNTA+1; UNTIL (NODCHAR=N) AND (CUNTA=2); INICIAL:=NIL;

103

MANUAL DEL PROGRAMADOR: Ficheros Include

REPEAT {$I+}READ(AMPLI,NODCHAR){I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; C:= ; WHILE NODCHAR<># DO BEGIN REPEAT {$I-}READ(AMPLI,NODCHAR){I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; IF NODCHAR=# THEN CARGAR_NUDOS_MEMDIN(#); IF NODCHAR=V THEN BEGIN C:=V END ELSE IF (C=V) AND (NODCHAR=() THEN BEGIN CARGAR_NUDOS_MEMDIN(V); CARGONUDOS:=TRUE; CARGAR_NUDOS_MEMDIN(NODCHAR); REPEAT REPEAT {$I-}READ(AMPLI,NODCHAR){I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; CARGAR_NUDOS_MEMDIN(NODCHAR);

104

MANUAL DEL PROGRAMADOR: Ficheros Include

CARGONUDOS:=TRUE; IF NODCHAR=) THEN BEGIN CARGAR_NUDOS_MEMDIN(;); CUNTAPUNTOYCOMA:=CUNTAPUNTOYCOMA+1 END UNTIL NODCHAR=) END ELSE IF NODCHAR<>V THEN C:= ; END; CUNTAPUNTOYCOMA:=CUNTAPUNTOYCOMA-1; REPEAT {$I-}CLOSE(AMPLI){$I+}; ERROR20:=IORESULT; IF ERROR20<>0 THEN BEGIN PROCESO_DE_ERROR(ERROR20); IF SALIDA=#27 THEN BEGIN ABORTA:=TRUE; GOTO FIN END END; UNTIL ERROR20=0; FIN: IF ABORTA=TRUE THEN BEGIN DEL_MEMDIN_OCUPADA_ANTERIORFICH; IF CARGONUDOS=TRUE THEN LIBERA_MEMDIN_NUDOS; NOMPSP:=Ninguno; EJECUTAR:=FALSE; MEMDINAMICA:=FALSE END END; (****************************************************************) (**********PROGRAMA PRINCIPAL DEL PROCEDIMIENTO******************) (****************************************************************) BEGIN WINDOW(1,1,80,25); CURSOROFF; TEXTBACKGROUND(COLOR5); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); WINDOW(3,2,78,24); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(1,23); WRITE(DTO. ACTUAL: ,DIRECTORIO); GOTOXY(65,23); WRITE(CREAR); RAYA_HORIZONTAL(0,77,22,WHITE); WINDOW(3,2,78,22);

105

MANUAL DEL PROGRAMADOR: Ficheros Include

EVALUAR_FICHERO; IF SALIDA=#27 THEN GOTO FIN; TRANSFORMAR_FORMATO_PSPICE; IF SALIDA=#27 THEN GOTO FIN; NUDOS; IF SALIDA=#27 THEN GOTO FIN; TEXTMODE(C80); EJECUTAR:=TRUE; FIN: SALIDA:=#251; {valor que no se puede dar} CLRSCR; WINDOW(1,1,80,25) END;

106

MANUAL DEL PROGRAMADOR: Ficheros Include

3.3.- EJECUTA

3.3.1.- DESCRIPCIN DEL ARCHIVO.

El archivo EJECUTA contiene el conjunto de procedimientos que son llamados para realizar la opcin de EJECUTAR del programa principal. Contiene la asignacin de los nudos a los canales de la tarjeta de adquisicin, la adquisicin de los datos por la misma, la comparacin y la presentacin de los resultados obtenidos (Respuesta del programa).

3.3.2.- VARIABLES GLOBALES.

Como en el resto de los archivos Include, sus variables globales son las mismas que las variables declaradas como tales en el programa principal.

3.3.3.- VARIABLES LOCALES.

Son las variables que se declaran y se utilizan en cada procedimiento y/o funcin. (Ver listado).

3.3.4.- LISTADO.

PROCEDURE EJECUTA; LABEL FIN; CONST

107

MANUAL DEL PROGRAMADOR: Ficheros Include

IOCONS:CHAR=#251; VAR PULSACURSOR : CHAR; FUERA : CHAR; ERROASIG : BOOLEAN; (**********************************************************) PROCEDURE PROCESO_DE_ERROR(ERROR0:INTEGER); VAR X : BYTE; Y : BYTE; BEGIN X:=WHEREX; Y:=WHEREY; ERROR(ERROR0); GOTOXY(16,20); TEXTBACKGROUND(COLOR5); TEXTCOLOR(COLOR6); WRITE(>>PULSA CUALQUIER TECLA PARA REINTENTAR, ESC. MENU PRINCIPAL); DESCARGARTECLADO; IOCONS:=READKEY; WINDOW(3,14,78,21);{----------BORRADO PARCIAL DE PANTALLA} CLRSCR; WINDOW(3,2,78,24);{------------RECUPERACION DE LA PANTALLA PRINCIPAL} GOTOXY(X,Y); END; (**********************************************************) {rutina que detecta que no ha sido asignado ningun canal de la PCLAB} PROCEDURE ERROR_DE_ASIGNACION; VAR C : BYTE; D : BYTE; BEGIN ERROASIG:=FALSE; D:=0; FOR C:=0 TO 15 DO IF ASIGNUD[C]=88 THEN D:=D+1; IF D=16 THEN BEGIN ERROASIG:=TRUE; ERROR(32758); FOR C:=1 TO 5 DO BEGIN SOUND(1000); DELAY(100); SOUND(800); DELAY(80);

108

MANUAL DEL PROGRAMADOR: Ficheros Include

NOSOUND END; GOTOXY(23,21); TEXTBACKGROUND(COLOR5); WRITE( >>> Pulse cualquier TECLA para repetir, ESCAPE men); TEXTCOLOR(COLOR6); FUERA:=READKEY; END END; (**********************************************************) PROCEDURE PRESENTACION_NUDOS; LABEL FIN1; CONST PULSACANAL:STRING=; VAR VUELTA : BYTE; REALCE : BYTE; LUZ : BYTE; TOCA : BYTE; MAXLONGLINEA : BYTE; FILAS : INTEGER; ERROR20 : INTEGER; MOM : INTEGER; E : INTEGER; MO : INTEGER; PSCANAL1 : CHAR; PSCANAL2 : CHAR; MOMEN : CHAR; BEGIN RAYA_HORIZONTAL(0,77,2,WHITE); GOTOXY(1,1); TEXTCOLOR(COLOR6); WRITELN( ASIGNACION DE NUDOS Y CANALES PCLAB: SELECCIONE ENTRE LOS PRESENTES NUDOS ); WINDOW(3,4,78,24); FOR TOCA:=0 TO 15 DO ASIGNUD[TOCA]:=88; TOCA:=1; LUZ:=1; CURSOROFF; REPEAT COMODIN:=INICIAL; {-------inicializa el puntero} FILAS:=CUNTAPUNTOYCOMA; IF CUNTAPUNTOYCOMA>17 THEN IF TOCA<17 THEN FILAS:=17 ELSE IF TOCA<CUNTAPUNTOYCOMA THEN FILAS:=TOCA+1

109

MANUAL DEL PROGRAMADOR: Ficheros Include

ELSE FILAS:=CUNTAPUNTOYCOMA; CLRSCR; FOR VUELTA:=1 TO FILAS DO BEGIN IF VUELTA=TOCA THEN IF MN=FALSE THEN REALCE:=LIGHTRED ELSE REALCE:=WHITE ELSE IF MN=FALSE THEN REALCE:=LIGHTBLUE ELSE REALCE:=BLACK; IF VUELTA<=9 THEN WRITE( ,VUELTA, - ) ELSE WRITE( ,VUELTA, - ); MAXLONGLINEA:=0; REPEAT BEGIN NODCHAR:=COMODIN^.CARACTERN; COMODIN:=COMODIN^.SIG; IF NODCHAR<>; THEN IF NODCHAR<># THEN BEGIN TEXTBACKGROUND(REALCE); IF REALCE=BLACK THEN TEXTCOLOR(WHITE); IF REALCE=WHITE THEN TEXTCOLOR(BLACK); WRITE(NODCHAR); MAXLONGLINEA:=MAXLONGLINEA+1; IF MAXLONGLINEA>60 THEN IF NODCHAR= THEN BEGIN TEXTBACKGROUND(COLOR5); WRITELN; FOR E:=1 TO 6 DO BEGIN WRITE( ); MAXLONGLINEA:=0 END; TEXTBACKGROUND(REALCE) END END END; IF REALCE=WHITE THEN TEXTCOLOR(WHITE); IF (NODCHAR=;) OR (NODCHAR=#) THEN FOR MO:=0 TO 15 DO IF ASIGNUD[MO]=VUELTA THEN BEGIN TEXTBACKGROUND(COLOR5); TEXTCOLOR(COLOR11); IF MAXLONGLINEA>=50 THEN BEGIN WRITELN; FOR E:=1 TO 5 DO BEGIN WRITE( ); MAXLONGLINEA:=0

110

MANUAL DEL PROGRAMADOR: Ficheros Include

END; WRITE( ASIGNADO A CANAL: ,MO) END ELSE WRITE( ASIGNADO A CANAL: ,MO); TEXTCOLOR(COLOR6) END UNTIL (NODCHAR=;) OR (NODCHAR=#); TEXTBACKGROUND(COLOR5); WRITELN END; REPEAT PULSACURSOR:=READKEY UNTIL (PULSACURSOR=#72) OR (PULSACURSOR=#80) OR (PULSACURSOR=#13) OR (PULSACURSOR=#27); IF PULSACURSOR=#27 THEN BEGIN TEXTCOLOR(COLOR6); GOTOXY(1,1); WRITELN( ASIGNACION DE NUDOS Y CANALES PCLAB: SELECCIONE ENTRE LOS PRESENTES NUDOS ); WINDOW(3,4,78,24); RAYA_HORIZONTAL(0,77,2,WHITE); TEXTCOLOR(COLOR12); GOTOXY(1,1); WRITELN ( DESEA VISUALIZAR DE NUEVO LA CONFIGURACION? (S/N) ); REPEAT PULSACURSOR:=READKEY; UNTIL PULSACURSOR IN [S,N,n,s]; IF PULSACURSOR IN [S,s] THEN BEGIN PULSACURSOR:=1; TEXTCOLOR(COLOR6); END ELSE BEGIN ERROR_DE_ASIGNACION; TEXTCOLOR(COLOR6); IF (ERROASIG=TRUE) THEN BEGIN IF FUERA=#27 THEN BEGIN PULSACURSOR:=#27; IOCONS:=#27; TEXTCOLOR(COLOR6) END ELSE BEGIN PULSACURSOR:=#251; TEXTCOLOR(COLOR6) END END

111

MANUAL DEL PROGRAMADOR: Ficheros Include

ELSE BEGIN PULSACURSOR:=#27; IOCONS:=#251; TEXTCOLOR(COLOR6) END END END; IF PULSACURSOR=#72 THEN IF LUZ=1 THEN BEGIN TOCA:=CUNTAPUNTOYCOMA; LUZ:=TOCA END ELSE BEGIN LUZ:=LUZ-1; TOCA:=LUZ END; IF PULSACURSOR=#80 THEN IF LUZ=CUNTAPUNTOYCOMA THEN BEGIN TOCA:=1; LUZ:=1 END ELSE BEGIN LUZ:=LUZ+1; TOCA:=LUZ END; IF PULSACURSOR=#13 THEN BEGIN WINDOW(3,2,78,24); TEXTCOLOR(COLOR12); GOTOXY(1,1); WRITE(INTRODUZCA EL NUMERO DE CANAL DE LA PCLAB(0 A 15): REPEAT CURSORON; PULSACANAL:=; GOTOXY(53,1); WRITE( ); PSCANAL1:=READKEY; IF PSCANAL1=#13 THEN PULSACANAL:=88 ELSE BEGIN IF PSCANAL1<>#27 {-----------------------------funcin de escape} THEN BEGIN GOTOXY(53,1); WRITE(PSCANAL1); PSCANAL2:=READKEY; IF PSCANAL2<>#27 THEN

);

112

MANUAL DEL PROGRAMADOR: Ficheros Include

BEGIN IF (PSCANAL2=#13) THEN PULSACANAL:=PSCANAL1 ELSE BEGIN GOTOXY(54,1); WRITE(PSCANAL2); MOMEN:=READKEY; PULSACANAL:=PSCANAL1+PSCANAL2; END END ELSE PULSACANAL:=#27 END ELSE PULSACANAL:=#27 END; UNTIL (PULSACANAL=0) OR (PULSACANAL=1) OR (PULSACANAL=2) OR (PULSACANAL=3) OR (PULSACANAL=4) OR (PULSACANAL=5) OR (PULSACANAL=6) OR (PULSACANAL=7) OR (PULSACANAL=8) OR (PULSACANAL=9) OR (PULSACANAL=10) OR (PULSACANAL=11) OR (PULSACANAL=12) OR (PULSACANAL=13) OR (PULSACANAL=14) OR (PULSACANAL=15) OR (PULSACANAL=#27) OR (PULSACANAL=88); CURSOROFF; IF PULSACANAL<>#27 THEN BEGIN IF PULSACANAL=88 THEN BEGIN FOR E:=0 TO 15 DO IF ASIGNUD[E]=TOCA THEN ASIGNUD[E]:=88; END ELSE BEGIN VAL(PULSACANAL,MOM,ERROR20); FOR E:=0 TO 15 DO IF ASIGNUD[E]=TOCA THEN ASIGNUD[E]:=88; IF ASIGNUD[MOM]=88 THEN ASIGNUD[MOM]:=TOCA ELSE BEGIN WRITELN(^g); RAYA_HORIZONTAL(0,77,2,WHITE); GOTOXY(1,1); TEXTCOLOR(COLOR11); WRITELN(CANAL YA ASIGNADO A LOS NUDOS SEALADOS COMO N ,ASIGNUD[MOM], >>>PULSE TECLA...); PULSACURSOR:=READKEY END END; RAYA_HORIZONTAL(0,77,2,WHITE); TEXTCOLOR(COLOR6); GOTOXY(1,1);

113

MANUAL DEL PROGRAMADOR: Ficheros Include

WRITELN( ASIGNACION DE NUDOS Y CANALES PCLAB: SELECCIONE ENTRE LOS PRESENTES NUDOS ); WINDOW(3,4,78,24) END ELSE BEGIN TEXTCOLOR(COLOR6); GOTOXY(1,1); WRITELN( ASIGNACION DE NUDOS Y CANALES PCLAB: SELECCIONE ENTRE LOS PRESENTES NUDOS ); WINDOW(3,4,78,24); RAYA_HORIZONTAL(0,77,2,WHITE); TEXTCOLOR(COLOR12); GOTOXY(1,1); WRITELN( DESEA VISUALIZAR DE NUEVO LA CONFIGURACION? (S/N) ); REPEAT PULSACURSOR:=READKEY; UNTIL PULSACURSOR IN [S,N,n,s]; IF PULSACURSOR IN [S,s] THEN BEGIN PULSACURSOR:=1; TEXTCOLOR(COLOR6); END ELSE BEGIN ERROR_DE_ASIGNACION; TEXTCOLOR(COLOR6); IF (ERROASIG=TRUE) THEN BEGIN IF FUERA=#27 THEN BEGIN PULSACURSOR:=#27; IOCONS:=#27; TEXTCOLOR(COLOR6) END ELSE BEGIN PULSACURSOR:=#251; TEXTCOLOR(COLOR6) END END ELSE BEGIN PULSACURSOR:=#27; IOCONS:=#251; TEXTCOLOR(COLOR6) END END END END; UNTIL (PULSACURSOR=#27); FIN1: END;

114

MANUAL DEL PROGRAMADOR: Ficheros Include

(**********************************************************) {presentacin de los datos antes de la conexin de la PCLAB} PROCEDURE PRE_ADQUISICION; LABEL FIN2; CONST BASE = $0200; DATOADH = BASE+5; REGCONTROL = BASE+11; REGDISPARO = BASE+12; VAR ASIGNADO : BOOLEAN; FIN_CONVERSION : BYTE; DATO_BAJO : BYTE; DATO_ALTO : BYTE; NODENUDO : BYTE; C : BYTE; D : BYTE; CT : BYTE; NOSLINEA : BYTE; RET : BYTE; CTDOR : INTEGER; BEGIN REPEAT REPEAT REPEAT WINDOW(3,2,78,24); CLRSCR; RAYA_HORIZONTAL(0,77,5,WHITE); GOTOXY(1,1); TEXTCOLOR(COLOR6); WRITELN( POR FAVOR CONECTE LOS CANALES DE LA PCLAB EN LOS LOS NUDOS SELECIONADOS ); GOTOXY(1,2); WRITELN( EN LA PLACA DEL CIRCUITO. ); GOTOXY(1,4); TEXTCOLOR(COLOR11+BLINK); WRITELN( PULSE INTRO CUANDO ESTE PREPARADO); TEXTCOLOR(COLOR6); GOTOXY(59,4); WRITE(>>>ESC. MENU PPAL.); GOTOXY(65,2); RAYA_HORIZONTAL(57,77,3,WHITE); GOTOXY(57,4); WRITE(#179); GOTOXY(57,5); WRITE(#193); GOTOXY(57,3); WRITE(#218); TEXTCOLOR(COLOR6); WRITELN;

115

MANUAL DEL PROGRAMADOR: Ficheros Include

COMODIN:=INICIAL; RET:=0; NOSLINEA:=0; NODENUDO:=0; CT:=0; ASIGNADO:=FALSE; WINDOW(8,7,78,24); REPEAT TEXTCOLOR(COLOR6); IF NOSLINEA=3 THEN BEGIN WRITELN; NOSLINEA:=0 END; IF COMODIN^.CARACTERN<>; THEN BEGIN WRITE(COMODIN^.CARACTERN); CT:=CT+1; END; COMODIN:=COMODIN^.SIG; IF COMODIN^.CARACTERN=; THEN BEGIN RET:=RET+1; IF RET=2 THEN RET:=0; NODENUDO:=NODENUDO+1; NOSLINEA:=NOSLINEA+1; RET:=RET+1; IF RET=3 THEN RET:=0; ASIGNADO:=FALSE; FOR C:=0 TO 15 DO IF NODENUDO=ASIGNUD[C] THEN BEGIN ASIGNADO:=TRUE; FOR D:=0 TO 6-CT DO WRITE( ); WRITE(:); TEXTCOLOR(COLOR7); IF ASIGNUD[C]<=9 THEN WRITE(A CANAL ,ASIGNUD[C]) ELSE WRITE(A CANAL ,ASIGNUD[C]); TEXTCOLOR(COLOR6); WRITE( ; ); END; IF ASIGNADO=FALSE THEN BEGIN FOR D:=0 TO 6-CT DO WRITE( ); WRITE(:); TEXTCOLOR(COLOR11); WRITE(SIN ASIGNAR); TEXTCOLOR(COLOR6); WRITE( ; );

116

MANUAL DEL PROGRAMADOR: Ficheros Include

END; CT:=0; END UNTIL COMODIN^.SIG=NIL; WINDOW(3,2,78,24); IOCONS:=READKEY; IF IOCONS=#27 THEN GOTO FIN2; UNTIL (IOCONS=#13); RAYA_HORIZONTAL(0,77,7,WHITE); GOTOXY(1,4); WRITE( ); GOTOXY(3,6); TEXTCOLOR(COLOR11); WRITE(ATENCION! : LOS NUDOS ESTAN CORRECTAMENTE CONECTADOS A LA PCLAB? (S/N)); TEXTCOLOR(WHITE); GOTOXY(57,3); WRITE( ); GOTOXY(57,4); WRITE( ); GOTOXY(57,5); WRITE(#196); GOTOXY(57,3); WRITE( ); REPEAT IOCONS:=READKEY; UNTIL IOCONS IN [s,S,n,N];

{rutina que detecta si la PCLAB esta o no conectada al ordenador} UNTIL ((IOCONS=S) OR (IOCONS=s)) AND (D<16); TEXTCOLOR(COLOR6); CTDOR:=0; PORT[REGCONTROL]:=1; PORT[REGDISPARO]:=0; REPEAT FIN_CONVERSION:=PORT[DATOADH]; CTDOR:=CTDOR+1; IF CTDOR>=10000 THEN FIN_CONVERSION:=$F UNTIL FIN_CONVERSION<=$F; IF CTDOR>=1000 THEN BEGIN ERROR(32759); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(25,23); TEXTCOLOR(COLOR6); WRITE(>> Pulse cualquier TECLA para repetir, ESCAPE men); IOCONS:=READKEY END ELSE IOCONS:=#251; TEXTCOLOR(COLOR6); UNTIL (IOCONS=#27) OR (IOCONS=#251);

117

MANUAL DEL PROGRAMADOR: Ficheros Include

FIN2: END; (**********************************************************) {rutina de adquisicin de datos con pclab} PROCEDURE ADQUISICION_DATOS_PCLAB;

CONST BASE = $200; REGCONT1 = BASE+1; REGCONT2 = BASE+2; CONTCONTR = BASE+3; DATOADL = BASE+4; DATOADH = BASE+5; DATODA1L = BASE+4; DATODA1H = BASE+5; DATODA2L = BASE+6; DATODA2H = BASE+7; CLEARINT = BASE+8; CANALMUX = BASE+10; REGCONTROL= BASE+11; REGDISPARO= BASE+12; TENS = 10; MAX = 2;{500;} VAR FIN_CONVERSION : BYTE; DATO_BAJO : BYTE; DATO_ALTO : BYTE; A : BYTE; I : INTEGER; J : INTEGER; MUEST : INTEGER; (********) {introduccin de los datos del muestreo en men dinmica} PROCEDURE OTRAMUESTRA(ND:INTEGER;Vmuest:REAL); BEGIN Vmuest:=TENS+(2*TENS/4095)*(Vmuest-4095); IF PRIMERO=NIL THEN BEGIN NEW(ACTUAL); ACTUAL^.Vmuestras:=Vmuest; ACTUAL^.NUMNUDO:=ND; PRIMERO:=ACTUAL; ACTUAL^.SIG:=NIL; END ELSE BEGIN ANTERIOR:=ACTUAL; NEW(ACTUAL);

118

MANUAL DEL PROGRAMADOR: Ficheros Include

ACTUAL^.Vmuestras:=Vmuest; ACTUAL^.NUMNUDO:=ND; ANTERIOR^.SIG:=ACTUAL; ACTUAL^.SIG:=NIL; END END; (********) {programacion de la frecuencia de disparo de la PCLAB (10000Hz)} PROCEDURE FRECUENCIA; VAR D1 D2 AUX : LONGINT; : LONGINT; : LONGINT;

BEGIN AUX:=2000000 DIV 10000; D1:=ROUND(SQRT(AUX)); D2:=D1; PORT[CONTCONTR]:=$74; PORT[REGCONT1]:=D1 MOD 256; PORT[REGCONT1]:=D1 DIV 256; PORT[CONTCONTR]:=$B4; PORT[REGCONT2]:=D2 MOD 256; PORT[REGCONT2]:=D2 DIV 256; END; (********) {programa principal del procedimiento adquisicin_datos_pclab} BEGIN DIBUJARCUADRO(24,10,54,13,COLOR4,WHITE); GOTOXY(25,11); TEXTCOLOR(BLINK+COLOR6); WRITELN( CAPTURANDO LOS DATOS ); GOTOXY(25,12); WRITE ( DEL CIRCUITO CON LA PCLAB ); PRIMERO:=NIL; (*-------inicializa el puntero----*) PORT[REGCONTROL]:=0; PORT[REGCONTROL]:=6; FRECUENCIA; FOR A:=0 TO 15 DO BEGIN IF ASIGNUD[A]<>88 THEN FOR I:=0 TO MAX-1 DO BEGIN PORT[CANALMUX]:=A; REPEAT FIN_CONVERSION:=PORT[DATOADH]; UNTIL FIN_CONVERSION<=$F; DATO_BAJO:=PORT[DATOADL]; DATO_ALTO:=PORT[DATOADH] MOD 16; MUEST:=DATO_ALTO*256+DATO_BAJO; OTRAMUESTRA(ASIGNUD[A],MUEST); REPEAT FIN_CONVERSION:=PORT[DATOADH]; UNTIL FIN_CONVERSION>$F; END

119

MANUAL DEL PROGRAMADOR: Ficheros Include

END; DATOS_PCLAB:=TRUE; PORT[REGCONTROL]:=0; {LEERMUESTRAS;}(**********A PROBAR EN EL LABORATORIO**********) PORT[REGCONTROL]:=0; END; (**********************************************************) {realiza la comparacin entre el fichero resultado de la simulacin} {en PSPICE y la adquisicin de datos con la PCLAB-812, comprobando } {si se ajustan los resultados a la tolerancia} PROCEDURE COMPARACION_Y_PRESENTACION_DE_RESULTADOS_FINALES; VAR PCI : BYTE; VALE : BOOLEAN; CAD1 : STRING[15]; CAD2 : STRING[15]; TIEMPOPSP1 : REAL; TIEMPOPSP2 : REAL; ERO : INTEGER; VPSef : REAL; VPSmed : REAL; VPCef : REAL; VPCmed : REAL; (********) {presentacion de los resultados finales de la comparacion} PROCEDURE PRESENTACION_RESULTADO_COMPARACION; VAR COUNT : BYTE; RANGOef : REAL; RANGOmed : REAL; CORRECTOef : BOOLEAN; CORRECTOmed : BOOLEAN; BEGIN {rutina que controla si el valor leido por la PCLAB est situado} {dentro del rango de la tolerancia} RANGOef:=VPSef*(TOLERANCIA/100); RANGOmed:=VPSmed*(TOLERANCIA/100); IF (VPCef<=VPSef+RANGOef) and (VPCef>=VPSef+VPSef) THEN CORRECTOef:=TRUE ELSE CORRECTOef:=FALSE; IF (VPCmed<=VPSmed+RANGOmed) and (VPCmed>=VPSmed+VPSmed) THEN CORRECTOmed:=TRUE ELSE CORRECTOmed:=FALSE; COUNT:=1; COMODIN:=INICIAL; WRITE( );

120

MANUAL DEL PROGRAMADOR: Ficheros Include

REPEAT IF ASIGNUD[PCI]=COUNT THEN WRITE(COMODIN^.CARACTERN); IF COMODIN^.CARACTERN=; THEN BEGIN IF (COMODIN^.CARACTERN=;) AND (ASIGNUD[PCI]=COUNT) THEN BEGIN IF PCI<9 THEN BEGIN WRITE( ASIGNADO A CANAL ,PCI, ;); IF (CORRECTOmed=TRUE) AND (CORRECTOef=TRUE) THEN BEGIN TEXTCOLOR(COLOR7); WRITE( EVALUACION CORRECTA); TEXTCOLOR(COLOR6); WRITELN; END ELSE BEGIN TEXTCOLOR(COLOR11); WRITE( PRESENTA ERRORES); TEXTCOLOR(COLOR6); WRITELN; END END ELSE BEGIN WRITE( : ASIGNADO A CANAL ,PCI); IF (CORRECTOmed=TRUE) AND (CORRECTOef=TRUE) THEN BEGIN TEXTCOLOR(COLOR7); WRITE( EVALUACION CORRECTA); TEXTCOLOR(COLOR6); WRITELN END ELSE BEGIN TEXTCOLOR(COLOR11); WRITE( PRESENTA ERRORES); TEXTCOLOR(COLOR6); WRITELN END END END; COUNT:=COUNT+1 END; COMODIN:=COMODIN^.SIG; UNTIL COMODIN=NIL END; (********)

121

MANUAL DEL PROGRAMADOR: Ficheros Include

{programa principal del procedimiento COMPARACION_Y_PRESENTACION...} BEGIN {rutina para limpiar la pantalla y prepararla para el posterior} {informe y diagnstico de los nudos} WINDOW(3,2,78,24); TEXTBACKGROUND(COLOR5); TEXTCOLOR(COLOR6); CLRSCR; WRITELN( RESUMEN Y DIAGNOSTICO DEL ESTADO DE LOS NUDOS VERIFICADOS ); RAYA_HORIZONTAL(0,77,2,WHITE); TEXTCOLOR(COLOR6); {rutina para calcular el tiempo total de anlisis en PSPICE.} {se calcula restando a XEND XBEGIN, estando ambos conte--} {nidos en la variable TIEMPO,...} {ejem.:XBEGIN=0.000E00 XEND=3.000E-02} DELETE(TIEMPO,1,8); CAD1:=COPY(TIEMPO,1,POS(,TIEMPO)-1); DELETE(TIEMPO,1,POS(=,TIEMPO)+1); CAD2:=COPY(TIEMPO,1,POS(,TIEMPO)-1); VAL(CAD1,TIEMPOPSP1,ERO); IF ERO<>0 THEN BEGIN TIEMPOPSP1:=1; TIEMPOPSP2:=2 END; VAL(CAD2,TIEMPOPSP2,ERO); IF ERO<>0 THEN BEGIN TIEMPOPSP1:=1; TIEMPOPSP2:=2 END; TIEMPOPSP1:=TIEMPOPSP2-TIEMPOPSP1; {rutina de inicializacin de las variables} VPCef:=0; VPCmed:=0; VPSef:=0; VPSmed:=0; {rutina de lectura de las tensiones leidas por la PCLAB} {e introducidas en memoria dinmica y transformacin a } {valor medio y eficaz} ACTUAL:=PRIMERO; FOR PCI:=0 TO 15 DO IF ASIGNUD[PCI]<>88 THEN BEGIN REPEAT VALE:=FALSE;

122

MANUAL DEL PROGRAMADOR: Ficheros Include

{comprueba si el n de nudo en memdin se corresponde} IF ACTUAL^.NUMNUDO=ASIGNUD[PCI] THEN BEGIN REPEAT VPCef:=VPCef+(ACTUAL^.Vmuestras*ACTUAL^.Vmuestras); VPCmed:=VPCmed+ACTUAL^.Vmuestras; ACTUAL:=ACTUAL^.SIG UNTIL (ACTUAL=NIL) OR (ACTUAL^.NUMNUDO<>ASIGNUD[PCI]); BEGIN VPCef:=SQRT(VPSef)/500; VPCmed:=VPCmed/500 END; VALE:=TRUE; {rutina de lectura de las tensiones leidas por la PCLAB} {e introducidas en memoria dinmica y transformacin a } {valor medio y eficaz} BEGIN ACTU:=PRIM; REPEAT VPSef:=VPSef+(ACTU^.TENSIONES[ASIGNUD[PCI]]*ACTU^.TENSIONES[PCI]); VPSmed:=VPSmed+ACTU^.TENSIONES[ASIGNUD[PCI]]; ACTU:=ACTU^.SIG UNTIL ACTU=NIL; VPSef:=SQRT(VPSef)/TIEMPOPSP1; VPSmed:=VPSmed/TIEMPOPSP1 END END; PRESENTACION_RESULTADO_COMPARACION; IF VALE=FALSE THEN ACTUAL:=ACTUAL^.SIG UNTIL (ACTUAL^.SIG=NIL) OR (VALE=TRUE) END; {presentacion de salida} GOTOXY(25,23); WRITELN(Pulse CUALQUIER TECLA para retornar el menu principal); IOCONS:=READKEY; {rutina de disposicion de la memoria dinmica utilizada en este} {procedimiento} ACTUAL:=PRIMERO; REPEAT ANTERIOR:=ACTUAL^.SIG; DISPOSE(ACTUAL); ACTUAL:=ANTERIOR; UNTIL ACTUAL=NIL END; (**********************************************************) {programa principal ejecuta}

123

MANUAL DEL PROGRAMADOR: Ficheros Include

BEGIN WINDOW(1,1,80,25); TEXTBACKGROUND(COLOR5); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); TEXTCOLOR(COLOR6); WINDOW(3,2,78,24); PRESENTACION_NUDOS; IF IOCONS=#27 THEN GOTO FIN; PRE_ADQUISICION; {IF IOCONS=#27 THEN GOTO FIN;} ADQUISICION_DATOS_PCLAB; COMPARACION_Y_PRESENTACION_DE_RESULTADOS_FINALES; FIN: END;

124

4.- ARCHIVOS EJECUTABLES

Los archivos ejecutables son aquellos que con extensin .EXE son llamados desde el entorno del sistema operativo, y pueden, por tanto, ejecutarse de forma independiente al programa principal.

En la realizacin del paquete de evaluacin se han utilizado tres archivos ejecutables. Dos pertenecen a llamadas de utilidad del propio programa (ESPACIO1, LOCALIZA), y uno es el archivo de instalacin del conjunto (INSTALA).

Estudiaremos estos archivos:

4.1.- ESPACIO1

4.1.1.- DESCRIPCIN DEL PROGRAMA.

El archivo aqu propuesto es un mini programa que funciona de forma parecida al comando DIR del sistema operativo, pero que ademas de presentar el listado de archivos de un directorio o subdirectorio dado, aade a la informacin el espacio ocupado por los mismos (archivos que coinciden con un especificador dado).

El procedimiento principal de este programa, se basa en las llamadas recursivas de las instrucciones del sistema FINDFIRST (buscar el primero), y FINDNEXT (buscar el siguiente), que listan el conjunto de archivos que contiene un directorio o subdirectorio, y que 125

MANUAL DEL PROGRAMADOR: Archivos ejecutables

coinciden con un especificador dado.

La informacin adicional de los archivos listados (fecha de la ltima modificacin, tamao...) se obtiene del rea de transferencia del disco (ATD).

4.1.2.- DIRECTIVAS DE COMPILACIN.

Las directivas de compilacin utilizadas son las siguientes : {A+,S+,B-,E+,N+} {$M 16384, 000000, 50000}

4.1.3.- UNIDADES UTILIZADAS.

Las unidades que se utilizan para su ejecucin por el compilador son las siguientes : CRT, DOS.

4.1.4.- VARIABLES GLOBALES.

CONST ORDENPORNOMBRE ORDENPORFECHA TYPE CADENA80 CADENA15 PTRDTA REGHORA COMPHORA

= TRUE; = FALSE;

= STRING[80]; = STRING[15]; = ^SEARCHREC; = RECORD : WORD; { formato comprimido Dos } 126

MANUAL DEL PROGRAMADOR: Archivos ejecutables

CADHORA : CADENA80; PM : BOOLEAN; HORAS,MINUTOS,SEGUNDOS,CENTESIMAS : INTEGER END; REGFECHA = RECORD FECHACOMP : WORD; CADENALARGAFECHA : CADENA80; CADENAFECHA : CADENA80; AGNO,MES,DIA : INTEGER; DIASEMANA : INTEGER END; PTRDIR = ^REGDIR; REGDIR = RECORD NOMBREFICHERO : CADENA15; ATRIB : BYTE; TAMFICHERO : LONGINT; HORA : REGHORA; FECHA : REGFECHA; ANTERIOR : PTRDIR; SIGUIENTE : PTRDIR; END;

VAR ESPACTOMADO VAARRIBA VAABAJO ACTUAL ESPECFICHERO CADTRABAJO ORDENADO ESPECORDEN ASCEN I PARAMS COLOR1 COLOR2 COLOR3

: REAL; : PTRDIR; : PTRDIR; : PTRDIR; : CADENA80; : CADENA80; : BOOLEAN; : BOOLEAN; : BOOLEAN; : INTEGER; : BYTE; : BYTE; : BYTE; : BYTE;

127

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.1.5.- VARIABLES LOCALES.

Son las utilizadas de forma individual en cada procedimiento, y/o funcin. (Ver listado general del archivo).

4.1.6.- LISTADO.

PROGRAM ESPACIO; {A+,S+,B-,E+,N+} {$M 16384, 000000, 50000} USES CRT,DOS; CONST ORDENPORNOMBRE = TRUE; ORDENPORFECHA = FALSE; TYPE CADENA80 = STRING[80]; CADENA15 = STRING[15]; PTRDTA = ^SEARCHREC; REGHORA = RECORD COMPHORA : WORD; { formato comprimido Dos } CADHORA : CADENA80; PM : BOOLEAN; HORAS,MINUTOS,SEGUNDOS,CENTESIMAS : INTEGER END; REGFECHA = RECORD FECHACOMP : WORD; CADENALARGAFECHA : CADENA80; CADENAFECHA : CADENA80; AGNO,MES,DIA : INTEGER; DIASEMANA : INTEGER END; PTRDIR = ^REGDIR; REGDIR = RECORD NOMBREFICHERO : CADENA15; ATRIB : BYTE; TAMFICHERO : LONGINT; HORA : REGHORA; FECHA : REGFECHA; ANTERIOR : PTRDIR; SIGUIENTE : PTRDIR;

128

MANUAL DEL PROGRAMADOR: Archivos ejecutables

END;

VAR PARAMS : BYTE; ESPACTOMADO : REAL; VAARRIBA : PTRDIR; VAABAJO : PTRDIR; ACTUAL : PTRDIR; ESPECFICHERO : CADENA80; CADTRABAJO : CADENA80; ORDENADO : BOOLEAN; ESPECORDEN : BOOLEAN; ASCEN : BOOLEAN; I : INTEGER; COLOR1 : BYTE; COLOR2 : BYTE; COLOR3 : BYTE; (**********************************************************) FUNCTION MODOVIDEOACTUAL : CHAR; VAR REGS : REGISTERS; BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$0F; INTR($10,REGS); CASE REGS.AL OF 1..6 : MODOVIDEOACTUAL := C; {CGA} 7 : MODOVIDEOACTUAL := M; {monocromo} 8..10 : MODOVIDEOACTUAL := P; {PCjr} 13..16 : MODOVIDEOACTUAL := E {EGA} END END; (**********************************************************) FUNCTION CALCDIASEMANA(AGNO,MES,DIA : INTEGER) : INTEGER; VAR SALVARFECHA,FECHATRABAJO : REGISTERS; NUMERODIA : INTEGER; BISIESTO : BOOLEAN; CONST DAYARRAY : ARRAY[1..12] OF INTEGER = (31,28,31,30,31,30,31,31,30,31,30,31); BEGIN

129

MANUAL DEL PROGRAMADOR: Archivos ejecutables

BISIESTO := FALSE; IF (MES = 2) AND ((AGNO MOD 4)=0) AND (DIA = 29) THEN BISIESTO := TRUE; IF (NOT BISIESTO) AND (DIA > DAYARRAY[MES]) THEN CALCDIASEMANA := -1 ELSE BEGIN FECHATRABAJO.AH := $2B; SALVARFECHA.AH := $2A; { salva la fecha en registros } MSDOS(SALVARFECHA); WITH FECHATRABAJO DO BEGIN CX := AGNO; { hace el reloj igual a la fecha introducida } DH := MES; DL := DIA; MSDOS(FECHATRABAJO); AH := $2A; { leer de nuevo la fecha para } MSDOS(FECHATRABAJO); { obtene el indicador de la sem. } NUMERODIA := AL; { en AL. } IF BISIESTO THEN { corregir para aos bisiestos } IF NUMERODIA = 0 THEN NUMERODIA := 6 ELSE NUMERODIA := PRED(NUMERODIA); CALCDIASEMANA := NUMERODIA END; SALVARFECHA.AH := $2B; { reponer la fecha actual } MSDOS(SALVARFECHA); END END; (**********************************************************) PROCEDURE CALCFECHA(VAR FECHAACTUAL : REGFECHA); TYPE CADENA9 = STRING[9]; CONST MESES : ARRAY [1..12] OF CADENA9 = (ENERO,FEBRERO,MARZO,ABRIL,MAYO,JUNIO,JULIO, AGOSTO,SEPTIEMBRE,OCTUBRE,NOVIEMBRE,DICIEMBRE); DIAS : ARRAY [0..6] OF CADENA9 = (DOMINGO,LUNES,MARTES,MIRCOLES, JUEVES,VIERNES,SBADO); VAR TEMP1 : CADENA80; BEGIN WITH FECHAACTUAL DO BEGIN DIASEMANA := CALCDIASEMANA(AGNO,MES,DIA); STR(MES,CADENAFECHA); STR(DIA,TEMP1); CADENAFECHA := CADENAFECHA + / + TEMP1; CADENALARGAFECHA := DIAS[DIASEMANA] + , ;

130

MANUAL DEL PROGRAMADOR: Archivos ejecutables

CADENALARGAFECHA := CADENALARGAFECHA + MESES[MES] + + TEMP1 + , ; STR(AGNO,TEMP1); CADENALARGAFECHA := CADENALARGAFECHA + TEMP1; CADENAFECHA := CADENAFECHA + / + COPY(TEMP1,3,2); FECHACOMP := (AGNO - 1980) * 512 + (MES * 32) + DIA END END; (**********************************************************) PROCEDURE CALCHORA(VAR HORAACTUAL : REGHORA); TYPE CADENA5 = STRING[5]; VAR TEMP1,TEMP2 : CADENA5; AMPM : CHAR; I : INTEGER; BEGIN WITH HORAACTUAL DO BEGIN I := HORAS; IF HORAS = 0 THEN I := 12; { "0" horas = 12AM } IF HORAS > 12 THEN I := HORAS - 12; IF HORAS > 11 THEN AMPM := P ELSE AMPM := A; STR(I:2,TEMP1); STR(MINUTOS,TEMP2); IF LENGTH(TEMP2) < 2 THEN TEMP2 := 0 + TEMP2; CADHORA := TEMP1 + : + TEMP2 + AMPM; COMPHORA := (HORAS SHL 11) OR (MINUTOS SHL 5) OR (SEGUNDOS SHR 1) END END; (**********************************************************) PROCEDURE DTAADIR(VAR REGSALIDA : REGDIR); VAR DATODT : DATETIME; { importado de la unidad dos } I : INTEGER; REGINT : SEARCHREC; { idem } REGCOMP : REGISTERS; { idem } DTAACTUAL : PTRDTA; BEGIN REGCOMP.AX := $2F00; { localizar posicin actual del DTA } MSDOS(REGCOMP); WITH REGCOMP DO DTAACTUAL := PTR(ES,BX); REGINT := DTAACTUAL^; UNPACKTIME(REGINT.TIME,DATODT); WITH REGSALIDA DO { extraer y reformatear los datos } BEGIN

131

MANUAL DEL PROGRAMADOR: Archivos ejecutables

NOMBREFICHERO:= REGINT.NAME; { extraer nombre de fichero } ATRIB := REGINT.ATTR; { extraer el campo de atributoS } WITH HORA DO { desarrollar la hora comprimida } BEGIN COMPHORA := REGINT.TIME SHR 16; HORAS := DATODT.HOUR; MINUTOS := DATODT.MIN; SEGUNDOS := DATODT.SEC; CENTESIMAS := 0; END; CALCHORA(HORA); { llenar los otros campos } WITH FECHA DO { desarrollar la fecha comprimida } BEGIN FECHACOMP := REGINT.TIME AND $0000FFFF; DIA := DATODT.DAY; MES := DATODT.MONTH; AGNO := DATODT.YEAR; END; CALCFECHA(FECHA); { llenar los otros campos } TAMFICHERO := REGINT.SIZE; SIGUIENTE := NIL; { inicializar el puntero "SIGUIENTE" } ANTERIOR := NIL; { inicializar el puntero "ANTERIOR" } END END; { DTAADIR } (**********************************************************) PROCEDURE TOMARDIR(ESPECFICHERO : CADENA80; ORDENADO : BOOLEAN; ORDENPORNOMBRE : BOOLEAN; VAR ASCEN : PTRDIR; VAR DESCEN : PTRDIR); TYPE CADENA9 = STRING[9]; VAR I : INTEGER; ERROR : INTEGER; REGS : REGISTERS; NUESTRODTA : SEARCHREC; RAIZ : PTRDIR; ACTUAL : PTRDIR; ULTIMO : PTRDIR; ALMAC : PTRDIR; POSICIONENC : BOOLEAN; (**********************************************************) FUNCTION DESPUESDE(ENTRADIZ,ENTRADDER : PTRDIR) : BOOLEAN; BEGIN IF ENTRADIZ^.FECHA.FECHACOMP > ENTRADDER^.FECHA.FECHACOMP THEN DESPUESDE := TRUE ELSE

132

MANUAL DEL PROGRAMADOR: Archivos ejecutables

IF (ENTRADIZ^.FECHA.FECHACOMP = ENTRADDER^.FECHA.FECHACOMP) AND (ENTRADIZ^.HORA.COMPHORA > ENTRADDER^.HORA.COMPHORA) THEN DESPUESDE := TRUE ELSE DESPUESDE := FALSE END; (**********************************************************) PROCEDURE ANADIRPORFINAL(VAR ALMAC,DESCEN : PTRDIR); BEGIN DESCEN^.SIGUIENTE := ALMAC; { aadir registro al final de la lista } DESCEN^.SIGUIENTE^.ANTERIOR := DESCEN; { inic. puntero inverso } DESCEN := DESCEN^.SIGUIENTE; { hacer REG. SIGUIENTE el ACTUAL } END; (*********************) BEGIN { TOMARDIR } FINDFIRST(ESPECFICHERO,$16,NUESTRODTA); { llamada a dos, FIND FIRST dos } ERROR := DOSERROR; IF ERROR = 2 THEN { no hay ficheros que coincidan con el espec. } BEGIN ASCEN := NIL; { los dos punteros de la lista a NIL } DESCEN := NIL END ELSE { al menos se encontr un fichero } BEGIN NEW(RAIZ); { crear un registro para el primero encontrado } DTAADIR(RAIZ^); { convertirlo a formato DIR } ACTUAL := RAIZ; { el registro ACTUAL es ahora el RAIZ } DESCEN := RAIZ; { y tambin el ltimo registro de la lista } IF ERROR <> 18 THEN REPEAT FINDNEXT(NUESTRODTA); { hacer llamada a dos: FIND NEXT } ERROR := DOSERROR; IF ERROR <> 18 THEN { existen ms entradas } BEGIN NEW(ALMAC); { crear registro con un puntero temporal } DTAADIR(ALMAC^); { convertir a formato DIR } { las listas ordenada y no ordenadas se forman de forma diferente} { si estamos formando una lista ordenada deberemos buscar en ella} { cada entrada con el fin de localizar el lugar donde ubicarla. Para} { las listas no ordenadas solamente tenemos que aadir el nuevo ele-} { mento al final de la lista y hacer que el siguiente sea el actual} IF ORDENADO THEN BEGIN ACTUAL := RAIZ; { recorrer lista para encontrar punto de inters} REPEAT IF ORDENPORNOMBRE THEN IF ACTUAL^.NOMBREFICHERO > ALMAC^.NOMBREFICHERO THEN POSICIONENC := TRUE ELSE POSICIONENC := FALSE ELSE { para ordenar lista por hora/fecha } IF DESPUESDE(ACTUAL,ALMAC) THEN

133

MANUAL DEL PROGRAMADOR: Archivos ejecutables

POSICIONENC := TRUE ELSE POSICIONENC := FALSE; IF NOT POSICIONENC THEN ACTUAL := ACTUAL^.SIGUIENTE; { pasar al siguiente } UNTIL (ACTUAL = NIL) OR POSICIONENC; { cuando se encuentra la posicin, es necesario insertar } { el registro en la lista antes de ACTUAL^-- } { esto se hace de forma diferente si ACTUALT^ est } { al final de la lista. (ACTUAL = RAIZ)} IF POSICIONENC THEN { insertar al principio... } BEGIN { ...o en medio } { NOTA: no cambiar el orden de asignacin } { de punteros en la siguiente sentencia } { IF/THEN/ELSE } IF ACTUAL = RAIZ THEN { insertar al principio } BEGIN ALMAC^.SIGUIENTE := RAIZ; ACTUAL^.ANTERIOR := ALMAC; RAIZ := ALMAC; END ELSE { insertar en medio: } BEGIN ALMAC^.SIGUIENTE := ACTUAL; ALMAC^.ANTERIOR := ACTUAL^.ANTERIOR; ACTUAL^.ANTERIOR^.SIGUIENTE := ALMAC; ACTUAL^.ANTERIOR := ALMAC END END ELSE { el nuevo registro pertenece al final de la lista } ANADIRPORFINAL(ALMAC,DESCEN) END ELSE { si no hay que ordenar aadimos al final de la lista: } ANADIRPORFINAL(ALMAC,DESCEN) END UNTIL ERROR = 18; ASCEN := RAIZ END END; {TOMARDIR} (**********************************************************) FUNCTION DIRACADENA(DIRENT : REGDIR) : STRING; CONST BLANCOS = VAR TEMP,CADTRABAJO : CADENA80; POSPUNTO : INTEGER; BEGIN WITH DIRENT DO BEGIN TEMP := ; {si la entrada tiene atributo de directorio, formato diferente: } IF (ATRIB AND $10) <> 0 THEN { el BIT 4 es el ATRIB. de direct. }

134

MANUAL DEL PROGRAMADOR: Archivos ejecutables

BEGIN INSERT(NOMBREFICHERO,TEMP,1); { no hay extens. en nombres de subdir. } INSERT(<DIR>,TEMP,14) { decirle al mundo que es un subdir. } END ELSE { esta sentencia compuesta separa el nombre del fichero y su } { extensin, y convierte el tamao en una cadena. NO se } { inserta una cifra de tamao en TEMP para los subdirectorios. } BEGIN POSPUNTO := POS(.,NOMBREFICHERO); IF POSPUNTO > 0 THEN { el nombre del fichero tiene extensin } CADTRABAJO := COPY(NOMBREFICHERO,1,POSPUNTO-1) + COPY(BLANCOS,1,9-POSPUNTO) + . + COPY(NOMBREFICHERO,POSPUNTO+1,LENGTH(NOMBREFICHERO)-POSPUNTO) ELSE CADTRABAJO := NOMBREFICHERO + COPY(BLANCOS,1,8-LENGTH(NOMBREFICHERO)); INSERT(CADTRABAJO,TEMP,1); STR(TAMFICHERO:7,CADTRABAJO); INSERT(CADTRABAJO,TEMP,15) END; WITH FECHA DO BEGIN { esta sentencia une las tres cifras independientes para } { el mes, el da, y el ao, en una cadena.} IF MES < 10 THEN INSERT(0,CADENAFECHA,1); IF DIA < 10 THEN INSERT(0,CADENAFECHA,4); INSERT(CADENAFECHA,TEMP,24); END; INSERT(HORA.CADHORA,TEMP,34); { finalmente, insertar la hora } END; DELETE(TEMP,42,LENGTH(TEMP)-42); DIRACADENA := TEMP END; (**********************************************************) PROCEDURE ELIMINARDIRECTORIO(PUNTERORAIZ : PTRDIR); VAR ALMAC : PTRDIR; BEGIN IF PUNTERORAIZ <> NIL THEN { no se puede eliminar una lista vaca } REPEAT ALMAC := PUNTERORAIZ^.SIGUIENTE; { tomar el siguiente registro. } DISPOSE(PUNTERORAIZ); { eliminar el primero... } PUNTERORAIZ := ALMAC { ...y hacer primero al siguiente... } UNTIL PUNTERORAIZ = NIL { ...hasta terminar con la lista. } END; (**********************************************************) BEGIN WINDOW(3,5,78,24); CLRSCR;

135

MANUAL DEL PROGRAMADOR: Archivos ejecutables

{vemos el modo de vdeo para tener en cuenta los colores} IF MODOVIDEOACTUAL=M THEN BEGIN COLOR1:=WHITE; COLOR2:=WHITE; COLOR3:=WHITE END ELSE BEGIN COLOR1:=YELLOW; COLOR2:=LIGHTRED; COLOR3:=LIGHTGREEN END; TEXTCOLOR(COLOR1); TEXTBACKGROUND(LIGHTBLUE); ORDENADO := FALSE; { disponer valores por defecto } ESPECORDEN := ORDENPORNOMBRE; ASCEN := TRUE; PARAMS := ORD(PARAMCOUNT); { convierte PARAMCOUNT en un valor ordinal } CASE PARAMS OF 0: BEGIN TEXTCOLOR(COLOR3); WRITELN( EVALUACION V:1.00 "EMILIO SAHUQUILLO & JULIO MARTINEZ"); TEXTCOLOR(COLOR1); WRITELN( Esta opcin presenta todos los ficheros que concuerdan con un); WRITELN( especificador dado. Los ficheros ocultos y los del sistema NO son inmunes.); TEXTCOLOR(COLOR2); WRITELN( SINTAXIS DE LLAMADA:); WRITELN( <ESPECIFICADOR DE FICHERO> N F A D); TEXTCOLOR(COLOR1); WRITELN( Donde <ESPECIFICADOR DE FICHERO> es cualquier especificador ); WRITELN( de fichero DOS legal. El segundo parmetro es N o F:); WRITELN( N indica ordenacin por NOMBRE de los ficheros; F ordenacin por FECHA.); WRITELN( Al no darse este parmetro, los ficheros se presentan en su orden fsico.); TEXTCOLOR(COLOR2); WRITELN( EL TERCER PAR METRO PUEDE SER A O D:); TEXTCOLOR(COLOR1); WRITELN( A indica un orden de presentacin ASCENDENTE; D DESCENDENTE.); WRITELN( En caso de no darse este parmetro, la presentacin se hace ASCENDENTE); TEXTCOLOR(COLOR2); WRITELN( POR EJEMPLO :); TEXTCOLOR(COLOR1); WRITELN( *.EXE N); WRITELN( Presentar TODOS los ficheros con extensin .EXE,); WRITELN( en orden ASCENDENTE segn su NOMBRE. O, ); WRITELN( *.EVA F D); WRITELN( Presentar TODOS los ficheros con extensin .EVA,); WRITELN( en orden DESCENDENTE segn su FECHA de ltima modificacin.); HALT; END; 1 : ESPECFICHERO := PARAMSTR(1); 2 : BEGIN ORDENADO := TRUE; ESPECFICHERO := PARAMSTR(1); CADTRABAJO := PARAMSTR(2);

136

MANUAL DEL PROGRAMADOR: Archivos ejecutables

CASE UPCASE(CADTRABAJO[1]) OF F : ESPECORDEN := ORDENPORFECHA; N : ESPECORDEN := ORDENPORNOMBRE; ELSE ORDENADO := FALSE END END; 3 : BEGIN ORDENADO := TRUE; ESPECFICHERO := PARAMSTR(1); CADTRABAJO := PARAMSTR(2); CASE UPCASE(CADTRABAJO[1]) OF F : ESPECORDEN := ORDENPORFECHA; N : ESPECORDEN := ORDENPORNOMBRE; ELSE ORDENADO := FALSE END; IF ORDENADO THEN BEGIN CADTRABAJO := PARAMSTR(3); CASE UPCASE(CADTRABAJO[1]) OF A : ASCEN := TRUE; D : ASCEN := FALSE; ELSE ASCEN := TRUE END END END; END; { CASE } { ahora construimos realmente la lista de entradas de directorio, } { basada en los parmetros pasados en la lnea de comandos: } TOMARDIR(ESPECFICHERO,ORDENADO,ESPECORDEN,VAARRIBA,VAABAJO); IF ASCEN THEN ACTUAL := VAARRIBA ELSE ACTUAL := VAABAJO; IF ACTUAL = NIL THEN WRITELN(NO SE ENCONTRARON FICHEROS.) ELSE BEGIN ESPACTOMADO := 0.0; IF ASCEN THEN WHILE ACTUAL <> NIL DO BEGIN WRITELN(DIRACADENA(ACTUAL^)); ESPACTOMADO := ESPACTOMADO + ACTUAL^.TAMFICHERO; ACTUAL := ACTUAL^.SIGUIENTE END ELSE WHILE ACTUAL <> NIL DO BEGIN WRITELN(DIRACADENA(ACTUAL^)); ESPACTOMADO := ESPACTOMADO + ACTUAL^.TAMFICHERO; ACTUAL := ACTUAL^.ANTERIOR END; WRITELN (El espacio total ocupado por estos ficheros es de ,ESPACTOMADO:9:0, bytes) END;

ELIMINARDIRECTORIO(ACTUAL);

137

MANUAL DEL PROGRAMADOR: Archivos ejecutables

TEXTCOLOR(WHITE); TEXTBACKGROUND(BLACK); LOWVIDEO END.

138

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.2.- LOCALIZA

4.2.1.- DESCRIPCIN DEL PROGRAMA.

LOCALIZA es el programa que ejecuta desde el entorno del sistema operativo la opcin localizar del programa principal. Este programa ejecutable busca un fichero o conjunto de ficheros que coinciden con un especificador dado, dentro de un directorio y los subdirectorios que estn incluidos dentro del primero.

El programa es ideal para encontrar la posicin de un archivo (o grupo) perdido dentro de cualquier unidad de disco.

El procedimiento principal (Buscar_directorio) es llamado de forma recursiva por si mismo tantas veces como sea necesario. Por tanto, el procedimiento se llama la primera vez por el directorio especificado por el usuario, y tantas veces como subdirectorios haya dentro del mismo. Esto hace que el primer archivo presentado sea aquel que se encuentra ms escondido, pus la ltima llamada que es cerrada por el procedimiento es la primera que se efectu, y que coincide con el directorio principal nombrado por el usuario (y que contiene los dems subdirectorios sobre los que buscar).

La informacin adicional de los archivos encontrados (tamao, fecha de la ltima modificacin...) se consigue creando un rea de transferencia de disco (ATD), por cada archivo encontrado.

139

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.2.2.- DIRECTIVAS DE COMPILACIN.

Las directivas utilizadas son las siguientes :

{A+,S+,B-,E+,N+} {$M 16384, 000000, 50000}

4.2.3.- UNIDADES UTILIZADAS.

Las unidades que utiliza son las siguientes : CRT, DOS.

4.2.4.- VARIABLES GLOBALES.

TYPE CADENA80 CADENA15

= STRING[80]; = STRING[15];

REGHORA = RECORD COMPHORA : WORD; { formato comprimido DOS } CADHORA : CADENA80; PM : BOOLEAN; HORAS,MINUTOS,SEGUNDOS,CENTESIMAS : INTEGER END; REGFECHA = RECORD FECHACOMP : WORD; CADENALARGAFECHA : CADENA80; CADENAFECHA : CADENA80; AGNO,MES,DIA : INTEGER; DIASEMANA : INTEGER END; PTRDIR = ^REGDIR; 140

MANUAL DEL PROGRAMADOR: Archivos ejecutables

REGDIR = RECORD NOMBREFICHERO : CADENA15; ATRIB : BYTE; TAMFICHERO : LONGINT; HORA : REGHORA; FECHA : REGFECHA; ANTERIOR : PTRDIR; SIGUIENTE : PTRDIR; END; PTRDTA = ^SEARCHREC;

VAR I,J ESPECBUSQUEDA DIRECTORIOINIC BUFFERBUSQ COLOR1 COLOR2 COLOR3

: INTEGER; : CADENA80; : CADENA80; : SEARCHREC; : BYTE; : BYTE; : BYTE;

4.2.5.- VARIABLES LOCALES.

Son las que se corresponden a su utilizacin a cada procedimiento y/o funcin, y son declaras en cada uno de ellos. (Ver listado).

4.2.6.- LISTADO.

PROGRAM LOCALIZA; {A+,S+,B-,E+,N+} {$M 16384, 000000, 50000} USES CRT,DOS; TYPE CADENA80 = STRING[80]; CADENA15 = STRING[15];

141

MANUAL DEL PROGRAMADOR: Archivos ejecutables

REGHORA = RECORD COMPHORA : WORD; { formato comprimido DOS } CADHORA : CADENA80; PM : BOOLEAN; HORAS,MINUTOS,SEGUNDOS,CENTESIMAS : INTEGER END; REGFECHA = RECORD FECHACOMP : WORD; CADENALARGAFECHA : CADENA80; CADENAFECHA : CADENA80; AGNO,MES,DIA : INTEGER; DIASEMANA : INTEGER END; PTRDIR = ^REGDIR; REGDIR = RECORD NOMBREFICHERO : CADENA15; ATRIB : BYTE; TAMFICHERO : LONGINT; HORA : REGHORA; FECHA : REGFECHA; ANTERIOR : PTRDIR; SIGUIENTE : PTRDIR; END; PTRDTA = ^SEARCHREC;

VAR I,J : INTEGER; ESPECBUSQUEDA : CADENA80; DIRECTORIOINIC : CADENA80; BUFFERBUSQ : SEARCHREC; COLOR1 : BYTE; COLOR2 : BYTE; COLOR3 : BYTE; (**********************************************************) FUNCTION MODOVIDEOACTUAL : CHAR; VAR REGS : REGISTERS; BEGIN FILLCHAR(REGS,SIZEOF(REGS),0); REGS.AH:=$0F; INTR($10,REGS); CASE REGS.AL OF 1..6 : MODOVIDEOACTUAL := C; {CGA} 7 : MODOVIDEOACTUAL := M; {monocromo} 8..10 : MODOVIDEOACTUAL := P; {PCjr} 13..16 : MODOVIDEOACTUAL := E {EGA}

142

MANUAL DEL PROGRAMADOR: Archivos ejecutables

END END; (**********************************************************) FUNCTION CALCDIASEMANA(AGNO,MES,DIA : INTEGER) : INTEGER;

VAR SALVARFECHA,FECHATRABAJO : REGISTERS; NUMERODIA : INTEGER; BISIESTO : BOOLEAN; CONST DAYARRAY : ARRAY[1..12] OF INTEGER = (31,28,31,30,31,30,31,31,30,31,30,31); BEGIN BISIESTO := FALSE; IF (MES = 2) AND ((AGNO MOD 4)=0) AND (DIA = 29) THEN BISIESTO := TRUE; IF (NOT BISIESTO) AND (DIA > DAYARRAY[MES]) THEN CALCDIASEMANA := -1 ELSE BEGIN FECHATRABAJO.AH := $2B; SALVARFECHA.AH := $2A; { Salva la fecha en registros } MSDOS(SALVARFECHA); WITH FECHATRABAJO DO BEGIN CX := AGNO; { Hace el reloj igual a la fecha introducida } DH := MES; DL := DIA; MSDOS(FECHATRABAJO); AH := $2A; { Leer de nuevo la fecha para } MSDOS(FECHATRABAJO); { obtener el indicador de da de la sem. } NUMERODIA := AL; { en AL. } IF BISIESTO THEN { Corregir para aos bisiesto } IF NUMERODIA = 0 THEN NUMERODIA := 6 ELSE NUMERODIA := PRED(NUMERODIA); CALCDIASEMANA := NUMERODIA END; SALVARFECHA.AH := $2B; { Reponer la fecha actual } MSDOS(SALVARFECHA); END END; (**********************************************************) PROCEDURE CALCFECHA(VAR FECHAACTUAL : REGFECHA); TYPE CADENA9 = STRING[9];

143

MANUAL DEL PROGRAMADOR: Archivos ejecutables

CONST MESES : ARRAY [1..12] OF CADENA9 = (Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio, Agosto,Septiembre,Octubre,Noviembre,Diciembre); DIAS : ARRAY [0..6] OF CADENA9 = (Domingo,Lunes,Martes,Mircoles, Jueves,Viernes,Sbado); VAR TEMP1 : CADENA80; BEGIN WITH FECHAACTUAL DO BEGIN DIASEMANA := CALCDIASEMANA(AGNO,MES,DIA); STR(MES,CADENAFECHA); STR(DIA,TEMP1); CADENAFECHA := CADENAFECHA + / + TEMP1; CADENALARGAFECHA := DIAS[DIASEMANA] + , ; CADENALARGAFECHA := CADENALARGAFECHA + MESES[MES] + + TEMP1 + , ; STR(AGNO,TEMP1); CADENALARGAFECHA := CADENALARGAFECHA + TEMP1; CADENAFECHA := CADENAFECHA + / + COPY(TEMP1,3,2); FECHACOMP := (AGNO - 1980) * 512 + (MES * 32) + DIA END END; (**********************************************************) PROCEDURE CALCHORA(VAR HORAACTUAL : REGHORA); TYPE CADENA5 = STRING[5]; VAR TEMP1,TEMP2 : CADENA5; AMPM : CHAR; I : INTEGER; BEGIN WITH HORAACTUAL DO BEGIN I := HORAS; IF HORAS = 0 THEN I := 12; { "0" horas = 12am } IF HORAS > 12 THEN I := HORAS - 12; IF HORAS > 11 THEN AMPM := p ELSE AMPM := a; STR(I:2,TEMP1); STR(MINUTOS,TEMP2); IF LENGTH(TEMP2) < 2 THEN TEMP2 := 0 + TEMP2; CADHORA := TEMP1 + : + TEMP2 + AMPM; COMPHORA := (HORAS SHL 11) OR (MINUTOS SHL 5) OR (SEGUNDOS SHR 1) END END;

144

MANUAL DEL PROGRAMADOR: Archivos ejecutables

(**********************************************************) FUNCTION DIRACADENA(DIRENT : REGDIR) : STRING; CONST BLANCOS= VAR TEMP,CADTRABAJO : CADENA80; POSPUNTO : INTEGER; BEGIN WITH DIRENT DO BEGIN TEMP := ; {Si la entrada tiene atributo de directorio, formato diferente: } IF (ATRIB AND $10) <> 0 THEN { el bit 4 es el atrib. de direct. } BEGIN INSERT(NOMBREFICHERO,TEMP,1); { No hay extens. en nombres de subdir. } INSERT(<DIR>,TEMP,14) { Decirle al mundo qu es un subdir. } END ELSE { Esta sentencia compuesta separa el nombre del fichero y su } { extensin, y convierte el tamao en una cadena. No se } { inserta una cifra de tamao en Temp para los subdirectorios. } BEGIN POSPUNTO := POS(.,NOMBREFICHERO); IF POSPUNTO > 0 THEN { El nombre del fichero tiene extensin } CADTRABAJO := COPY(NOMBREFICHERO,1,POSPUNTO-1) + COPY(BLANCOS,1,9-POSPUNTO) + . + COPY(NOMBREFICHERO,POSPUNTO+1,LENGTH(NOMBREFICHERO)-POSPUNTO) ELSE CADTRABAJO := NOMBREFICHERO + COPY(BLANCOS,1,8-LENGTH(NOMBREFICHERO)) + .; INSERT(CADTRABAJO,TEMP,1); STR(TAMFICHERO:7,CADTRABAJO); INSERT(CADTRABAJO,TEMP,15) END; WITH FECHA DO BEGIN { Esta sentencia une las tres cifras independientes para } { el mes, el dia, y el ao, en una cadena.} IF MES < 10 THEN INSERT(0,CADENAFECHA,1); IF DIA < 10 THEN INSERT(0,CADENAFECHA,4); INSERT(CADENAFECHA,TEMP,24); END; INSERT(HORA.CADHORA,TEMP,34); { Finalmente, insertar la hora } END; DELETE(TEMP,42,LENGTH(TEMP)-42); DIRACADENA := TEMP END; (**********************************************************) PROCEDURE DTAADIR(VAR REGSALIDA : REGDIR);

145

MANUAL DEL PROGRAMADOR: Archivos ejecutables

VAR DATODT : DATETIME; { Importado de la unidad DOS } I : INTEGER; REGINT : SEARCHREC; { Idem } REGCOMP : REGISTERS; { Idem } DTAACTUAL : PTRDTA; BEGIN REGCOMP.AX := $2F00; { Localizar posicin actual del DTA } MSDOS(REGCOMP); WITH REGCOMP DO DTAACTUAL := PTR(ES,BX); REGINT := DTAACTUAL^; UNPACKTIME(REGINT.TIME,DATODT); WITH REGSALIDA DO { Extraer y reformatear los datos } BEGIN NOMBREFICHERO:= REGINT.NAME; { Extraer nombre de fichero } ATRIB := REGINT.ATTR; { Extraer el campo de atributos } WITH HORA DO { Desarrollar la hora comprimida } BEGIN COMPHORA := REGINT.TIME SHR 16; HORAS := DATODT.HOUR; MINUTOS := DATODT.MIN; SEGUNDOS := DATODT.SEC; CENTESIMAS := 0; END; CALCHORA(HORA); { Llenar los otros campos } WITH FECHA DO { Desarrollar la fecha comprimida } BEGIN FECHACOMP := REGINT.TIME AND $0000FFFF; DIA := DATODT.DAY; MES := DATODT.MONTH; AGNO := DATODT.YEAR; END; CALCFECHA(FECHA); { Llenar los otros campos } TAMFICHERO := REGINT.SIZE; SIGUIENTE := NIL; { Inicializar el puntero "siguiente" } ANTERIOR := NIL { Inicializar el puntero "anterior" } END END; { DTAADIR } (**********************************************************) PROCEDURE BUSCARDIRECTORIO(DIRECTORIO,ESPECBUSQUEDA : STRING); VAR SIGUIENTEDIRECTORIO : STRING; DIRECTORIOTEMP : STRING; DTAACTUAL : SEARCHREC; DIRACTUAL : REGDIR; REGS : REGISTERS;

{>>>>PresenDatos<<<<} { Presenta los datos del fichero y la va de acceso completa }

146

MANUAL DEL PROGRAMADOR: Archivos ejecutables

(*********************) PROCEDURE PRESENDATOS(DIRECTORIO : STRING; DIRACTUAL : REGDIR); VAR TEMP : STRING; BEGIN TEMP := DIRACADENA(DIRACTUAL); DELETE(TEMP,1,13); WRITE(TEMP,DIRECTORIO); IF DIRECTORIO <> \ THEN WRITE(\); WRITELN(DIRACTUAL.NOMBREFICHERO) END;

BEGIN { En primer lugar buscamos subdirectorios. Si se encuentra alguno, } { hacemos una llamada recursiva para buscar en l tambin. } { Suprimir barras innecesarias si buscamos la raz: } IF DIRECTORIO = \ THEN DIRECTORIOTEMP := DIRECTORIO + *.* ELSE DIRECTORIOTEMP := DIRECTORIO + \*.*; { Hacer la llamada a FIND FIRST para los directorios: } FINDFIRST(DIRECTORIOTEMP,$10,DTAACTUAL);

{ Aqu hay un pequeo truco. Si tenemos alguna indicacin de que } { hay al menos un subdirectorio ms adentro del directorio actual, } { (no aparecen los cdigos de error 2 18) debemos buscar en l } { haciendo una llamada recursiva a BuscarDirectorio. Continuamos } { con esta estrategia hasta que ya no queden ms subdirectorios } { por explorar. } WHILE (DOSERROR <> 2) AND (DOSERROR <> 18) DO BEGIN IF ((DTAACTUAL.ATTR AND $10) = $10) { Si es un directorio } AND (DTAACTUAL.NAME[1] <> .) THEN { y no . o .. } BEGIN { Aadimos una barra para separar las secciones de la va } { de acceso si no estamos buscando en el directorio raz: } IF DIRECTORIO <> \ THEN SIGUIENTEDIRECTORIO := DIRECTORIO + \ ELSE SIGUIENTEDIRECTORIO := DIRECTORIO; { Se comienza con el nombre del directorio actual, y se } { copia el nombre del directorio encotrado desde el DTA } { al final de la cadena del directorio actual. Luego se } { pasa la nueva va de acceso a la siguiente llamada } { recursiva a BuscarDirectorio. } SIGUIENTEDIRECTORIO := SIGUIENTEDIRECTORIO + DTAACTUAL.NAME;

147

MANUAL DEL PROGRAMADOR: Archivos ejecutables

{ El procedimiento se llama a s mismo. } BUSCARDIRECTORIO(SIGUIENTEDIRECTORIO,ESPECBUSQUEDA) END; FINDNEXT(DTAACTUAL) { Buscamos ms... } END; { { { { Ahora podemos buscar ficheros, una vez que hemos acabado con } los directorios. Esto es conceptualmente simple, ya que no } involucra recursividad. Combinamos la va acceso y el especi- } ficador en una sola cadena y hacemos la llamada a FIND FIRST: }

{ Suprimir barras innecesarias para buscar en el directorio raz: } IF DIRECTORIO <> \ THEN DIRECTORIOTEMP := DIRECTORIO + \ + ESPECBUSQUEDA ELSE DIRECTORIOTEMP := DIRECTORIO + ESPECBUSQUEDA; { Hacer la llamada a FIND FIRST: } FINDFIRST(DIRECTORIOTEMP,$07,DTAACTUAL); IF DOSERROR = 3 THEN { va de acceso errnea } WRITELN(va de acceso no encontrada; compruebe los datos.) { Si encontramos en el directorio actual algo que coincida con el espe- } { cificador, se aade con el formato adecuado a una cadena y se presenta } ELSE IF (DOSERROR = 2) OR (DOSERROR = 18) THEN { Cadena nula: directorio vacio } ELSE BEGIN DTAADIR(DIRACTUAL); { Convertir a formato DIR.. } PRESENDATOS(DIRECTORIO,DIRACTUAL); { Presentar informacin } IF DOSERROR <> 18 THEN { Existen ms ficheros... } REPEAT FINDNEXT(DTAACTUAL); IF DOSERROR <> 18 THEN { Existen ms entradas } BEGIN DTAADIR(DIRACTUAL); { Convertir a formato DIR } PRESENDATOS(DIRECTORIO,DIRACTUAL) { Presentar informacin } END UNTIL (DOSERROR = 18) OR (DOSERROR = 2) { No hay ms ficheros } END END; (**********************************************************) BEGIN WINDOW(3,5,78,24); CLRSCR; {vemos el modo de vdeo para tener en cuenta los colores} IF MODOVIDEOACTUAL=M THEN BEGIN COLOR1:=WHITE; COLOR2:=WHITE; COLOR3:=WHITE END

148

MANUAL DEL PROGRAMADOR: Archivos ejecutables

ELSE BEGIN COLOR1:=YELLOW; COLOR2:=LIGHTRED; COLOR3:=LIGHTGREEN END; TEXTBACKGROUND(LIGHTBLUE); TEXTCOLOR(COLOR1); IF PARAMCOUNT = 0 THEN BEGIN TEXTCOLOR(COLOR3); WRITELN( EVALUACION V:1.00 "EMILIO SAHUQUILLO & JULIO MARTINEZ"); TEXTCOLOR(COLOR1); WRITELN; WRITELN( Esta opcin busca en el disco de trabajo todos los ); WRITELN( ficheros que concuerdan con un determinado especificador,); WRITELN( examinando todos los subidirectorios necesarios.); WRITELN( Dado slo el especificador, se presentar la va ); WRITELN( de acceso completa de cualquier fichero que se considere); WRITELN( adecuado.); TEXTCOLOR(COLOR2); WRITELN( SINTAXIS DE LLAMADA:); WRITELN( <especificador de fichero>); TEXTCOLOR(COLOR1); WRITELN; TEXTCOLOR(COLOR2); WRITELN( Por ejemplo : ); TEXTCOLOR(COLOR1); WRITELN( para encontrar todos los ficheros de texto ); WRITELN( (que terminan en .TXT) deberemos introducir:); WRITELN; WRITELN( *.TXT); WRITELN; WRITELN( y se mostrar la va de acceso completa de ); WRITELN( cualquier fichero con la extensin .TXT.) END ELSE BEGIN WRITELN; ESPECBUSQUEDA := PARAMSTR(1); { Si no se da especificador se buscar en todo el disco: } IF POS(\,ESPECBUSQUEDA) = 0 THEN BUSCARDIRECTORIO(\,ESPECBUSQUEDA) ELSE BEGIN { Se separa el especificador de la va de acceso: } I := LENGTH(ESPECBUSQUEDA); WHILE ESPECBUSQUEDA[I] <> \ DO I := PRED(I); DIRECTORIOINIC := COPY(ESPECBUSQUEDA,1,I-1); DELETE(ESPECBUSQUEDA,1,I); BUSCARDIRECTORIO(DIRECTORIOINIC,ESPECBUSQUEDA) END END; TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE);

149

MANUAL DEL PROGRAMADOR: Archivos ejecutables

LOWVIDEO END.

150

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.3.- INSTALA

4.3.1.- DESCRIPCIN DEL PROGRAMA.

El programa instala es aquel que se encarga de realizar la instalacin del conjunto de evaluacin, informando al usuario de los posibles errores, y demandando decisin cuando sea necesario.

El procedimiento principal del programa de instalacin (Copiar) es aquel que lee de un archivo fuente escribiendo en un archivo origen. nicamente debemos tener la precaucin de que tanto la lectura como la escritura la realizamos sobre el buffer del ordenador, y sobre archivos sin tipo, utilizando instrucciones estndar a tal efecto.

4.3.2.- DIRECTIVAS DE COMPILACIN.

Las directivas empleadas son las siguientes : {A+,S+,B-,E+,N+} {$M 16384, 000000, 50000}

Adems se ha recurrido a la directiva de compilacin que desactiva el cdigo de error producido en las sentencias que convenan, tratando los mismos de forma adecuada. Directiva {$I-} y {$I+} que desactiva y activa respectivamente dicho cdigo de error anterior.

151

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.3.3.- UNIDADES UTILIZADAS.

Se han utilizado las unidades siguientes : CRT, ERR.

4.3.4.- VARIABLES GLOBALES.

LABEL 1,4; CONST VERERROR ERRORNORMAL ERRORCLAVE REPITE VAR RECIBE GRABA ERRORINS REGISTROSLEIDOS CURSORPANX CURSORPANY CURSORX CURSORY COLOR1 COLOR2 COLOR3 COLOR4 COLOR5 COLOR6 COLOR7 COLOR8 TECLA ORIGEN ORIGEN1 DESTINO DESTINO1 ARCHIVO BUFFER PUNTEROPANTALLA

: : : :

BOOLEAN=FALSE; BOOLEAN=FALSE; BOOLEAN=FALSE; BOOLEAN=FALSE;

: FILE; : FILE; : INTEGER; : INTEGER; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : CHAR; : STRING[255]; : STRING[255]; : STRING[255]; : STRING[255]; : STRING[20]; : ARRAY [1..1000] OF BYTE; : POINTER;

152

MANUAL DEL PROGRAMADOR: Archivos ejecutables

4.3.5.- VARIABLES LOCALES.

Son las variables declaradas en los procedimientos y/o funciones correspondientes, limitndose su uso a dicho procedimiento y/o funcin. (Ver listado).

4.3.6.- LISTADO.

PROGRAM INSTALAR; {A+,S+,B-,E+,N+} {$M 16384, 000000, 50000} USES CRT,ERR; LABEL 1,4; CONST VERERROR : BOOLEAN=FALSE; ERRORNORMAL : BOOLEAN=FALSE; ERRORCLAVE : BOOLEAN=FALSE; REPITE : BOOLEAN=FALSE; VAR RECIBE : FILE; GRABA : FILE; ERRORINS : INTEGER; REGISTROSLEIDOS : INTEGER; CURSORPANX : BYTE; CURSORPANY : BYTE; CURSORX : BYTE; CURSORY : BYTE; COLOR1 : BYTE; COLOR2 : BYTE; COLOR3 : BYTE; COLOR4 : BYTE; COLOR5 : BYTE; COLOR6 : BYTE; COLOR7 : BYTE; COLOR8 : BYTE; TECLA : CHAR; ORIGEN : STRING[255]; ORIGEN1 : STRING[255]; DESTINO : STRING[255]; DESTINO1 : STRING[255]; ARCHIVO : STRING[20]; BUFFER : ARRAY [1..1000] OF BYTE;

153

MANUAL DEL PROGRAMADOR: Archivos ejecutables

PUNTEROPANTALLA : POINTER; (**********************************************************) PROCEDURE HACERFONDO; VAR A,B:BYTE; BEGIN TEXTBACKGROUND(COLOR2); TEXTCOLOR(COLOR1); CURSOROFF; BEGIN FOR A:=1 TO 80 DO FOR B:=1 TO 25 DO BEGIN GOTOXY(A,B); WRITE(#176) END END END; (**********************************************************) PROCEDURE REHACERTROZODEFONDO; VAR C,D:BYTE; BEGIN TEXTBACKGROUND(COLOR2); TEXTCOLOR(COLOR1); CURSOROFF; BEGIN FOR C:=5 TO 75 DO FOR D:=16 TO 20 DO BEGIN GOTOXY(C,D); WRITE(#176); END END END; (**********************************************************) PROCEDURE COLORES; BEGIN IF MODOVIDEOACTUAL=M THEN BEGIN COLOR1:=BLACK; COLOR2:=BLACK; COLOR3:=WHITE; COLOR4:=BLACK; COLOR5:=BLACK;

154

MANUAL DEL PROGRAMADOR: Archivos ejecutables

COLOR6:=WHITE; COLOR7:=BLACK; COLOR8:=WHITE END ELSE BEGIN COLOR1:=LIGHTBLUE; COLOR2:=WHITE; COLOR3:=RED; COLOR4:=GREEN; COLOR5:=RED; COLOR6:=YELLOW; COLOR7:=BLUE; COLOR8:=LIGHTRED END END; (**********************************************************) {$F+} PROCEDURE ABANDONAR; BEGIN TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE); TEXTMODE(LASTMODE); CLRSCR; CURSORON; CARGARPANTALLA(PUNTEROPANTALLA); GOTOXY(CURSORPANX,CURSORPANY); LOWVIDEO END; {$F-} (**********************************************************) PROCEDURE COPIAR; LABEL 2,3,EMPEZAR; BEGIN EMPEZAR : CURSORX:=WHEREX; CURSORY:=WHEREY; ASSIGN(RECIBE,ORIGEN1); {$I-} RESET(RECIBE,1) {$I+}; ERRORINS:=IORESULT; IF ERRORINS=2 THEN BEGIN VERERROR:=TRUE; WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE);

155

MANUAL DEL PROGRAMADOR: Archivos ejecutables

WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ); GOTOXY(2,25); WRITE( INTRODUZCA DISCO CON ,ARCHIVO, Y PULSE ESCAPE=IGNORAR); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); WRITELN(NO instalado!); TEXTCOLOR(WHITE); GOTO 3 END; IF TECLA<>#27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); GOTO EMPEZAR END END;

CUALQUIER

TECLA.

);

);

IF (ERRORINS<>0) AND (ERRORINS=2) THEN BEGIN VERERROR:=TRUE; WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ESCAPE=ABORTAR INSTALACION pulsa CUALQUIER TECLA para continuar ); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN HALT; IF TECLA <> #27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); WRITELN(NO instalado!);

);

156

MANUAL DEL PROGRAMADOR: Archivos ejecutables

TEXTCOLOR(WHITE); GOTO 3 END END;

ASSIGN(GRABA,DESTINO1); REWRITE(GRABA,1); {$I-} BLOCKREAD(RECIBE,BUFFER,SIZEOF(BUFFER),REGISTROSLEIDOS) {$I+}; ERRORINS:=IORESULT; IF ERRORINS<>0 THEN BEGIN VERERROR:=TRUE; WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ESCAPE=ABORTAR INSTALACION pulsa CUALQUIER TECLA para continuar ); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN HALT; IF TECLA <> #27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION ); REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); WRITELN(NO instalado correctamente); TEXTCOLOR(WHITE); GOTO 3 END END; WHILE REGISTROSLEIDOS > 0 DO BEGIN {$I-} BLOCKWRITE(GRABA,BUFFER,REGISTROSLEIDOS) {$I+}; ERRORINS:=IORESULT; IF ERRORINS<>0 THEN BEGIN VERERROR:=TRUE; WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ESCAPE=ABORTAR INSTALACION pulsa CUALQUIER TECLA para continuar ); DESCARGARTECLADO; TECLA:=READKEY;

157

MANUAL DEL PROGRAMADOR: Archivos ejecutables

IF TECLA=#27 THEN HALT; IF TECLA <> #27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION ); REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); WRITELN(NO instalado correctamente); TEXTCOLOR(WHITE); GOTO 2 END END; {$I-} BLOCKREAD(RECIBE,BUFFER,SIZEOF(BUFFER),REGISTROSLEIDOS) {$I+}; ERRORINS:=IORESULT; IF ERRORINS<>0 THEN BEGIN VERERROR:=TRUE; WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ESCAPE=ABORTAR INSTALACION pulsa CUALQUIER TECLA para continuar ); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN HALT; IF TECLA <> #27 THEN BEGIN GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION REHACERTROZODEFONDO; WINDOW(21,7,60,14); TEXTBACKGROUND(COLOR1); TEXTCOLOR(COLOR8); GOTOXY(CURSORX,CURSORY); WRITELN(NO instalado correctamente); TEXTCOLOR(WHITE); GOTO 2 END END END; 2: {$I-} CLOSE(RECIBE) {$I+}; ERRORINS:=IORESULT; IF ERRORINS<>0 THEN BEGIN END; {$I-} CLOSE(GRABA) {$I+}; ERRORINS:=IORESULT; IF ERRORINS<>0 THEN BEGIN END; 3: END;

);

158

MANUAL DEL PROGRAMADOR: Archivos ejecutables

(**********************************************************) BEGIN CURSORPANX:=WHEREX; CURSORPANY:=WHEREY; SALVARPANTALLA(PUNTEROPANTALLA); EXITPROC:=@ABANDONAR; COLORES; TEXTMODE(C80); 1: HACERFONDO; VERERROR:=FALSE; ERRORNORMAL:=FALSE; ERRORCLAVE:=FALSE; REPITE:=FALSE; DIBUJARCUADRO(25,6,55,8,COLOR3,COLOR4); GOTOXY(26,7); WRITELN( PROGRAMA DE INSTALACION ); DIBUJARCUADRO(20,10,60,20,COLOR6,COLOR5); WINDOW(21,11,60,19); WRITELN( ); WRITELN( EVALUACION VERSION 1.00 ); WRITELN( ); WRITELN( JULIO MARTINEZ JUAN ); WRITELN( & ); WRITELN( EMILIO SAHUQUILLO DOBON ); WRITELN( ); WRITELN( Valencia a 30 de Abril de 1993 ); WRITE( ); WINDOW(1,1,80,25); GOTOXY(2,25); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WRITE( ESCAPE=SALIR >>> PULSE CUALQUIER TECLA PARA CONTINUAR ); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN HALT; HACERFONDO; TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); GOTOXY(2,25); WRITE( ESCAPE=SALIR DIBUJARCUADRO(20,5,61,15,WHITE,COLOR7); WINDOW(21,6,60,14); REPEAT CLRSCR; IF REPITE=TRUE THEN BEGIN CURSOROFF; WRITE( INTRODUZCA SOLO "A:" "B:"); SOUND(1000); DELAY(100); SOUND(800); DELAY(80); NOSOUND;

);

159

MANUAL DEL PROGRAMADOR: Archivos ejecutables

DELAY(4000); CURSORON END; WRITELN( ); WRITE(INTRODUZCA UNIDAD ORIGEN CON EL CONJUNTO); WRITE( EVALUACION 1.00 ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); GOTOXY(1,3); CURSORON; DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN BEGIN WINDOW(1,1,80,25); GOTO 1 END; IF TECLA IN [#0..#32] THEN TECLA:=#0; WRITE(TECLA); READLN(ORIGEN); IF TECLA<>#0 THEN ORIGEN:=TECLA+ORIGEN; IF ORIGEN[LENGTH(ORIGEN)]=\ THEN DELETE(ORIGEN,LENGTH(ORIGEN),1); REPITE:=TRUE; UNTIL (ORIGEN=A:) OR (ORIGEN=a:) OR (ORIGEN=B:) OR (ORIGEN=b:); REPEAT WINDOW(21,6,60,14); CLRSCR; WRITELN( ); WRITE( INTRODUZCA UNIDAD Y SUBDIRECTORIO ); WRITE( DESTINO ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); GOTOXY(1,3); CURSORON; DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN BEGIN WINDOW(1,1,80,25); GOTO 1 END; IF TECLA IN [#0..#32] THEN TECLA:=#0; WRITE(TECLA); READLN(DESTINO); IF TECLA<>#0 THEN DESTINO:=TECLA+DESTINO; IF DESTINO[LENGTH(DESTINO)]=\ THEN DELETE(DESTINO,LENGTH(DESTINO),1); CLRSCR; TEXTCOLOR(WHITE+BLINK); WRITE( REALIZANDO INSTALACION ! );

160

MANUAL DEL PROGRAMADOR: Archivos ejecutables

{$I-} MKDIR(DESTINO) {$I+}; ERRORINS:=IORESULT; IF NOT (ERRORINS IN [0,5]) THEN BEGIN WINDOW(1,5,80,25); CURSOROFF; ERROR(ERRORINS); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WINDOW(1,1,80,25); GOTOXY(2,25); WRITE( ESCAPE=SALIR pulsa CUALQUIER TECLA para repetir ); DESCARGARTECLADO; TECLA:=READKEY; IF TECLA=#27 THEN BEGIN WINDOW(1,1,80,25); GOTO 1 END; HACERFONDO; DIBUJARCUADRO(20,5,61,15,WHITE,COLOR7); GOTOXY(2,25); TEXTBACKGROUND(COLOR1); TEXTCOLOR(WHITE); WRITE( ESCAPE=SALIR ) END UNTIL (ERRORINS=0) OR (ERRORINS=5); {comenzamos la instalacin} WINDOW(1,1,80,25); TEXTCOLOR(WHITE); GOTOXY(2,25); WRITE( Ctr-INTER=ABORTAR INSTALACION WINDOW(21,7,60,14); CURSORON; ORIGEN1:=ORIGEN+\LOCALIZA.EXE; DESTINO1:=DESTINO+\LOCALIZA.EXE; TEXTCOLOR(WHITE); WRITELN(LOCALIZA.EXE); ARCHIVO:=LOCALIZA.EXE; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ESPACIO1.EXE; DESTINO1:=DESTINO+\ESPACIO1.EXE; TEXTCOLOR(WHITE); WRITELN(ESPACIO1.EXE); ARCHIVO:=ESPACIO1.EXE; COPIAR; IF VERERROR=TRUE THEN BEGIN

);

161

MANUAL DEL PROGRAMADOR: Archivos ejecutables

ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\EVAL.EXE; DESTINO1:=DESTINO+\EVAL.EXE; TEXTCOLOR(WHITE); WRITELN(EVAL.EXE); ARCHIVO:=EVAL.EXE; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORCLAVE:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ATT.BGI; DESTINO1:=DESTINO+\ATT.BGI; TEXTCOLOR(WHITE); WRITELN(ATT.BGI); ARCHIVO:=ATT.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\CGA.BGI; DESTINO1:=DESTINO+\CGA.BGI; TEXTCOLOR(WHITE); WRITELN(CGA.BGI); ARCHIVO:=CGA.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\EGAVGA.BGI; DESTINO1:=DESTINO+\EGAVGA.BGI; TEXTCOLOR(WHITE); WRITELN(EGAVGA.BGI); ARCHIVO:=EGAVGA.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\HERC.BGI; DESTINO1:=DESTINO+\HERC.BGI; TEXTCOLOR(WHITE);

162

MANUAL DEL PROGRAMADOR: Archivos ejecutables

WRITELN(HERC.BGI); ARCHIVO:=HERC.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\IBM8514.BGI; DESTINO1:=DESTINO+\IBM8514.BGI; TEXTCOLOR(WHITE); WRITELN(IBM8514.BGI); ARCHIVO:=IBM8514.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\PC3270.BGI; DESTINO1:=DESTINO+\PC3270.BGI; TEXTCOLOR(WHITE); WRITELN(PC3270.BGI); ARCHIVO:=PC3270.BGI; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\LITT.CHR; DESTINO1:=DESTINO+\LITT.CHR; TEXTCOLOR(WHITE); WRITELN(LITT.CHR); ARCHIVO:=LITT.CHR; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA1.OSC; DESTINO1:=DESTINO+\ONDA1.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA1.OSC); ARCHIVO:=ONDA1.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END;

163

MANUAL DEL PROGRAMADOR: Archivos ejecutables

CURSORON; ORIGEN1:=ORIGEN+\ONDA2.OSC; DESTINO1:=DESTINO+\ONDA2.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA2.OSC); ARCHIVO:=ONDA2.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA3.OSC; DESTINO1:=DESTINO+\ONDA3.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA3.OSC); ARCHIVO:=ONDA3.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA4.OSC; DESTINO1:=DESTINO+\ONDA4.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA4.OSC); ARCHIVO:=ONDA4.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA5.OSC; DESTINO1:=DESTINO+\ONDA5.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA5.OSC); ARCHIVO:=ONDA5.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA6.OSC; DESTINO1:=DESTINO+\ONDA6.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA6.OSC); ARCHIVO:=ONDA6.OSC; COPIAR;

164

MANUAL DEL PROGRAMADOR: Archivos ejecutables

IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\ONDA7.OSC; DESTINO1:=DESTINO+\ONDA7.OSC; TEXTCOLOR(WHITE); WRITELN(ONDA7.OSC); ARCHIVO:=ONDA7.OSC; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\C1.TXT; DESTINO1:=DESTINO+\C1.TXT; TEXTCOLOR(WHITE); WRITELN(C1.TXT); ARCHIVO:=C1.TXT; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\C2.TXT; DESTINO1:=DESTINO+\C2.TXT; TEXTCOLOR(WHITE); WRITELN(C2.TXT); ARCHIVO:=C2.TXT; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSORON; ORIGEN1:=ORIGEN+\C3.TXT; DESTINO1:=DESTINO+\C3.TXT; TEXTCOLOR(WHITE); WRITELN(C3.TXT); ARCHIVO:=C3.TXT; COPIAR; IF VERERROR=TRUE THEN BEGIN ERRORNORMAL:=TRUE; VERERROR:=FALSE END; CURSOROFF; WINDOW(1,1,80,25);

165

MANUAL DEL PROGRAMADOR: Archivos ejecutables

GOTOXY(2,25); TEXTCOLOR(WHITE); WRITE( ESCAPE=SALIR

);

WINDOW(21,6,60,14); CLRSCR; CURSOROFF; GOTOXY(1,1); WRITE( LA INSTALACION HA SIDO TERMINADA. ); IF (ERRORNORMAL=TRUE) AND (ERRORCLAVE=FALSE) THEN BEGIN WRITE(Se han producido errores que pueden no); WRITE(afectar al funcionamiento bsico del); WRITE(programa. Asegurese instalando correcta-); WRITE(mente con los ficheros necesarios segn); WRITE(su tipo de ordenador. ); WRITE( ); WRITE(>>> pulse CUALQUIER TECLA para repetir) END; IF ERRORCLAVE=TRUE THEN BEGIN WRITE(Se han producido errores que AFECTAN al); WRITE(funcionamiento bsico del PROGRAMA. El); WRITE(archivo EVAL.EXE no ha sido correctamen-); WRITE(te instalado, repita la instalacin. ); WRITE( ); WRITE( ); WRITE(>>> pulse CUALQUIER TECLA para repetir) END; IF (ERRORCLAVE=FALSE) AND (ERRORNORMAL=FALSE) THEN BEGIN WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( ); WRITE( >>> pulse CUALQUIER TECLA) END;

DESCARGARTECLADO; TECLA:=READKEY; IF (ERRORCLAVE=FALSE) AND (ERRORNORMAL=FALSE) THEN GOTO 4; IF TECLA <> #27 THEN BEGIN WINDOW(1,1,80,25); GOTO 1 END; 4: END.

166

4.- PROGRAMA PRINCIPAL

4.1.- DESCRIPCIN DEL PROGRAMA.

El programa aqu propuesto debe de conjugar el conjunto de cdigo antes expuesto. Se encargar de realizar todas las opciones que lleva consigo, y de dirigir la ejecucin del programa en la direccin que demande el usuario del mismo.

4.2.- DIRECTIVAS DE COMPILACIN.

Las directivas de compilacin que utiliza son las siguientes : {A+,S+,B-,E+,N+} {$M 16384, 270000, 270000} Activacin del modo 287

Adems para tratar los errores se utiliza de forma eficiente la directiva de activacin y desativacin del cdigo de error : {$I+} y {$I-}.

4.3.- UNIDADES UTILIZADAS.

Son las siguientes : CRT, GRAPH, DOS, ERR, VISUAL.

4.4.- DIAGRAMAS DE BLOQUES DEL PROGRAMA PRINCIPAL.

167

La idea de la programacin en Pascal es la estructuracin. Por ella la comprensin de cualquier programa se realiza de forma sencilla, y sin complejos e ininteligibles diagramas de flujo. An as incluiremos un diagrama de bloques del conjunto total para explicar de forma breve su funcionamiento.

Diagrama de Bloques del funcionamiento.

El total de listados del programa se ensamblan segn el siguiente diagrama :

168

MANUAL DEL PROGRAMADOR: Programa principal

Diagrama de conjuncin por el compilador.

4.5.- VARIABLES GLOBALES.

Son las que utilizamos en cualquier momento del transcurso del programa, y por tanto se pueden utilizar en los ficheros include. Son las siguientes :

LABEL 1,2,3,4,5; TYPE DATOS=RECORD TIEMPOS : REAL; TEMSIONES : ARRAY[1..25] OF REAL END; PUNTEROV2=^V2; V2=RECORD TIEMPOS : REAL; 169

MANUAL DEL PROGRAMADOR: Programa principal

TENSIONES : ARRAY[1..25] OF REAL; SIG : PUNTEROV2 END; PUNTERONUDO=^NUDO; NUDO=RECORD CARACTERN : CHAR; SIG : PUNTERONUDO END; PUNTEROV=^V; V=RECORD Vmuestras : REAL; NUMNUDO : INTEGER; SIG : PUNTEROV END; CONST EJECUTAR : BOOLEAN=FALSE; MEMDINAMICA : BOOLEAN=FALSE; SALIDADOS : BOOLEAN=FALSE; NOMPSP : STRING[100]=Ninguno; {seala el numero de errores producidos} NO_DE_ERRORES : INTEGER=0; {seala n de valores con valor >10} CONTADOR3 : INTEGER=0; DATOS_PCLAB : BOOLEAN=FALSE;

VAR DRIVER MODO VALOX VALOY ERRORDIRECTORIO SALTO RESALTO MARGEN BAX BAX2 BAX3 BAX4 MES : : : : : : : : : : : : : INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; INTEGER; 170

MANUAL DEL PROGRAMADOR: Programa principal

DIA ANO MAXCADENUDOS1 MAXCADENUDOS2 PUNTERO1 PUNTERO2 PUNTERO3 PUNTERO4 PUNTERO5 PUNTERO6 PUNTERO7 PUNTERO8 PUNTEROPAN DIMENSION1 DIMENSION2 DIMENSION3 DIMENSION4 DIMENSION5 DIMENSION6 DIMENSION7 DIMENSION8 COTE1 COTE2 CHIVATO1 CHIVATO2 CHIVATO3 CHIVATO4 TOLERANCIA UTOLERANCIA COLOR1 COLOR2 COLOR3 COLOR4 COLOR5 COLOR6 COLOR7 COLOR10 COLOR11 COLOR12 LONG CUNTAPUNTOYCOMA SALVAX SALVAY CREAR TOLERANCIA1 NOM

INTEGER; INTEGER; INTEGER; INTEGER; POINTER; POINTER; POINTER; POINTER; POINTER; POINTER; POINTER; POINTER; POINTER; : WORD; : WORD; : WORD; : WORD; : WORD; : WORD; : WORD; : WORD; : REAL; : REAL; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : BYTE; : STRING[11]; : STRING[3]; : STRING[100]; 171

: : : : : : : : : : : : :

MANUAL DEL PROGRAMADOR: Programa principal

TIEMPO DIRECTORIO VER SISTEMA BAY BAY2 BAY3 BAY4 ESC1 ESC2 ESC3 ESC4 ESC5 CREADO1 CREADO2 FUNCIONA MN CARGONUDOS PULSA NODCHAR PRIM ANTE ACTU INICIAL COMODIN PRESENTE PRIMERO ANTERIOR ACTUAL ASIGNUD

: STRING[100]; : STRING[255]; : STRING[255]; : STRING; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : CHAR; : CHAR; : PUNTEROV2; : PUNTEROV2; : PUNTEROV2; : PUNTERONUDO; : PUNTERONUDO; : PUNTERONUDO; : PUNTEROV; : PUNTEROV; : PUNTEROV; : ARRAY[0..15] OF BYTE;

4.6.- VARIABLES LOCALES.

Se definen como variables locales las declaradas en cada procedimiento (y/o funcin), y como tales se restringen su utilizacin a dicho procedimento (y/o funcin).

172

MANUAL DEL PROGRAMADOR: Programa principal

4.7.- LISTADO.

PROGRAM BARRA; {A+,S+,B-,E+,N+} {$M 16384, 270000, 270000} USES CRT,GRAPH,DOS,ERR,VISUAL6; LABEL 1,2,3,4,5; TYPE DATOS=RECORD TIEMPOS : REAL; TEMSIONES : ARRAY[1..25] OF REAL END; PUNTEROV2=^V2; V2=RECORD TIEMPOS : REAL; TENSIONES : ARRAY[1..25] OF REAL; SIG : PUNTEROV2 END; PUNTERONUDO=^NUDO; NUDO=RECORD CARACTERN : CHAR; SIG : PUNTERONUDO END; PUNTEROV=^V; V=RECORD Vmuestras : REAL; NUMNUDO : INTEGER; SIG : PUNTEROV END; CONST EJECUTAR : BOOLEAN=FALSE; MEMDINAMICA : BOOLEAN=FALSE; SALIDADOS : BOOLEAN=FALSE; NOMPSP : STRING[100]=Ninguno; {seala el numero de errores producidos} NO_DE_ERRORES: INTEGER=0; {seala n de valores con valor >10} CONTADOR3 : INTEGER=0; DATOS_PCLAB : BOOLEAN=FALSE;

VAR

173

MANUAL DEL PROGRAMADOR: Programa principal

DRIVER : INTEGER; MODO : INTEGER; VALOX : INTEGER; VALOY : INTEGER; ERRORDIRECTORIO : INTEGER; SALTO : INTEGER; RESALTO : INTEGER; MARGEN : INTEGER; BAX : INTEGER; BAX2 : INTEGER; BAX3 : INTEGER; BAX4 : INTEGER; MES : INTEGER; DIA : INTEGER; ANO : INTEGER; MAXCADENUDOS1 : INTEGER; MAXCADENUDOS2 : INTEGER; PUNTERO1 : POINTER; PUNTERO2 : POINTER; PUNTERO3 : POINTER; PUNTERO4 : POINTER; PUNTERO5 : POINTER; PUNTERO6 : POINTER; PUNTERO7 : POINTER; PUNTERO8 : POINTER; PUNTEROPAN : POINTER; DIMENSION1 : WORD; DIMENSION2 : WORD; DIMENSION3 : WORD; DIMENSION4 : WORD; DIMENSION5 : WORD; DIMENSION6 : WORD; DIMENSION7 : WORD; DIMENSION8 : WORD; COTE1 : REAL; COTE2 : REAL; CHIVATO1 : BYTE; CHIVATO2 : BYTE; CHIVATO3 : BYTE; CHIVATO4 : BYTE; TOLERANCIA : BYTE; UTOLERANCIA : BYTE; COLOR1 : BYTE; COLOR2 : BYTE; COLOR3 : BYTE; COLOR4 : BYTE; COLOR5 : BYTE; COLOR6 : BYTE; COLOR7 : BYTE; COLOR10 : BYTE; COLOR11 : BYTE; COLOR12 : BYTE; LONG : BYTE; CUNTAPUNTOYCOMA : BYTE; SALVAX : BYTE;

174

MANUAL DEL PROGRAMADOR: Programa principal

SALVAY CREAR TOLERANCIA1 NOM TIEMPO DIRECTORIO VER SISTEMA BAY BAY2 BAY3 BAY4 ESC1 ESC2 ESC3 ESC4 ESC5 CREADO1 CREADO2 FUNCIONA MN CARGONUDOS PULSA NODCHAR PRIM ANTE ACTU INICIAL COMODIN PRESENTE PRIMERO ANTERIOR ACTUAL ASIGNUD

: BYTE; : STRING[11]; : STRING[3]; : STRING[100]; : STRING[100]; : STRING[255]; : STRING[255]; : STRING; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : BOOLEAN; : CHAR; : CHAR; : PUNTEROV2; : PUNTEROV2; : PUNTEROV2; : PUNTERONUDO; : PUNTERONUDO; : PUNTERONUDO; : PUNTEROV; : PUNTEROV; : PUNTEROV; : ARRAY[0..15] OF BYTE;

(**********************************************************) {$I GEN35.PAS} (**********************************************************) {$I EJECUT18.PAS} (**********************************************************) PROCEDURE VENTANAS1; BEGIN IF PUNTERO1=NIL THEN BEGIN SETFILLSTYLE(1,WHITE); BAR(ROUND(35*COTE1),ROUND(20*COTE2),ROUND(600*COTE1),ROUND(40*COTE2)); SETFILLSTYLE(1,GREEN); PIESLICE(ROUND(60*COTE1),ROUND(30*COTE2),1,360,ROUND(7*COTE1)); SETCOLOR(BLACK);

175

MANUAL DEL PROGRAMADOR: Programa principal

RECTANGLE(ROUND(51*COTE1),ROUND(21*COTE2),ROUND(69*COTE1),ROUND(39*COTE2)); OUTTEXTXY(ROUND(250*COTE1),ROUND(27*COTE2),EJECUTAR); OUTTEXTXY(ROUND(380*COTE1),ROUND(27*COTE2),APLICA-2); OUTTEXTXY(ROUND(520*COTE1),ROUND(27*COTE2),SALIR); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR); DIMENSION1:=IMAGESIZE(ROUND(35*COTE1),ROUND(20*COTE2),ROUND(600*COTE1),ROUND(4 0*COTE2)); GETMEM(PUNTERO1,DIMENSION1); GETIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),ROUND(600*COTE1),ROUND(40*COTE2),PUNT ERO1^); SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR); END ELSE PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT) END; (**********************************************************) PROCEDURE DEFINIR_COLORES; BEGIN CASE OBTENERTIPOADAP OF MDA,EGAMono,VGAMono,MCGAMono : BEGIN COLOR1:=BLACK; COLOR2:=BLACK; COLOR3:=BLACK; COLOR4:=BLACK; COLOR5:=BLACK; COLOR6:=WHITE; COLOR7:=WHITE; COLOR10:=BLACK; COLOR11:=WHITE; COLOR12:=WHITE; MN:=TRUE END ELSE BEGIN COLOR1:=MAGENTA; COLOR2:=LIGHTRED; COLOR3:=WHITE; COLOR4:=LIGHTGREEN; COLOR5:=LIGHTBLUE; COLOR6:=YELLOW; COLOR7:=LIGHTGREEN; COLOR10:=GREEN; COLOR11:=LIGHTRED; COLOR12:=LIGHTGREEN; MN:=FALSE END

176

MANUAL DEL PROGRAMADOR: Programa principal

END END; (**********************************************************) {$F+} PROCEDURE LIBERARMEMORIA; BEGIN IF PUNTERO1 <> NIL THEN FREEMEM(PUNTERO1,DIMENSION1); IF PUNTERO2 <> NIL THEN FREEMEM(PUNTERO2,DIMENSION2); IF PUNTERO3 <> NIL THEN FREEMEM(PUNTERO3,DIMENSION3); IF PUNTERO4 <> NIL THEN FREEMEM(PUNTERO4,DIMENSION4); IF PUNTERO5 <> NIL THEN FREEMEM(PUNTERO5,DIMENSION5); IF PUNTERO6 <> NIL THEN FREEMEM(PUNTERO6,DIMENSION6); IF PUNTERO7 <> NIL THEN FREEMEM(PUNTERO7,DIMENSION7); IF PUNTERO8 <> NIL THEN FREEMEM(PUNTERO8,DIMENSION8); IF MEMDINAMICA=TRUE THEN BEGIN {dispone la posible memoria ocupada por anteriores ficheros .txt} BEGIN ANTE:=PRIM; REPEAT ACTU:=ANTE^.SIG; DISPOSE(ANTE); ANTE:=ACTU UNTIL ANTE^.SIG=NIL END; {dispone la posible memoria ocupada por los nudos de anteriores fich} BEGIN COMODIN:=INICIAL; REPEAT BEGIN PRESENTE:=COMODIN^.SIG; DISPOSE(COMODIN); COMODIN:=PRESENTE END UNTIL COMODIN^.SIG=NIL END END; {dispone la posible memoria ocupada por los datos tomados con la PCLAB} IF DATOS_PCLAB=TRUE THEN BEGIN ACTUAL:=PRIMERO; WHILE ACTUAL=NIL DO ANTERIOR:=ACTUAL^.SIG; DISPOSE(ACTUAL); ACTUAL:=ANTERIOR; END; CLOSEGRAPH; LOWVIDEO; CURSORON; TEXTMODE(LASTMODE); CARGARPANTALLA(PUNTEROPAN);

177

MANUAL DEL PROGRAMADOR: Programa principal

GOTOXY(SALVAX,SALVAY) END; {$F-} (**********************************************************) PROCEDURE VALORTOLERANCIA; BEGIN IF ((CHIVATO1<>5) AND ((SALTO<>13) OR (SALTO<>80))) OR (SALTO=61) THEN BEGIN {para no poderla llamar con saludo delante} IF PUNTERO6=NIL THEN BEGIN SETFILLSTYLE(1,WHITE); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); SETCOLOR(7); SETLINESTYLE(0,1,3); LINE(ROUND(165*COTE1),ROUND(273*COTE2),ROUND(482*COTE1),ROUND(273*COTE2)); LINE(ROUND(483*COTE1),ROUND(215*COTE2),ROUND(483*COTE1),ROUND(274*COTE2)); SETCOLOR(BLACK); OUTTEXTXY(ROUND(170*COTE1),ROUND(220*COTE2),INTRODUCE EL VALOR DE LA TOLERANCIA :); OUTTEXTXY(ROUND(270*COTE1),ROUND(235*COTE2),< 0..100 >); OUTTEXTXY(ROUND(185*COTE1),ROUND(250*COTE2),-1); OUTTEXTXY(ROUND(190*COTE1),ROUND(260*COTE2),#27); OUTTEXTXY(ROUND(215*COTE1),ROUND(250*COTE2),-5); OUTTEXTXY(ROUND(220*COTE1),ROUND(260*COTE2),#25); OUTTEXTXY(ROUND(395*COTE1),ROUND(250*COTE2),+5); OUTTEXTXY(ROUND(400*COTE1),ROUND(260*COTE2),#24); OUTTEXTXY(ROUND(425*COTE1),ROUND(250*COTE2),+1); OUTTEXTXY(ROUND(430*COTE1),ROUND(260*COTE2),#26); DIMENSION6:=IMAGESIZE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND (280*COTE2)); GETMEM(PUNTERO6,DIMENSION6); GETIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2),PU NTERO6^) END ELSE PUTIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),PUNTERO6^,COPYPUT); SETFILLSTYLE(1,7); SETCOLOR(BLACK); SETLINESTYLE(0,1,3); UTOLERANCIA:=TOLERANCIA; REPEAT BAR(ROUND(260*COTE1),ROUND(250*COTE2),ROUND(360*COTE1),ROUND(265*COTE2)); LINE(ROUND(265*COTE1),ROUND(267*COTE2),ROUND(362*COTE1),ROUND(267*COTE2)); LINE(ROUND(362*COTE1),ROUND(255*COTE2),ROUND(362*COTE1),ROUND(268*COTE2)); OUTTEXTXY(ROUND(290*COTE1),ROUND(255*COTE2),TOLERANCIA1); OUTTEXTXY(ROUND(320*COTE1),ROUND(255*COTE2), %); DESCARGARTECLADO; MARGEN:=ORD(READKEY);

178

MANUAL DEL PROGRAMADOR: Programa principal

IF MARGEN=75 THEN BEGIN TOLERANCIA:=TOLERANCIA-1; IF TOLERANCIA=255 THEN TOLERANCIA:=100; STR(TOLERANCIA,TOLERANCIA1) END; IF MARGEN=77 THEN BEGIN TOLERANCIA:=TOLERANCIA+1; IF TOLERANCIA=101 THEN TOLERANCIA:=0; STR(TOLERANCIA,TOLERANCIA1) END; IF MARGEN=72 THEN BEGIN TOLERANCIA:=TOLERANCIA+5; IF TOLERANCIA>100 THEN TOLERANCIA:=0; STR(TOLERANCIA,TOLERANCIA1) END; IF MARGEN=80 THEN BEGIN TOLERANCIA:=TOLERANCIA-5; IF TOLERANCIA IN [250,251,252,253,254,255] THEN TOLERANCIA:=100; STR(TOLERANCIA,TOLERANCIA1) END UNTIL (MARGEN=13) OR (MARGEN=27); IF MARGEN=27 THEN BEGIN IF PUNTERO7=NIL THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); DIMENSION7:=IMAGESIZE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND (280*COTE2)); GETMEM(PUNTERO7,DIMENSION7); GETIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2),PU NTERO7^) END ELSE PUTIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),PUNTERO7^,COPYPUT); TOLERANCIA:=UTOLERANCIA; STR(TOLERANCIA,TOLERANCIA1) END; SETLINESTYLE(0,0,1); IF (MARGEN=13) AND ((SALTO=61) OR (RESALTO=61)) THEN BEGIN IF PUNTERO7=NIL THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); DIMENSION7:=IMAGESIZE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND (280*COTE2)); GETMEM(PUNTERO7,DIMENSION7); GETIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2),PU NTERO7^) END ELSE PUTIMAGE(ROUND(150*COTE1),ROUND(200*COTE2),PUNTERO7^,COPYPUT); SETFILLSTYLE(1,WHITE); BAR(ROUND(510*COTE1),ROUND(365*COTE2),ROUND(545*COTE1),ROUND(372*COTE2)); SETCOLOR(COLOR2); OUTTEXTXY(ROUND(390*COTE1),ROUND(365*COTE2),TOLERANCIA : %); 179

MANUAL DEL PROGRAMADOR: Programa principal

STR(TOLERANCIA,TOLERANCIA1); OUTTEXTXY(ROUND(520*COTE1),ROUND(365*COTE2),TOLERANCIA1) END; SETCOLOR(WHITE) END END; {de la condicin del saludo} (**********************************************************) PROCEDURE CAMBIARDIRECTORIO; BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(COLOR5); CLRSCR; REPEAT REPEAT CURSORON; WINDOW(1,1,80,25); PULSA:= ; {inicializamos} CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(3,2); WRITELN(INTRODUCE UNIDAD Y CAMINO DEL DIRECTORIO O SUBDIRECTORIO : ); GOTOXY(3,3); WRITELN(Unidad:\Camino1\Camino2\...\CaminoN >>> INTRO salir); RAYA_HORIZONTAL(2,79,4,WHITE); TEXTCOLOR(COLOR6); GOTOXY(3,24); WRITE(DTO. actual : ,DIRECTORIO); RAYA_HORIZONTAL(2,79,23,WHITE); TEXTCOLOR(COLOR6); WINDOW(3,5,78,24); GOTOXY(1,1); REPEAT DESCARGARTECLADO; READLN(DIRECTORIO) UNTIL DIRECTORIO<>#13; IF LENGTH(DIRECTORIO)=2 THEN BEGIN WINDOW(1,1,80,25); DIRECTORIO:=No Definido; CURSOROFF; ERROR(3); GOTOXY(23,22); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); WRITE(>>> pulsa CUALQUIER TECLA para repetir...); DESCARGARTECLADO; PULSA:=READKEY END

180

MANUAL DEL PROGRAMADOR: Programa principal

ELSE PULSA:=#251; IF LENGTH(DIRECTORIO)>40 THEN BEGIN CURSOROFF; DIRECTORIO:=No Definido; GOTOXY(2,3); WRITELN(EL DIRECTORIO SE EXCEDE EN SU LONGITUD (>40 caracteres)); WRITELN(^g); DELAY(3000) END UNTIL (PULSA=#251) AND (LENGTH(DIRECTORIO)<40); {$V-} FOR LONG:=1 TO LENGTH(DIRECTORIO) DO DIRECTORIO[LONG]:=UPCASE(DIRECTORIO[LONG]); {$V+} {$I-} CHDIR(DIRECTORIO) {$I+} ; ERRORDIRECTORIO:=IORESULT; IF ERRORDIRECTORIO<>0 THEN BEGIN CURSOROFF; DIRECTORIO:=No Definido; WINDOW(1,1,80,25); ERROR(ERRORDIRECTORIO); GOTOXY(23,22); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); WRITE(>>> pulsa CUALQUIER TECLA para repetir...); DESCARGARTECLADO; PULSA:=READKEY END ELSE PULSA:=#251; WINDOW(1,1,80,25) {un valor que no se da raiz^2} UNTIL PULSA=#251; SETGRAPHMODE(MODO) END; (**********************************************************) PROCEDURE CALCULARDIRECTORIOACTUAL; BEGIN GETDIR(0,DIRECTORIO); IF LENGTH(DIRECTORIO)>40 THEN DIRECTORIO:=de trabajo por defecto END; (**********************************************************) PROCEDURE ABANDONAR; BEGIN SETFILLSTYLE(1,7); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2));

181

MANUAL DEL PROGRAMADOR: Programa principal

SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); OUTTEXTXY(ROUND(190*COTE1),ROUND(220*COTE2), DESEA ABANDONAR EL PROGRAMA ?); OUTTEXTXY(ROUND(240*COTE1),ROUND(240*COTE2),(S)-Si (N)-No); REPEAT DESCARGARTECLADO; PULSA:=READKEY UNTIL PULSA IN [N,n,S,s]; IF PULSA IN [N,n] THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)) END; {redibuja en el caso de vover de ejecutar} IF (CHIVATO1=2) AND (EJECUTAR=TRUE) THEN BEGIN SETFILLSTYLE(1,7); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(190*COTE1),ROUND(235*COTE2),>>> PULSE ESCAPE PARA CONTINUAR) END; {redibuja en el caso de volver de no poderse ejecutar} IF (CHIVATO1=2) AND (EJECUTAR=FALSE) THEN BEGIN SETFILLSTYLE(1,7); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); OUTTEXTXY(ROUND(190*COTE1),ROUND(220*COTE2), NO DEFINIDO FICHERO PSP SOBRE); OUTTEXTXY(ROUND(190*COTE1),ROUND(240*COTE2), EL QUE EJECUTAR EL PROGRAMA); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(190*COTE1),ROUND(260*COTE2), >>> ESCAPE SALIR) END; {redibuja el saludo} IF (CHIVATO1=5) AND ((SALTO=80) OR (SALTO=13)) THEN PUTIMAGE(ROUND(180*COTE1),ROUND(100*COTE2),PUNTERO8^,COPYPUT); SETCOLOR(WHITE) END; (**********************************************************) PROCEDURE FIJARFECHA ( MES, DIA, ANO : INTEGER; VAR FUNCIONA:BOOLEAN); VAR REGS : REGISTERS; BEGIN

182

MANUAL DEL PROGRAMADOR: Programa principal

FILLCHAR(REGS,SIZEOF(REGS),0); WITH REGS DO BEGIN AH:=$2B; DH:=MES; DL:=DIA; CX:=ANO END; MSDOS(REGS); FUNCIONA:=REGS.AL <> 0 END; (**********************************************************) PROCEDURE FECHA; LABEL ALMENU; BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(COLOR5); CLRSCR; REPEAT REPEAT REPEAT REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); RAYA_HORIZONTAL(2,79,3,WHITE); OBTENERFECHA(SISTEMA); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(3,2); WRITELN(LA FECHA ACTUAL ES : ,SISTEMA); WINDOW(3,4,78,24); GOTOXY(1,2); WRITELN(INTRODUCE EL DIA (dos cifras)); DESCARGARTECLADO; WINDOW(3,6,78,7); {$I-} READLN(DIA) {$I+}; ERRORDIRECTORIO:=IORESULT; IF ERRORDIRECTORIO<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERRORDIRECTORIO); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(15,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO;

183

MANUAL DEL PROGRAMADOR: Programa principal

PULSA:=READKEY; IF PULSA=#27 THEN GOTO ALMENU END UNTIL ERRORDIRECTORIO=0; WINDOW(3,4,78,24); GOTOXY(1,5); WRITELN(INTRODUCE EL MES (dos cifras)); DESCARGARTECLADO; WINDOW(3,9,78,10); {$I-} READLN(MES) {$I+}; ERRORDIRECTORIO:=IORESULT; IF ERRORDIRECTORIO<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERRORDIRECTORIO); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(15,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; PULSA:=READKEY; IF PULSA=#27 THEN GOTO ALMENU END UNTIL ERRORDIRECTORIO=0; WINDOW(3,4,78,24); GOTOXY(1,8); WRITELN(INTRODUCE EL AO (cuatro cifras)); DESCARGARTECLADO; WINDOW(3,12,78,13); {$I-} READLN(ANO) {$I+}; ERRORDIRECTORIO:=IORESULT; IF ERRORDIRECTORIO<>0 THEN BEGIN CURSOROFF; WINDOW(1,1,80,25); ERROR(ERRORDIRECTORIO); TEXTCOLOR(COLOR6); TEXTBACKGROUND(COLOR5); GOTOXY(15,24); WRITE(>>> pulsa CUALQUIER TECLA para repetir, ESCAPE salir); DESCARGARTECLADO; PULSA:=READKEY; IF PULSA=#27 THEN GOTO ALMENU END UNTIL ERRORDIRECTORIO=0; WINDOW(1,1,80,25); FIJARFECHA(MES,DIA,ANO,FUNCIONA); IF FUNCIONA THEN BEGIN GOTOXY(33,23); TEXTCOLOR(COLOR2+BLINK); WRITELN( ERROR! ); WRITELN(^g); TEXTCOLOR(COLOR6); END ELSE BEGIN

184

MANUAL DEL PROGRAMADOR: Programa principal

GOTOXY(25,23); WRITELN(LA FECHA HA SIDO ESTABLECIDA) END; CURSOROFF; GOTOXY(27,24); WRITE(Pulse CUALQUIER TECLA...); DESCARGARTECLADO; PULSA:=READKEY UNTIL FUNCIONA=FALSE; ALMENU : END; (**********************************************************) PROCEDURE REALIZA_INFORMACION; BEGIN SETCOLOR(WHITE); RECTANGLE(0,0,VALOX,VALOY); VENTANAS1; {realizacin de la informacin} SETFILLSTYLE(1,WHITE); BAR(ROUND(35*COTE1),ROUND(350*COTE2),ROUND(600*COTE1),ROUND(420*COTE2)); SETCOLOR(BLACK); RECTANGLE(ROUND(45*COTE1),ROUND(360*COTE2),ROUND(590*COTE1),ROUND(410*COTE2)); LINE(ROUND(52*COTE1),ROUND(375*COTE2),ROUND(583*COTE1),ROUND(375*COTE2)); LINE(ROUND(52*COTE1),ROUND(395*COTE2),ROUND(583*COTE1),ROUND(395*COTE2)); LINE(ROUND(318*COTE1),ROUND(362*COTE2),ROUND(318*COTE1),ROUND(373*COTE2)); SETCOLOR(COLOR2); IF CREAR=A DISCO: SI THEN OUTTEXTXY(ROUND(80*COTE1),ROUND(365*COTE2),FICHEROS DE SALIDA : SI); IF CREAR=A DISCO: NO THEN OUTTEXTXY(ROUND(80*COTE1),ROUND(365*COTE2),FICHEROS DE SALIDA : NO); OUTTEXTXY(ROUND(390*COTE1),ROUND(365*COTE2),TOLERANCIA : %); STR(TOLERANCIA,TOLERANCIA1); OUTTEXTXY(ROUND(520*COTE1),ROUND(365*COTE2),TOLERANCIA1); OUTTEXTXY(ROUND(80*COTE1),ROUND(382*COTE2),FICHERO PSP : ); OUTTEXTXY(ROUND(205*COTE1),ROUND(382*COTE2),NOMPSP); OUTTEXTXY(ROUND(80*COTE1),ROUND(400*COTE2),DIRECTORIO : ); OUTTEXTXY(ROUND(205*COTE1),ROUND(400*COTE2),DIRECTORIO); SETLINESTYLE(0,1,3); SETCOLOR(7); LINE(ROUND(50*COTE1),ROUND(413*COTE2),ROUND(592*COTE1),ROUND(413*COTE2)); LINE(ROUND(593*COTE1),ROUND(365*COTE2),ROUND(593*COTE1),ROUND(414*COTE2)); SETLINESTYLE(0,0,1); SETCOLOR(BLACK); SETFILLSTYLE(1,LIGHTCYAN); BAR(ROUND(35*COTE1),ROUND(440*COTE2),ROUND(600*COTE1),ROUND(460*COTE2)); OUTTEXTXY(ROUND(50*COTE1),ROUND(447*COTE2),ESCAPE); OUTTEXTXY(ROUND(140*COTE1),ROUND(447*COTE2),F3); OUTTEXTXY(ROUND(290*COTE1),ROUND(447*COTE2),F4);

185

MANUAL DEL PROGRAMADOR: Programa principal

OUTTEXTXY(ROUND(450*COTE1),ROUND(447*COTE2),Ctr-S); SETCOLOR(COLOR10); OUTTEXTXY(ROUND(140*COTE1),ROUND(447*COTE2), =TOLERANCIA); OUTTEXTXY(ROUND(290*COTE1),ROUND(447*COTE2), =DOS SHELL); OUTTEXTXY(ROUND(450*COTE1),ROUND(447*COTE2), =ABANDONAR);

{fin de la informacin} IF (CHIVATO1<>2) AND (RESALTO<>27) THEN BEGIN {para que no dibuje en magenta cuando estamos en ejecutar} SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR) END; BAX:=1 END; (**********************************************************) PROCEDURE SALIDA_AL_DOS; BEGIN {$F+} RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(BLACK); TEXTCOLOR(WHITE); CURSORON; CLRSCR; WRITELN; WRITELN(PROGRAMA VERIFICACION DE CIRCUITOS 1.00); WRITELN(Emilio Sahuquillo & Julio Martinez); WRITELN(SALIDA AL DOS: teclee EXIT para retornar al programa...); SWAPVECTORS; LOWVIDEO; EXEC(GETENV(COMSPEC),); SWAPVECTORS; SETGRAPHMODE(MODO); {$F-} {incluimos condicin para que si salimos de forma normal no redibuje dos veces} IF SALIDADOS=FALSE THEN BEGIN CALCULARDIRECTORIOACTUAL; REALIZA_INFORMACION; SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR) END;

186

MANUAL DEL PROGRAMADOR: Programa principal

SALTO:=8; SALIDADOS:=FALSE END; (**********************************************************) BEGIN EXITPROC:=@LIBERARMEMORIA; WRITELN(EVALUACION 1.00 ## (c)1992-93 ## JULIO MARTINEZ & EMILIO SAHUQUILLO); WRITELN( Verificacin de circuitos electrnicos ); SALVAX:=WHEREX; SALVAY:=WHEREY; SALVARPANTALLA(PUNTEROPAN); TEXTMODE(C80); {inicializamos los punteros grficos} PUNTERO1:=NIL; PUNTERO2:=NIL; PUNTERO3:=NIL; PUNTERO4:=NIL; PUNTERO5:=NIL; PUNTERO6:=NIL; PUNTERO7:=NIL; PUNTERO8:=NIL; CHECKSNOW:=TRUE; {Para el caso de adaptador CGA no} CREAR:=A DISCO: SI; {se produzca nieve} TOLERANCIA:=15; DEFINIR_COLORES; {inicializacin del modo grfico} DRIVER:=DETECT; INITGRAPH(DRIVER,MODO,); {introducimos rutina de busqueda de los ficheros graficos} IF GRAPHRESULT<>0 THEN BEGIN DRIVER:=DETECT; INITGRAPH(DRIVER,MODO,C:\TP\BGI); IF GRAPHRESULT<>0 THEN BEGIN DRIVER:=DETECT; INITGRAPH(DRIVER,MODO,D:\TP\BGI); IF GRAPHRESULT<>0 THEN BEGIN REPEAT TEXTCOLOR(LIGHTRED); WRITELN(NO SE ENCUENTRAN LOS FICHEROS DE ENTRADA AL MODO GRAFICO); WRITELN(^g); TEXTCOLOR(WHITE); WRITELN(INTRODUCE INTRODUCE UNIDAD, CAMINO/VIA DE ACCESO A LOS ARCHIVOS); WRITELN((introduce "NADA" para salir)); READLN(VER); FOR SALTO:=1 TO LENGTH(VER) DO VER[SALTO]:=UPCASE(VER[SALTO]); IF VER=NADA THEN HALT; DRIVER:=DETECT; INITGRAPH(DRIVER,MODO,VER) UNTIL GRAPHRESULT=0 END END

187

MANUAL DEL PROGRAMADOR: Programa principal

END; VALOX:=GETMAXX; COTE1:=VALOX/639; VALOY:=GETMAXY; COTE2:=VALOY/479; REPEAT BAX:=1; CHIVATO1:=1; BAY:=FALSE; CALCULARDIRECTORIOACTUAL; REALIZA_INFORMACION; ESC1:=FALSE; ESC2:=FALSE; ESC3:=FALSE; ESC4:=FALSE; IF (RESALTO=13) THEN BEGIN ESC3:=TRUE; ESC4:=TRUE END; CREADO1:=TRUE; CREADO2:=FALSE; 5: REPEAT; DESCARGARTECLADO; SALTO:=ORD(READKEY); REPEAT; 1: IF (SALTO=77) OR (BAY=TRUE) THEN BEGIN IF BAX=5 THEN BAX:=0; IF BAX=-1 THEN BAX:=4; IF BAX=0 THEN BEGIN PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR); BAY:=FALSE; CHIVATO1:=1 END; IF BAX=1 THEN BEGIN PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(230*COTE1),ROUND(20*COTE2),ROUND(330*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(250*COTE1),ROUND(27*COTE2),EJECUTAR); BAY:=FALSE; CHIVATO1:=2 END; IF BAX=2 THEN BEGIN

188

MANUAL DEL PROGRAMADOR: Programa principal

PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(365*COTE1),ROUND(20*COTE2),ROUND(460*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(380*COTE1),ROUND(27*COTE2),APLICA-2); BAY:=FALSE; CHIVATO1:=3 END; IF BAX=3 THEN BEGIN PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(500*COTE1),ROUND(20*COTE2),ROUND(575*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(520*COTE1),ROUND(27*COTE2),SALIR); BAY:=FALSE; CHIVATO1:=4 END; IF BAX=4 THEN BEGIN PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(48*COTE1),ROUND(20*COTE2),ROUND(72*COTE1),ROUND(40*COTE2)); SETFILLSTYLE(1,GREEN); PIESLICE(ROUND(60*COTE1),ROUND(30*COTE2),1,360,ROUND(7*COTE1)); SETCOLOR(WHITE); RECTANGLE(ROUND(51*COTE1),ROUND(21*COTE2),ROUND(69*COTE1),ROUND(39*COTE2)); BAY:=FALSE; CHIVATO1:=5 END; SALTO:=0; BAX:=BAX+1 END; IF SALTO=75 THEN BEGIN BAX:=BAX-2; BAY:=TRUE; IF BAX=-2 THEN BAX:=-1; GOTO 1 END; {por las teclas de funcin y combinadas} IF SALTO=19 THEN BEGIN ABANDONAR; IF PULSA IN [S,s] THEN HALT END; IF SALTO=61 THEN VALORTOLERANCIA; IF SALTO=62 THEN BEGIN SALIDA_AL_DOS; IF CHIVATO1=2 THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE);

189

MANUAL DEL PROGRAMADOR: Programa principal

OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR) END; BAX:=1 END UNTIL (SALTO<>62) UNTIL (SALTO=13) OR (SALTO=80); PUTIMAGE(ROUND(35*COTE1),ROUND(20*COTE2),PUNTERO1^,COPYPUT); IF CHIVATO1=1 THEN BEGIN IF (PUNTERO2=NIL) OR (CREADO1<>CREADO2) THEN BEGIN IF PUNTERO2<>NIL THEN FREEMEM(PUNTERO2,DIMENSION2); SETCOLOR(BLACK); SETFILLSTYLE(1,WHITE); BAR(ROUND(85*COTE1),ROUND(40*COTE2),ROUND(215*COTE1),ROUND(120*COTE2)); RECTANGLE(ROUND(90*COTE1),ROUND(45*COTE2),ROUND(205*COTE1),ROUND(110*COTE2)); SETLINESTYLE(0,1,3); SETCOLOR(7); LINE(ROUND(94*COTE1),ROUND(113*COTE2),ROUND(206*COTE1),ROUND(113*COTE2)); LINE(ROUND(208*COTE1),ROUND(48*COTE2),ROUND(208*COTE1),ROUND(114*COTE2)); SETLINESTYLE(0,0,1); SETCOLOR(BLACK); OUTTEXTXY(ROUND(100*COTE1),ROUND(55*COTE2),FICHERO PSP); OUTTEXTXY(ROUND(100*COTE1),ROUND(75*COTE2),CREAR); OUTTEXTXY(ROUND(100*COTE1),ROUND(95*COTE2),TOLERANCIA); DIMENSION2:=IMAGESIZE(ROUND(85*COTE1),ROUND(40*COTE2),ROUND(215*COTE1),ROUND(1 20*COTE2)); GETMEM(PUNTERO2,DIMENSION2); GETIMAGE(ROUND(85*COTE1),ROUND(40*COTE2),ROUND(215*COTE1),ROUND(120*COTE2),PUN TERO2^); SETFILLSTYLE(1,COLOR1); BAR(ROUND(95*COTE1),ROUND(50*COTE2),ROUND(195*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(55*COTE2),FICHERO PSP); CREADO1:=CREADO2 END ELSE BEGIN PUTIMAGE(ROUND(85*COTE1),ROUND(40*COTE2),PUNTERO2^,COPYPUT); IF ESC1=TRUE THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(95*COTE1),ROUND(50*COTE2),ROUND(195*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(55*COTE2),FICHERO PSP) END END END; IF (CHIVATO1=2) AND (EJECUTAR=FALSE) THEN BEGIN SETFILLSTYLE(1,7); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2));

190

MANUAL DEL PROGRAMADOR: Programa principal

SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); OUTTEXTXY(ROUND(190*COTE1),ROUND(220*COTE2), NO DEFINIDO FICHERO PSP SOBRE); OUTTEXTXY(ROUND(190*COTE1),ROUND(240*COTE2), EL QUE EJECUTAR EL PROGRAMA); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(190*COTE1),ROUND(260*COTE2), >>> ESCAPE SALIR); FOR MES:=1 TO 5 DO BEGIN SOUND(1000); DELAY(100); SOUND(800); DELAY(80); NOSOUND END END; IF (CHIVATO1=2) AND (EJECUTAR= TRUE) THEN BEGIN RESTORECRTMODE; EJECUTA; SETGRAPHMODE(MODO); REALIZA_INFORMACION; SETFILLSTYLE(1,7); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK); RECTANGLE(ROUND(160*COTE1),ROUND(210*COTE2),ROUND(480*COTE1),ROUND(270*COTE2)); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(190*COTE1),ROUND(235*COTE2),>>> PULSE ESCAPE PARA CONTINUAR); BAX:=2;{para que se coloque en su lugar} END; IF CHIVATO1=3 THEN BEGIN IF PUNTERO3=NIL THEN BEGIN SETCOLOR(BLACK); SETFILLSTYLE(1,WHITE); BAR(ROUND(380*COTE1),ROUND(40*COTE2),ROUND(515*COTE1),ROUND(150*COTE2)); RECTANGLE(ROUND(385*COTE1),ROUND(45*COTE2),ROUND(505*COTE1),ROUND(140*COTE2)); SETLINESTYLE(0,1,3); SETCOLOR(7); LINE(ROUND(390*COTE1),ROUND(143*COTE2),ROUND(507*COTE1),ROUND(143*COTE2)); LINE(ROUND(508*COTE1),ROUND(49*COTE2),ROUND(508*COTE1),ROUND(144*COTE2)); SETLINESTYLE(0,0,1); SETCOLOR(BLACK); OUTTEXTXY(ROUND(400*COTE1),ROUND(60*COTE2),FECHA); OUTTEXTXY(ROUND(400*COTE1),ROUND(80*COTE2),VER DIRECT); OUTTEXTXY(ROUND(400*COTE1),ROUND(100*COTE2),CH. DIRECT); OUTTEXTXY(ROUND(400*COTE1),ROUND(120*COTE2),LOCALIZAR); DIMENSION3:=IMAGESIZE(ROUND(380*COTE1),ROUND(40*COTE2),ROUND(515*COTE1),ROUND(150*COTE2)); GETMEM(PUNTERO3,DIMENSION3); GETIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),ROUND(515*COTE1),ROUND(150*COTE2),PU NTERO3^); SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(55*COTE2),ROUND(500*COTE1),ROUND(70*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(60*COTE2),FECHA) END

191

MANUAL DEL PROGRAMADOR: Programa principal

ELSE BEGIN PUTIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),PUNTERO3^,COPYPUT); IF ESC3=TRUE THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(55*COTE2),ROUND(500*COTE1),ROUND(70*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(60*COTE2),FECHA) END END END; IF CHIVATO1=4 THEN BEGIN IF PUNTERO4=NIL THEN BEGIN SETCOLOR(BLACK); SETFILLSTYLE(1,WHITE); BAR(ROUND(475*COTE1),ROUND(40*COTE2),ROUND(600*COTE1),ROUND(120*COTE2)); RECTANGLE(ROUND(480*COTE1),ROUND(45*COTE2),ROUND(590*COTE1),ROUND(110*COTE2)); SETCOLOR(BLACK); SETLINESTYLE(0,1,3); SETCOLOR(7); LINE(ROUND(485*COTE1),ROUND(113*COTE2),ROUND(592*COTE1),ROUND(113*COTE2)); LINE(ROUND(593*COTE1),ROUND(49*COTE2),ROUND(593*COTE1),ROUND(114*COTE2)); SETLINESTYLE(0,0,1); SETCOLOR(BLACK); OUTTEXTXY(ROUND(490*COTE1),ROUND(55*COTE2),OSCILOSCOPIO); OUTTEXTXY(ROUND(490*COTE1),ROUND(75*COTE2),DOS-SHELL); OUTTEXTXY(ROUND(490*COTE1),ROUND(95*COTE2),ABANDONAR); DIMENSION4:=IMAGESIZE(ROUND(475*COTE1),ROUND(40*COTE2),ROUND(600*COTE1),ROUND( 120*COTE2)); GETMEM(PUNTERO4,DIMENSION4); GETIMAGE(ROUND(475*COTE1),ROUND(40*COTE2),ROUND(600*COTE1),ROUND(120*COTE2),PU NTERO4^); SETFILLSTYLE(1,COLOR1); BAR(ROUND(485*COTE1),ROUND(50*COTE2),ROUND(585*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(490*COTE1),ROUND(55*COTE2),OSCILOSCOPIO) END ELSE BEGIN PUTIMAGE(ROUND(475*COTE1),ROUND(40*COTE2),PUNTERO4^,COPYPUT); IF ESC4=TRUE THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(485*COTE1),ROUND(50*COTE2),ROUND(585*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(490*COTE1),ROUND(55*COTE2),OSCILOSCOPIO) END END END; IF CHIVATO1=5 THEN BEGIN IF PUNTERO8=NIL THEN BEGIN SETFILLSTYLE(1,7); BAR(ROUND(180*COTE1),ROUND(100*COTE2),ROUND(460*COTE1),ROUND(280*COTE2)); SETCOLOR(BLACK);

192

MANUAL DEL PROGRAMADOR: Programa principal

RECTANGLE(ROUND(190*COTE1),ROUND(110*COTE2),ROUND(450*COTE1),ROUND(270*COTE2)); SETLINESTYLE(0,1,3); SETCOLOR(BLACK); LINE(ROUND(195*COTE1),ROUND(273*COTE2),ROUND(452*COTE1),ROUND(273*COTE2)); LINE(ROUND(453*COTE1),ROUND(115*COTE2),ROUND(453*COTE1),ROUND(274*COTE2)); LINE(ROUND(220*COTE1),ROUND(216*COTE2),ROUND(427*COTE1),ROUND(216*COTE2)); LINE(ROUND(428*COTE1),ROUND(158*COTE2),ROUND(428*COTE1),ROUND(217*COTE2)); SETCOLOR(WHITE); SETLINESTYLE(0,0,1); SETTEXTSTYLE(2,0,5); IF GRAPHRESULT<>0 THEN SETTEXTSTYLE(0,0,1); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(230*COTE1),ROUND(130*COTE2),EVALUACION VERSION 1.00); SETFILLSTYLE(1,LIGHTBLUE); BAR(ROUND(215*COTE1),ROUND(153*COTE2),ROUND(425*COTE1),ROUND(213*COTE2)); SETCOLOR(COLOR3); OUTTEXTXY(ROUND(245*COTE1),ROUND(160*COTE2),JULIO MARTINEZ JUAN); OUTTEXTXY(ROUND(310*COTE1),ROUND(175*COTE2),&); OUTTEXTXY(ROUND(230*COTE1),ROUND(190*COTE2),EMILIO SAHUQUILLO DOBON); OUTTEXTXY(ROUND(200*COTE1),ROUND(230*COTE2),VALENCIA a 30 de MARZO de 1993); SETCOLOR(COLOR4); OUTTEXTXY(ROUND(340*COTE1),ROUND(250*COTE2),>>> Salir ESC); DIMENSION8:=IMAGESIZE(ROUND(180*COTE1),ROUND(100*COTE2),ROUND(460*COTE1),ROUND (280*COTE2)); GETMEM(PUNTERO8,DIMENSION8); GETIMAGE(ROUND(180*COTE1),ROUND(100*COTE2),ROUND(460*COTE1),ROUND(280*COTE2),PU NTERO8^); SETCOLOR(WHITE); SETTEXTSTYLE(0,0,1) END ELSE PUTIMAGE(ROUND(180*COTE1),ROUND(100*COTE2),PUNTERO8^,COPYPUT) END; {inicializamos valores} BAX2:=1; CHIVATO2:=1; BAY2:=FALSE; BAX3:=1; CHIVATO3:=1; BAY3:=FALSE; BAX4:=1; CHIVATO4:=1; BAY4:=FALSE; REPEAT DESCARGARTECLADO; RESALTO:=ORD(READKEY); IF (CHIVATO1=2) AND ((RESALTO=27) OR (RESALTO=13)) THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(150*COTE1),ROUND(200*COTE2),ROUND(490*COTE1),ROUND(280*COTE2)) END; 2: IF ((CHIVATO1=1) AND (RESALTO=80)) OR (BAY2=TRUE) THEN BEGIN IF BAX2=3 THEN BAX2:=0; IF BAX2=-1 THEN BAX2:=2;

193

MANUAL DEL PROGRAMADOR: Programa principal

IF BAX2=0 THEN BEGIN PUTIMAGE(ROUND(85*COTE1),ROUND(40*COTE2),PUNTERO2^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(95*COTE1),ROUND(50*COTE2),ROUND(195*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(55*COTE2),FICHERO PSP); BAY2:=FALSE; CHIVATO2:=1 END; IF BAX2=1 THEN BEGIN PUTIMAGE(ROUND(85*COTE1),ROUND(40*COTE2),PUNTERO2^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(95*COTE1),ROUND(70*COTE2),ROUND(195*COTE1),ROUND(85*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(75*COTE2),CREAR); BAY2:=FALSE; CHIVATO2:=2 END; IF BAX2=2 THEN BEGIN PUTIMAGE(ROUND(85*COTE1),ROUND(40*COTE2),PUNTERO2^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(95*COTE1),ROUND(90*COTE2),ROUND(195*COTE1),ROUND(105*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(95*COTE2),TOLERANCIA); BAY2:=FALSE; CHIVATO2:=3 END; RESALTO:=0; BAX2:=BAX2+1 END; IF (RESALTO=72) AND (CHIVATO1=1) THEN BEGIN BAX2:=BAX2-2; BAY2:=TRUE; IF BAX2=-2 THEN BAX2:=-1; GOTO 2 END; 3: IF ((CHIVATO1=3) AND (RESALTO=80)) OR (BAY3=TRUE) THEN BEGIN IF BAX3=4 THEN BAX3:=0; IF BAX3=-1 THEN BAX3:=3; IF BAX3=0 THEN BEGIN PUTIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),PUNTERO3^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(55*COTE2),ROUND(500*COTE1),ROUND(70*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(60*COTE2),FECHA); BAY3:=FALSE; CHIVATO3:=1 END; IF BAX3=1 THEN BEGIN PUTIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),PUNTERO3^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(75*COTE2),ROUND(500*COTE1),ROUND(90*COTE2));

194

MANUAL DEL PROGRAMADOR: Programa principal

SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(80*COTE2),VER DIRECT); BAY3:=FALSE; CHIVATO3:=2 END; IF BAX3=2 THEN BEGIN PUTIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),PUNTERO3^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(95*COTE2),ROUND(500*COTE1),ROUND(110*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(100*COTE2),CH. DIRECT); BAY3:=FALSE; CHIVATO3:=3 END; IF BAX3=3 THEN BEGIN PUTIMAGE(ROUND(380*COTE1),ROUND(40*COTE2),PUNTERO3^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(390*COTE1),ROUND(115*COTE2),ROUND(500*COTE1),ROUND(130*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(400*COTE1),ROUND(120*COTE2),LOCALIZAR); BAY3:=FALSE; CHIVATO3:=4 END; RESALTO:=0; BAX3:=BAX3+1 END; IF (RESALTO=72) AND (CHIVATO1=3) THEN BEGIN BAX3:=BAX3-2; BAY3:=TRUE; IF BAX3=-2 THEN BAX3:=-1; GOTO 3 END; 4: IF ((CHIVATO1=4) AND (RESALTO=80)) OR (BAY4=TRUE) THEN BEGIN IF BAX4=3 THEN BAX4:=0; IF BAX4=-1 THEN BAX4:=2; IF BAX4=0 THEN BEGIN PUTIMAGE(ROUND(475*COTE1),ROUND(40*COTE2),PUNTERO4^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(485*COTE1),ROUND(50*COTE2),ROUND(585*COTE1),ROUND(65*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(490*COTE1),ROUND(55*COTE2),OSCILOSCOPIO); BAY4:=FALSE; CHIVATO4:=1 END; IF BAX4=1 THEN BEGIN PUTIMAGE(ROUND(475*COTE1),ROUND(40*COTE2),PUNTERO4^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(485*COTE1),ROUND(70*COTE2),ROUND(585*COTE1),ROUND(85*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(490*COTE1),ROUND(75*COTE2),DOS-SHELL); BAY4:=FALSE; CHIVATO4:=2

195

MANUAL DEL PROGRAMADOR: Programa principal

END; IF BAX4=2 THEN BEGIN PUTIMAGE(ROUND(475*COTE1),ROUND(40*COTE2),PUNTERO4^,COPYPUT); SETFILLSTYLE(1,COLOR1); BAR(ROUND(485*COTE1),ROUND(90*COTE2),ROUND(585*COTE1),ROUND(105*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(490*COTE1),ROUND(95*COTE2),ABANDONAR); BAY4:=FALSE; CHIVATO4:=3 END; RESALTO:=0; BAX4:=BAX4+1 END; IF (RESALTO=72) AND (CHIVATO1=4) THEN BEGIN BAX4:=BAX4-2; BAY4:=TRUE; IF BAX4=-2 THEN BAX4:=-1; GOTO 4 END;

{por las teclas de funcin y combinadas} IF RESALTO=19 THEN BEGIN ABANDONAR; IF PULSA IN [S,s] THEN HALT END; IF (RESALTO=61) AND (CHIVATO1<>2) THEN VALORTOLERANCIA; IF RESALTO=62 THEN BEGIN SALIDA_AL_DOS; CHIVATO1:=1; RESALTO:=27 END UNTIL (RESALTO=13) OR (RESALTO=27); IF RESALTO=27 THEN BEGIN IF PUNTERO5=NIL THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(35*COTE1),ROUND(41*COTE2),ROUND(600*COTE1),ROUND(150*COTE2)); DIMENSION5:=IMAGESIZE(ROUND(35*COTE1),ROUND(41*COTE2),ROUND(600*COTE1),ROUND(1 50*COTE2)); GETMEM(PUNTERO5,DIMENSION5); GETIMAGE(ROUND(35*COTE1),ROUND(41*COTE2),ROUND(600*COTE1),ROUND(150*COTE2),PUN TERO5^) END ELSE PUTIMAGE(ROUND(35*COTE1),ROUND(41*COTE2),PUNTERO5^,COPYPUT); IF CHIVATO1=1 THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(85*COTE1),ROUND(20*COTE2),ROUND(195*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(100*COTE1),ROUND(27*COTE2),CONFIGURAR);

196

MANUAL DEL PROGRAMADOR: Programa principal

ESC1:=TRUE END; IF CHIVATO1=2 THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(230*COTE1),ROUND(20*COTE2),ROUND(330*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(250*COTE1),ROUND(27*COTE2),EJECUTAR); ESC2:=TRUE END; IF CHIVATO1=3 THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(365*COTE1),ROUND(20*COTE2),ROUND(460*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(380*COTE1),ROUND(27*COTE2),APLICA-2); ESC3:=TRUE END; IF CHIVATO1=4 THEN BEGIN SETFILLSTYLE(1,COLOR1); BAR(ROUND(500*COTE1),ROUND(20*COTE2),ROUND(575*COTE1),ROUND(40*COTE2)); SETCOLOR(WHITE); OUTTEXTXY(ROUND(520*COTE1),ROUND(27*COTE2),SALIR); ESC4:=TRUE END; IF CHIVATO1=5 THEN BEGIN SETFILLSTYLE(1,BLACK); BAR(ROUND(180*COTE1),ROUND(100*COTE2),ROUND(460*COTE1),ROUND(280*COTE2)); SETFILLSTYLE(1,COLOR1); BAR(ROUND(48*COTE1),ROUND(20*COTE2),ROUND(72*COTE1),ROUND(40*COTE2)); SETFILLSTYLE(1,GREEN); PIESLICE(ROUND(60*COTE1),ROUND(30*COTE2),1,360,ROUND(7*COTE1)); SETCOLOR(WHITE); RECTANGLE(ROUND(51*COTE1),ROUND(21*COTE2),ROUND(69*COTE1),ROUND(39*COTE2)); ESC5:=TRUE END; GOTO 5 END; IF (RESALTO=13) AND (CHIVATO1=1) AND (CHIVATO2=1) THEN BEGIN RESTORECRTMODE; CLRSCR; FICHERO_PSPICE; SETGRAPHMODE(MODO) END; IF (RESALTO=13) AND (CHIVATO2=2) THEN BEGIN IF CREAR=A DISCO: SI THEN CREAR:=A DISCO: NO ELSE CREAR:=A DISCO: SI; IF CREADO1=TRUE THEN CREADO2:=FALSE; IF CREADO1=FALSE THEN CREADO2:=TRUE END; IF (RESALTO=13) AND (CHIVATO2=3) THEN VALORTOLERANCIA; IF (RESALTO=13) AND (CHIVATO1=3) AND (CHIVATO3=1) THEN BEGIN RESTORECRTMODE; FECHA;

197

MANUAL DEL PROGRAMADOR: Programa principal

SETGRAPHMODE(MODO) END; IF (RESALTO=13) AND (CHIVATO3=2) THEN BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(COLOR5); CLRSCR; REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); GOTOXY(3,2); TEXTCOLOR(COLOR6); WRITELN(INTRODUCE UNIDAD, CAMINO Y PARAMETROS SOBRE LOS QUE LISTAR); GOTOXY(3,3); WRITE((pulsa INTRO para ver ayuda)); IF LENGTH(DIRECTORIO)<30 THEN WRITELN( DTO. actual : ,DIRECTORIO); RAYA_HORIZONTAL(2,79,4,WHITE); TEXTCOLOR(COLOR6); WINDOW(3,5,78,24); DESCARGARTECLADO; READLN(VER); SWAPVECTORS; EXEC(ESPACIO1.EXE,VER); ERRORDIRECTORIO:=DOSERROR; IF ERRORDIRECTORIO=2 THEN BEGIN CURSOROFF; ERROR(32761) END; IF (ERRORDIRECTORIO<>0) AND (ERRORDIRECTORIO<>2) THEN BEGIN CURSOROFF; ERROR(ERRORDIRECTORIO) END; SWAPVECTORS; CURSOROFF; TEXTBACKGROUND(COLOR5); TEXTCOLOR(COLOR11); IF ERRORDIRECTORIO<>0 THEN GOTOXY(1,20); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE para salir); TEXTCOLOR(COLOR6); DESCARGARTECLADO; VER:=READKEY UNTIL VER=#27; SETGRAPHMODE(MODO) END; IF (RESALTO=13) AND (CHIVATO3=3) THEN CAMBIARDIRECTORIO; IF (RESALTO=13) AND (CHIVATO3=4) THEN BEGIN RESTORECRTMODE; WINDOW(1,1,80,25); TEXTBACKGROUND(COLOR5); CLRSCR;

198

MANUAL DEL PROGRAMADOR: Programa principal

REPEAT CURSORON; WINDOW(1,1,80,25); CLRSCR; DIBUJARCUADRO(2,1,79,25,WHITE,COLOR5); GOTOXY(3,2); TEXTCOLOR(COLOR6); WRITELN(INTRODUCE UNIDAD, CAMINO Y/O ESPECIFICADOR); GOTOXY(3,3); WRITE((pulsa INTRO para ver ayuda)); IF LENGTH(DIRECTORIO)<30 THEN WRITELN( DTO. actual : ,DIRECTORIO); RAYA_HORIZONTAL(2,79,4,WHITE); TEXTCOLOR(COLOR6); WINDOW(3,5,78,24); DESCARGARTECLADO; READLN(VER); SWAPVECTORS; EXEC(LOCALIZA.EXE,VER); ERRORDIRECTORIO:=DOSERROR; IF ERRORDIRECTORIO=2 THEN BEGIN CURSOROFF; ERROR(32760) END; IF (ERRORDIRECTORIO<>0) AND (ERRORDIRECTORIO<>2) THEN BEGIN CURSOROFF; ERROR(ERRORDIRECTORIO) END; SWAPVECTORS; CURSOROFF; TEXTBACKGROUND(COLOR5); TEXTCOLOR(COLOR11); IF ERRORDIRECTORIO<>0 THEN GOTOXY(1,20); WRITE(pulsa CUALQUIER TECLA para repetir, ESCAPE para salir); TEXTCOLOR(COLOR6); DESCARGARTECLADO; VER:=READKEY UNTIL VER=#27; SETGRAPHMODE(MODO) END; IF (RESALTO=13) AND (CHIVATO4=2) THEN BEGIN SALIDADOS:=TRUE; SALIDA_AL_DOS END; IF (RESALTO=13) AND (CHIVATO4=1) AND (CHIVATO1=4) THEN BEGIN VISUALIZACION_DE_ONDAS; MODO:=GETMAXMODE; SETGRAPHMODE(MODO) END; IF BAX4=3 THEN BEGIN ABANDONAR; IF PULSA IN [S,s] THEN HALT; IF PULSA IN [N,n] THEN BAX4:=1

199

MANUAL DEL PROGRAMADOR: Programa principal

END; CLEARVIEWPORT; UNTIL BAX4=3; CLOSEGRAPH; LIBERARMEMORIA; LOWVIDEO; TEXTMODE(C80); END.

200