Displaying Source Code(s)
|
|
A TSR CLOCK.
--------------------------------------------------------------------------------
Description : This is the TSR clock in c language. Every time
when dos run u have to run exe file of this source code and you
get result. This utility works properly only in the text mode.
Since the time is to be displayed by directly writing it into
VDU memory it is necessary to find out the base address of the
VDU memory. This address depends on the initial video mode in
which the computer has booted. The initial video mode is stored
at bits 4 and 5 location 0x410. If both the bits are on then the
computer must have booted in monochrome text mode, otherwise in
CGA text mode. Hence, to begin with, in main( ) the initial
video mode is determined and the corresponding base address is
stored in scr. Next the contents of IVT are changed such that
the routine mytimer() would get called whenever the timer ticks,
and the program is made resident by calling keep( ).
#include "dos.h"
void interrupt ( *prevtimer )( ) ;
void interrupt mytimer( ) ;
int running = 0 ;
unsigned long far *time = ( unsigned long far * ) 0x46C ;
char far *scr ;
char far *mode ;
main( )
{
/* peek into location 0:410h and determine video mode */
if ( ( *mode & 0x30 ) == 0x30 )
scr = ( char far * ) 0xB0000000 ;
else
scr = ( char far * ) 0xB8000000 ;
prevtimer = getvect ( 8 ) ;
setvect ( 8, mytimer ) ;
keep ( 0, 1000 ) ;
}
void interrupt mytimer( )
{
unsigned char hours, sec, min ;
if ( running == 0 )
{
running = 1;
hours = ( *time / 65520 ) ;
min = ( *time - hours * 65520 ) / 1092 ;
sec = ( *time - hours * 65520 - min * 1092 ) * 10 / 182 ;
if ( sec >= 60 )
{
sec -= 60 ;
min++ ;
if ( min == 60 )
{
min = 0 ;
hours++ ;
if ( hours == 24 )
hours = 0 ;
}
}
/* display digital clock */
writechar ( 48 + hours / 10, 0, 72, 112 ) ;
writechar ( 48 + hours % 10, 0, 73, 112 ) ;
writechar ( ':', 0, 74, 112 ) ;
writechar ( 48 + min / 10, 0, 75, 112 ) ;
writechar ( 48 + min % 10, 0, 76, 112 ) ;
writechar ( ':', 0, 77, 112 ) ;
writechar ( 48 + sec / 10, 0, 78, 112 ) ;
writechar ( 48 + sec % 10, 0, 79, 112 ) ;
running = 0 ;
}
( *prevtimer )( ) ;
}
writechar ( char ch, int row, int col, int attr )
{
*( scr + row * 160 + col * 2 ) = ch ;
*( scr + row * 160 + col * 2 + 1 ) = attr ;
}
|
|
|