Alarm - Proyecto de implementación de un TSR en MS-DOS
1. Universidad Tecnológica Centroamericana
Ingeniería de Sistemas
Sistemas Operativos I - 1995
Prof. : Egdares Futch H.
Proyecto #1
Alarm - Un utilitario para servicios de alarma
Motivación
El computador personal es una herramienta de trabajo, cuyo papel se ha id o extendiendo cada
vez más en todas las áreas de una oficina moderna. Se utiliza como agenda, máquina de escribir, etc.
Sin embargo, el estar trabajando en una PC por lo general absorbe tanto a quien la utiliza, que
frecuentemente se olvidan citas importantes o eventos interesantes.
Por lo tanto, este proyecto consiste en un programa capaz de estar residente en memoria, para
que quienes lo utilizen puedan trabajar en otras aplicaciones, que maneje hasta cuatro horas de alarma
distintas, y genere un evento que llame la atención del usuario, para recordarle horas importantes.
Descripción
Este proyecto está orientado a manejar el concepto de interrupts e interrupt service routines, en
base al hardware de la PC, la cual posee un sistema de interrupciones prioritizadas, con un reloj que
interrumpe 18.2 veces por segundo al programa principal. Esto hace posible que se pueda comparar
continuamente la hora actual con la hora de las alarmas que el usuario haya pedido. En el momento de
llegar el tiempo de una alarma, el programa debe sacar una ventana en pantalla indicando al usuario que
ya es hora. Debe eliminarse esta alarma de la tabla de alarmas y quitar la ventana de la pantalla, dejando
lo que estaba antes.
El proyecto debe consistir en un programa, alarm.exe, que acepte en su línea de comandos
los siguientes parámetros :
Help
Invocada como -h, esta opción hace que el programa imprima un mensaje detallando el uso de
todos los parámetros que éste tiene. Ejemplo :
C> alarm -h
Add alarm
Invocada como -a, esta opción le dice al programa que debe alertar al usuario en la hora
especificada. Si el programa no está residente, debe quedar residente, mientras que si éste se encuentra
ya residente, debe pasarle los parámetros a la copia residente. Ejemplo :
C> alarm -a 1830
List alarms
Invocada como -l, esta opción imprime en pantalla la lista de alarmas que se encuentran
activadas actualmente. Ejemplo :
C> alarm -l
2. Delete alarm
Invocada como -d, este parámetro indica a alarm que debe buscar dicha alarma y eliminarla de
su tabla. Ejemplo :
C> alarm -d 1830
Requerimientos
El programa a entregar debe cumplir con los siguientes requerimientos:
- Escrito en Turbo Pascal 6.0 ó mayor.
- Debe aceptar parámetros únicamente por la línea de comandos.
- Debe instalarse residente una única vez.
- Debe utilizar una tabla de 4 alarmas máximo.
- Debe alertar al usuario con un mensaje en la pantalla.
- Mensajes de error apropiados.
Fecha de entrega y documentación a entregar
La fecha de entrega será el lunes 6 de febrero de 1995 a las 18:30 horas en el período de clase.
NO habrán prórrogas, ni excusas. La documentación a entregar consistirá en (no folders) :
- Diskette con el proyecto (3.5", sin virus)
- Carátula con nombre, carnet, nombre de proyecto
- Descripción y funcionamiento del proyecto (1 hoja máx.)
- Cómo se usa el proyecto (lo necesario)
- Descripción de rutinas y procedimientos usados
- Comentarios de implementación (opcional, puede mejorar nota)
- Listado del programa
Hints
Para realizar el proyecto final, existen varias formas de obtener la hora actual, incluyendo la
utilización de la función GetTime de MS-DOS. Sin embargo MS-DOS no es reentrante. Esto dará lugar a
complicaciones y además, hace que la rutina de interrupt instalada se vuelva muy lenta.
Sin embargo, existe otra forma de hacerlo, la cual es la recomendada a implementar en este
proyecto : leer directamente el contador de tiempo que el BIOS mantiene.
La forma de realizar esto es la siguiente:
El BIOS mantiene en la dirección 0000:046Ch el número de ticks necesarios para reflejar la hora
actual en un integer de 4 bytes (double word). Cada timer tick (18.2 veces por segundo) se activa INT
08h, quien incrementa este valor en 1. Se recomienda que se intercepte el interrupt 1Ch, para evitar
problemas. Luego de que este valor alcanza la medianoche (el valor de medianoche es 1800B0h), se
pone en 0, y el byte localizado en la dirección 0000:0470h se pone en 1.
Para hacer uso de esto, uds. deben convertir todos los valores de hora que se les pase como
parámetros, a ticks de reloj, y hacer las comparaciones para ver si ya se ha llegado a alguna alarma en
base a estos valores.
3. Deben investigar las funciones Keep(), GetIntVec(), SetIntVec(), y Ptr().
El proyecto requiere de bastante planificación, por lo que espero que esto les ayude a
terminarlo bien, no a empezarlo a última hora.