[Back to ISR SWAG index] [Back to Main SWAG index] [Original]
{$M 2000, 0, 0} { When writing TSR's you have to }
Program Clock; { use the $M directive }
Uses Dos;
Var
oldint: Procedure;
Procedure Write2scr (s: String; color, x, y: Byte);
Var
counter1,
counter2: Byte;
begin { In TSR's you always }
counter1 := 2 * (x + y * 80); { need to use direct }
For counter2 := 1 to ord(s[0]) do { screen Writes. }
begin { }
mem [$b800: counter1] := ord(s[counter2]);
inc (counter1);
mem [$b800: counter1] := color;
inc (counter1);
end; {do}
end; {Write2SCR}
{$F+} { All Procedures will now be Far Procedures }
Procedure int_Hook; interrupt;
Var
hour, { Where the Hour will be stored }
min: Word; { " " " " minute " " }
hS, { Where STR Hour will be stored }
MS: String[2]; { STR Min }
begin
hour := memW[$0000:$046e];
min := (memW[$0000:$046c] div 18) div 60;
{ The above 2 lines of code give the hour & minute.. How?? The first
memory location gives the hour thats easy, but the minutes are a
little more tricky... The interrupt i'm gonna hook into is int 8
... it is called approximately 18.2 times/second. When its called,
it increments 0000:046c hex. When it overflows, it inc's 0000:046e
(which is the hour in 24 hr Format) so, dividing by 18 would give
us the approximate second in the hour, div'ding by 60 then gives
the hour }
if hour > 12 then dec(hour, 12); { Converts from 24 hr Format }
str(min, MS);
str(hour, HS);
Write2scr (HS, 9, 77 - ord(hs[0]), 0); { Writes to screen }
Write2scr (MS, 12, 78, 0);
Write2scr (':',10, 77, 0);
Inline ($9c); { Push the flags ( you have }
oldint; { to do this beFore any int }
{ call like this }
end; {inT_HOOK}
{$F-} { No more Far Procedures }
begin
getintvec (8, @oldint); { Hooks the interrupt }
setintvec (8, addr(int_hook));
keep (0); { Makes it stay resident }
end.
[Back to ISR SWAG index] [Back to Main SWAG index] [Original]