RE:Alguien que me encuentre los errores!!!!
Bien, tengo algo mejor, Serguei y Roberto.
Se trata de poner una llamada a un procedimiento creado por nosotros en la cola de interrupciones del DOS que mantiene el reloj del sistema, de forma tal que cada vez que el DOS actualiza el reloj (una vez cada centecima de segundo) llame además a nuestro procedimiento.
Para ello tendremos que "colgar" nuestro procedimiento, esto lo haremos mediante una combinación de llamadas a los procedimientos estandar de la unidad dos de TP, GetInVec y SetInVec.
GetIntVec() devuelve un puntero con la dirección de memoria de la interrupción solicitada, la interrupción del reloj es la $1C.
SetIntVec() hace lo contrario, pone la dirección de memoria donde está el inicio del procedimiento que queremos agregar a la cola de interrupciones.
Para saber cuál es la dirección de memoria de un procedimiento usaremos la función Addr().
El procedimiento que colgaremos de la cola lo único que hará será llamar a GetTime para tomar la hora actual. Este procedimiento no puede ser cualquier cosa, debido a que el DOS necesita que cumpla algunas condiciones especiales, NO se pueden usar strings dentro del procedimiento y no se pueden hacer excesivas llamadas a Write o WriteLn y algunos otros detalles que sería extenso de explicar así que por ahora confien en mi :D.
Veamos:
uses Dos, Crt;
var
Int1CSave : Pointer; { puntero genérico a memora para respaldar la cola antigua }
procedure Ya(hh, mm, ss, cc:word); { este procedimiento recibirá la hora "desde adentro }
begin
gotoxy(10,10);
Write(hh:2,':',mm:2,':',ss:2);
end;
{$F+,S-,W-} { directivas de compilación }
procedure TimerHandler; interrupt; { procedimiento tipo interrupción }
var
hh,mm,ss,cc:word;
begin
GetTime(hh,mm,ss,cc); { se toma la hora actual }
gotoxy(65,1);
Write(hh,':',mm,':',ss);
Ya(hh, mm, ss, cc); { se la pasamos a un procedimiento "externo" }
end;
{$F-,S+}
begin
ClrScr; { borra la pantalla }
GetIntVec($1C,Int1CSave); { resguarda la cola de interrupciones actual }
SetIntVec($1C,Addr(TimerHandler)); { agrega nuestro procedimiento a la cola }
writeln('Ves la hora en la esquina superior derecha?');
ReadKey;
SetIntVec($01C,Int1CSave); { restaura la cola guardada ¡muy importante! }
end.
En el procedimiento Ya() debería ir el código que evalúa la hora para disparar los eventos que nos interesan. No se puede poner mucho código en el procedimiento TimeHandler pues un proc. tipo interrupt no debe superar cierto tamaño en memoria sino producirá un cuelgue del sistema.