Explicación del Programa Emisor El programa emisor comienza con varios includes, uno especial para poder manejarse en C++, el IOSTREAM.H . Luego de los includes, se encuentran los defines de puerto serie y sus registros y del LPT, con el propósito de facilitar el uso de los registros mientras que se crea el código del programa. El programa comienza con unas estructuras importantes que son la base del sistema de acceso (clase CITANOVA). Estas estructuras son “agenda”, que va a mantener el nombre, apellido y contraseña del ingresante para su corroboración posterior. La estructura NODE, permite el enlace de los datos para crear una estructura avanzada de datos de los mismos. Antes de empezar, aclaramos el uso de las funciones WRIADV, ERASECURSOR, VERIFY. La función ERASECURSOR consiste en la utilización de interrupciones de software para modificar el espesor del cursor, por lo tanto nosotros lo medicamos para que desaparezca. La función VERIFY es una función que protege el uso de “teclas prohibidas” durante uno mande datos por el puerto serie. Estas teclas son: F1 hasta F12, y el backspace. Cabe acotar que se usan dos getch en la funcion, porque el tamaño de los F1, F2, F3, etc., es de 2 bytes, por lo tanto con un solo getch() no se podia abarcar la información hexadecimal del carácter. La función WRIADV se encarga de una de las opciones del programa principal, y nos permite escribir propagandas, abriendo una corriente de un archivo en modo write y mandar cada carácter que escribimos al mismo para después ser leídos por la función PUBLISH que comentaremos mas adelante. Hay dos variables importantes en esta funcion, datododo y datododo2, siendo la primera la que reciba de teclado el carácter y con fputc se escriba en la corriente de archivo y la segunda un carácter inicializado como ‘-‘ que con un while se escribira en la corriente, para separar una propaganda de otra. Tambien usamos una clase llamada WRITEN que nos permite visualizar los datos en la pantalla mientras los escribimos. (La clase crea una lista de nodos que tienen como dato l carácter que nosotros tomamos de teclado). Hablemos ahora de la clase CITANOVA, en su parte privada se crea un header *h y un indicador de ultimo lugar *l que van a servir para indicarnos el primer objeto y el ultimo, respectivamente, de la estructura avanzada. En el constructor CITANOVA(), se inicializan las variables y el flag FFLAG en 1 que va a servir para indicarnos mas adelante si hubo concordancia entre los datos ingresados y los que fueron levantados del archivo. Para el programa en si, no era necesario ordenar alfabéticamente los datos ingresados, ya que lo que hacemos nosotros es nada mas verificar si existe en la lista que obtuvimos por archivo, pero existen en la clase funciones de ordenamiento, las cuales son: PUTFIRST() , PUTEND(), INSERT () y la función LOOPIN, que es la que va a manejar a las primeras según la posición que deban tomar los datos que se ingresaron. Por lo tanto explicaremos la función LOOPIN que va a abarcar a las demás. LOOPIN es el encargado de ingresar los datos a la lista, y aunque su funcionalidad no este %100 aprovechada en el programa, brevemente explicaremos que cuando se ingresa un dato, la función los ordena en orden alfabético. PUTFIRST es el encargado de ingresar un dato en forma de pila, ya sea porque es el primer nodo de la lista o porque el nombre es alfabéticamente superior en orden. Luego se procede a recorrer los nodos de la lista y nos vamos preguntando si la misma llego al final o si hay un nodo que tenemos que ingresar en algún lado en particular de la estructura de datos. Por lo tanto con la función INSERT, pasamos la dirección donde se tiene que enganchar el nuevo nodo y los datos. Por último, tenemos que averiguar si llego al final de la lista, porque si fue así tenemos que agregar el nodo al final, deduciendo que los datos del nodo nuevo son alfabéticamente menor en orden. Una vez ingresados los datos, mientras se corra el programa, se utilizara la función SEARCH, que ingresando los datos por una estructura auxiliar, se recorre la lista y se verifica si existen entre los nodos de la lista. En caso afirmativo se activa el flag ya nombrado FFLAG. Ahora que terminamos con esta clase, veremos que hay unas funciones declaradas antes del main. INIT() es la función que inicializa el puerto serie, el vector de interrupciones, la máscara de interrupciones y salva guarda los registros de la UART. RESUME es una funcion que guarda en el archivo RESUMEN.TXT los datos de los caracteres enviados y las palabras enviadas en la ultima sesión del programa. LASTRESUME lee los datos del archivo RESUMEN.TXT y los imprime en pantalla. La funcion SEND es una de las más importantes porque es la que envía los datos que se obtienen por teclado al puerto serie. La funcion contiene contadores y se maneja con la lista WRITEN usando su función SHOW ( que sirve para mostrar los datos que vamos ingresando) Mientras no se oprima la tecla ESC, se llamara a la función SEND indefinidas veces y esta espera a que el flag THRELIBRE (de lógica negada) se active en 0 para poder realizar la obtención del dato, la verificación del mismo y el backup de este en un buffer auxiliar. Luego se manda al puerto serie y al finalizar se verifica si el dato fue un ENTER o un SPACE para facilidades de visualización en pantalla. Obviamente el flag THRELIBRE queda inactivo en 1, esperando a que la ISR nueva de la interrupción del puerto serie de Registro de Transmisión Vacío lo active de vuelta en 0, indicando que el registro esta listo para recibir un dato nuevo. La otra función importante es PUBLISH que será la encargada de leer los archivos con publicidades para poder mandarlas al puerto serie. Por lo tanto, la función utiliza un sistema switch, que indicando la publicidad deseada, el archivo con la misma se carga enana corriente y por un método parecido al de la función SEND (con el del flag THRELIBRE) manda al puerto la información caracter por caracter. Ya sea en cualquiera de estas dos funciones, hay una corriente ARCH que graba todos los datos enviados en el archivo MANDADO.TXT . Como último, tenemos *OLDINTCOM y INTCOM, donde OLDINTCOM es un puntero a función de interrupción, que va a apuntar a la rutina antigua de interrupción del puerto serie, y INTCOM será nuestra nueva rutina de interrupción. En la función INIT hacemos el enganche de la nueva rutina de interrupción con la nueva con los comandos getvect (que obtiene la direccion actual) y setvect (que coloca la nueva rutina en el vector de interrupciones).