CS609 Assignment 2 Solution and Discussion
-
Semester: Fall 2019
CS609: System Programming
Graded
Assignment No. 02 Total Marks: 20Due 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 functionsFor 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:- You should include all related header files first of all then declare interrupt pointer to hold Timer i.e void interrupt (*oldTimer)(void);
- Similarly, give prototype for new functions of newtimer() i.e void interrupt newTimer();
- Declare a far pointer i.e *scr to hold far address =0xB8000000;
- Store current vector values of INT 8 through getvect in oldTimer.
- Set newTimer fuctions through setvect.
- In newTimer() function, give logic to print ‘*’ on the screen i.e *(scr+i)=0x2A;
- 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; - 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)(); } }
-
#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) ( ); }
-
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)(); } }