/******************************************************************/ /* This is an example program to illustrate how to; */ /* 1. Get the time and date from DOS */ /* 2. Set the cursor to any position on the screen */ /* 3. Read characters from the keyboard and display their codes */ /* 4. How to scroll a window up on the monitor */ /* 5. Format a program for ease of reading and understanding */ /* 6. How to do proper prototyping */ /******************************************************************/ void draw_box(void); void disp_char(int inchar); void get_time(int *hour,int *minute,int *second); void disp_time_date(void); void pos_cursor(char row,char column); void scroll_window(void); #include "stdio.h" #include "dos.h" #include "conio.h" int main() { int hour, minute, sec, old_sec; int character; draw_box(); /* draw the boxes around the fields */ old_sec = 0; /* this variable stores the old time so we can look for a change */ do { if (kbhit()) { /* has a key been hit? */ character = getch(); /* read it in */ disp_char(character); /* display it */ } get_time(&hour,&minute,&sec); /* get the time of day */ if (sec != old_sec) { /* if it has changed, */ disp_time_date(); /* update the display */ old_sec = sec; /* save new time */ } } while (character != 'Q'); /* Quit when a Q is found */ pos_cursor(0,0); /* put cursor at top of screen */ } /* **************************************************** drawbox */ /* This routine draws a box on the screen. The keys hit, and */ /* the time and date are displayed in these boxes. There is */ /* nothing special about these boxes, they are simply output */ /* using the printf function. */ /* ************************************************************ */ void draw_box(void) { int index; char line[81]; for (index = 0;index < 80;index++) /* three blank rows */ line[index] = ' '; line[80] = NULL; /* end of string */ for (index = 0;index < 3;index++) printf("%s",line); line[8] = 201; /* draw top line of box */ for (index = 9;index < 70;index++) line[index] = 205; line[70] = 187; printf("%s",line); line[8] = 186; /* draw sides of large box */ for (index = 9;index < 70;index++) line[index] = ' '; line[70] = 186; for (index = 0;index < 15;index++) printf("%s",line); line[8] = 204; /* draw line between boxes */ for (index = 9;index < 70;index++) line[index] = 205; line[70] = 185; printf("%s",line); line[8] = 186; /* sides for time/date box */ for (index = 9;index < 70;index++) line[index] = ' '; line[70] = 186; printf("%s",line); line[8] = 200; /* bottom line of the box */ for (index = 9;index < 70;index++) line[index] = 205; line[70] = 188; printf("%s",line); for (index = 0;index < 80;index++) /* three blank rows */ line[index] = ' '; for (index = 0;index < 3;index++) printf("%s",line); } /* ************************************************** disp_char */ /* This routine displays the characters hit on the monitor. If */ /* the first character is a zero, a special character has been */ /* hit, and the zero is displayed. The next character is read, */ /* and it is displayed on the monitor. */ /* ************************************************************ */ void disp_char(int inchar) { scroll_window(); pos_cursor(17,15); /* position of message on screen */ if(inchar == 0) { printf(" 00 "); /* a special character was hit */ inchar = getch(); /* get the next part of it */ switch (inchar) { case 59 : case 60 : case 61 : case 62 : case 63 : /* these are the function keys */ case 64 : case 65 : case 66 : case 67 : case 68 : printf("%4d Function key F%d\n",inchar,inchar-58); break; case 94 : case 95 : case 96 : case 97 : case 98 : /* these are the ctrl-function keys */ case 99 : case 100 : case 101 : case 102 : case 103 : printf("%4d Function key Ctrl-F%d\n",inchar, inchar-93); break; case 84 : case 85 : case 86 : case 87 : /* these are the upper-function keys */ case 88 : case 89 : case 90 : case 91 : case 92 : case 93 : printf("%4d Function key Upper-F%d\n",inchar, inchar-83); break; case 104 : case 105 : case 106 : case 107 : case 108 : /* these are the alt-function keys */ case 109 : case 110 : case 111 : case 112 : case 113 : printf("%4d Function key Alt-F%d\n",inchar, inchar-103); break; default : printf("%4d Special key hit\n",inchar); } } else /* a regular character was hit */ printf(" %4d (%c) Character Hit.\n",inchar,inchar); pos_cursor(25,1); /* hide the cursor on the 26th line */ } /* *************************************************** get_time */ /* This routine calls the DOS function call for time of day. It */ /* returns the time of day to the calling program in the three */ /* pointers used in the call. */ /* ************************************************************ */ void get_time(int *hour,int *minute,int *second) { union REGS inregs; union REGS outregs; inregs.h.ah = 44; /* Hex 2C - Get current time */ int86(0x21,&inregs,&outregs); *hour = outregs.h.ch; *minute = outregs.h.cl; *second = outregs.h.dh; } /* ********************************************* disp_time_date */ /* This routine displays the time and date on the monitor in a */ /* fixed position. It gets the time from the get_time function, */ /* and gets the date from its own built in DOS call. Good */ /* programming practice would move the date to another function */ /* but this is an illustrative example to display methods of */ /* doing things. This routine also calls the cursor positioning */ /* function to put the time and date where we want them. */ /* ************************************************************ */ void disp_time_date(void) { int hour, minute, second; union REGS inregs; union REGS outregs; pos_cursor(19,19); /* position the cursor for date and time */ inregs.h.ah = 42; /* hex 2A - What is the date? */ int86(0x21,&inregs,&outregs); /* interrupt 21 */ printf("Date = %2d/%2d/%2d ", outregs.h.dh, /* month - 1 to 12 */ outregs.h.dl, /* day - 1 to 31 */ outregs.x.cx); /* year - 1980 to 2099 */ get_time(&hour, &minute, &second); printf("Time = %2d:%2d:%2d\n",hour, minute, second); pos_cursor(25,1); /* hide the cursor on the 26th line */ } /* ************************************************* pos_cursor */ /* This routine positions the cursor at the requested row and */ /* column. The upper left corner is row 0 and column 0 */ /* ************************************************************ */ void pos_cursor(char row,char column) { union REGS inregs; union REGS outregs; inregs.h.ah = 2; /* service 2 - position the cursor */ inregs.h.dh = row; inregs.h.dl = column; inregs.h.bh = 0; int86(0x10,&inregs,&outregs); /* interrupt 10 */ } /* ********************************************** scroll_window */ /* This routine scrolls all of the material in the key hit */ /* window up one space leaving room for another entry. */ /* ************************************************************ */ void scroll_window(void) { union REGS inregs; union REGS outregs; inregs.h.ah = 6; /* service 6 - scroll window */ inregs.h.al = 1; /* number of lines to scroll */ inregs.h.ch = 3; /* top row of window */ inregs.h.cl = 9; /* left column of window */ inregs.h.dh = 17; /* bottom row of window */ inregs.h.dl = 69; /* right column of window */ inregs.h.bh = 7; /* attribute of blank line */ int86(0x10,&inregs,&outregs); /* interrupt 10 */ }