CS-220, Sec. 50, 51
Lab # 8, 4-20-06, 4-27-06
Report Due Date: 5-4-06

In this lab you are to write a terminate-and-stay resident (TSR), COM-file
format assembly language program for a PC-compatible computer that installs
two interrupt service routines (ISRs). These ISRs will intercept the PC's
timer tick (type 8) interrupt and its keyboard (type 9) interrupt in order
to display a "digital clock" in the upper lefthand corner of the screen.
This clock should have a minutes digit, a colon, and two seconds digits.
(You may assume that the clock will never run for more than 9 minutes and
59 seconds.) The display should be something like the following:


where m will be the number of minutes (0-9) that have gone by since the
program began execution and ss the number of seconds (00-59) that have gone
by. The <F1>, <F2>, and <F3> keys will be used to "turn on" the digital
clock display, "turn off" the digital clock display, and reset the digital
clock display, respectively.

The ISR that intercepts the timer tick interrupt should update the seconds
(and minutes when necessary) every time one second has passed (i.e., every
18 timer ticks). After the update, control should be transfered to the old
timer tick interrupt service routine. If the display is "turned on" the
current time should be displayed as red characters on a green background
in the upper left-hand corner of the screen. This should be done by
accessing the video RAM directly, as explained in class. You may assume
that the computer has been set to its default text video mode (mode 3,
which is 80 X 25 X 16 colors). You are not to use int 10h services here.

The ISR that intercepts the keyboard interrupt should determine if the key
that was pressed was an <F1>, an <F2>, or an <F3>. If it was <F1>, the
display update should be "turned on". In other words after the user presses
<F1>, subsequently the upper lefthand corner of the display will be
updated every second. If the key pressed was <F2>, the display update
should be "turned off". In other words no subsequent display updates should
occur every second. (In fact, if the upper lefthand corner of the screen is
written to by whatever program is executing, the digital clock display will
be overwritten and should disappear--until the user presses the <F1> key
again to re-enable the display update.) Notice that even though the display
update is turned off, your TSR program should continue to keep track of how
much time has gone by. If the key that was pressed was <F3>, the time
should be reset to 0:00. Any other key press should cause control to be
transfered to the old keyboard interrupt service routine. (This should also
occur after the <F1>, <F2>, and <F3> keys have been processed.)

Your program should follow the general structure of the one-second beeper
program that was discussed in class and that is on one of the CS-220
"Sample Programs" web pages. (The new INT 8 ISR will, of course, have to
do more than just beep every time 18 timer ticks have gone by--namely, it
will have to write correct values to the correct Video RAM addresses so
that the display is updated if the display update is "turned on".) In
addition, your program will have to install a new INT 9 interrupt service
routine. This will mean adding some code to the "ldnvec" section of the
program that saves the old INT 9 vector and sets up the new INT 9 vector.
It will also mean adding a new section that might be called newisr9, in
which the code responds to the keyboard interrupt as described above. The
main idea here is that every time the keyboard interrupt comes along, the
scan code for the key pressed will be in port 60h. All your newint9 code
needs to do is input from that port, determine if the scan code is that of
the <F1>, <F2>, or <F3> key (3bh, 3ch, or 3dh, respectively), and set
appropriate variables before jumping to the old INT 9 handler.

You should demonstrate your program to the lab instructor. If that is not
possible you should turn in a diskette or CD with both the source code (.asm)
and the excutable (.exe). While the program is running, the computer user
should be able to perform other tasks. In other words, the DOS prompt
should be there, and the system should respond to DOS commands as usual.

You should submit the standard documentation--i.e., a readable, well-
documented .LST file, a hierarchy chart for the program, and flow charts
for the "ldnvec" part and for each each ISR.


For extra credit you may want to try one or more of the following:

Make the display move around on the screen. In other words, every so many
seconds the display should appear at some new place on the screen.

Make the "digital clock" become an "analog clock" in which a "second hand"
and a "minute hand" are drawn. This will be much more complex as it entails
drawing different straight lines on the screen. (The number of extra points
will be more as well.)