CS609 Assignment 2 Solution and Discussion

Semester: Fall 2019
CS609: System Programming
Graded
Assignment No. 02 Total Marks: 20

Due Date: Dec 02, 2019

Instructions:

Please read the following instructions carefully before submitting assignment. It should be clear that your assignment will not get any credit if:

 The assignment is submitted after due date.
 The submitted assignment does not open or file is corrupt.
 You have not followed steps described in Detailed Instructions of the problem statement.
 Assignment is copied (partial or full) from any source (websites, forums, students, etc.) Strict action will be taken in this regard.

Note: You have to upload only .doc or .docx file. Assignment in any other format (extension) will not be accepted and will be awarded with zero marks.

Objectives:

The objective of this assignment is to provide hands-on experience of System Programming concepts including:

• How can interrupts be generated
• What are Interrupts
• Interrupt functions writing
• TSR program
• Calling interrupt functions

For any assignment related query, contact at
[email protected]

Problem Statement:
You are required to write C program which will display one ‘*’ character on the screen on each CPU timer interrupt 8 in a way that each * character is displayed after the previous *. i.e


On elapse of 7 seconds then the screen characters should be removed and again the * character should be started printing on the screen in similar way i.e *********
This process should be continued again and again until you press any key from the keyboard.
Instructions:

  1. You should include all related header files first of all then declare interrupt pointer to hold Timer i.e void interrupt (*oldTimer)(void);
  2. Similarly, give prototype for new functions of newtimer() i.e void interrupt newTimer();
  3. Declare a far pointer i.e *scr to hold far address =0xB8000000;
  4. Store current vector values of INT 8 through getvect in oldTimer.
  5. Set newTimer fuctions through setvect.
  6. In newTimer() function, give logic to print ‘*’ on the screen i.e *(scr+i)=0x2A;
  7. Write code to wait for 7 seconds i.e t>=126 and through loop write blank spaces on the screen by setting keyboard status with black background i.e no character on screen i.e
    *(scr+i)=ox20;
    *(scr+i+1)=ox07;
  8. When any key is pressed from the keyboard, the program should stop.
    Note: Your assignment should Word file (.doc or .docx) containing your code.

Best of Luck!

Solution:

// Header Files
#include<stdio.h>
#include<conio.h>
#include<BIOS.H>
#inlcude<DOS.H>
void interrupt (*oldTimer)(*void); // To store current Timer vector
void interrupt newTimer();     //New Timer Function
char far *scr= (char far *)0xB8000000; //Screen segment
int in, t=0;
void main()
{
  clrscr();
  oldTimer=getvect(8);
  setvect(8,newTimer);
  getch();
}
void interrupt newTimer();
{
*(scr+t)=0x2A;
t++;
if(t>=126) 
{
for(i=0;i<4000;i+=2)
  {
      *(scr+i)=0x20;            // Blank screen
      *(scr+i+1)=0x07;
   }
    t=0;
}
(*oldTimer)();
}
}

Solution:

// Header Files
#include<stdio.h>
#include<conio.h>
#include<BIOS.H>
#inlcude<DOS.H>
void interrupt (*oldTimer)(*void); // To store current Timer vector
void interrupt newTimer();     //New Timer Function
char far *scr= (char far *)0xB8000000; //Screen segment
int in, t=0;
void main()
{
  clrscr();
  oldTimer=getvect(8);
  setvect(8,newTimer);
  getch();
}
void interrupt newTimer();
{
*(scr+t)=0x2A;
t++;
if(t>=126) 
{
for(i=0;i<4000;i+=2)
  {
      *(scr+i)=0x20;            // Blank screen
      *(scr+i+1)=0x07;
   }
    t=0;
}
(*oldTimer)();
}
}

#include <dos.h>
void interrupt (*oldTimer)( ); //corrected
void interrupt (*oldKey)( ); //corrected
void interrupt newTimer ( );
void interrupt newKey ( );
char far *scr = (char far* ) 0xB8000000;
int i, t = 0, m = 0;
char charscr [4000];
void main( )
{
oldTimer = getvect(8);
oldKey = getvect (9);
setvect (8,newTimer);
setvect (9,newKey);
getch();
getch();
getch();
getch();
}
void interrupt newTimer ( )
{
t++;
if ((t >= 182) && (m == 0))
{
for (i =0; i < 4000; i ++)
charscr [i] = *(scr + i);
for (i =0; i <=4000; i +=2)
{
*(scr + i) = 0x20;
*(scr + i + 1) = 0x07;
}
t = 0; m = 1;
}
(*oldTimer) ( );
}
void interrupt newKey ( )
{
int w;
if (m == 1)
{
for (w =0; w < 4000; w ++)
*(scr + w) = charscr [w];
m = 0;
}
(*oldKey) ( );
}