КУРСОВИЙ ПРОЕКТ
з дисципліни СИСТЕМНЕ ПРОГРАМУВАННЯ
Тема: розробити резидентну програму, яка реалізує ефект загортання при переміщенні курсору маніпулятора “миша”. В процесі переміщення по горизонталі, при спробі перейти за крайню праву позицію, курсор автоматично переноситься на початкову позицію зліва і навпаки. Аналогічно при переміщенні по вертикалі.
Анотація
В курсовому проекті проаналізований алгоритм роботи резидентної програми. На основі даного алгоритму написано резидентну програму, яка реалізує ефект загортання при переміщенні курсору маніпулятора “миша”. В процесі переміщення по горизонталі, при спробі перейти за крайню праву позицію, курсор автоматично переноситься на початкову позицію зліва і навпаки. Аналогічно при переміщенні по вертикалі.
Summary
In a course project there is the analysed algorithm of work of resident software. On the basis of the given algorithm resident software which will realize the effect of wrapping at moving to the cursor of manipulator “mouse” is written. In the process of moving on a horizontal line, at an attempt to pass for extreme right position, a cursor is automatically carried on home position on the left and vice versa. Like at moving on a vertical line.
Зміст
1 опис основних функцій, що використані в програмі, блок-схема програми 7
2 код резидентної програми з поясненнями (ремарками) 9
3 опис роботи 13
Висновки 15
Перелік використаних літературних джерел 16
1 опис основних функцій, що використані в програмі, блок-схема програми
Резидентна програма складається з наступних частин:
- загрузчика, який встановлює вектор переривання на нову процедуру обробки і передає управління операційній системі, залишивши резидентну частину програми в пам`яті;
- підпрограми обробки переривання.
При виконані поставленого завдання використано функції GETINTVECT (#oldvect,0x1c ) – дозволяє отримати адресу вказаного вектора підпрограми обробки переривання; SETINTVECT (,0x1c, CS, #newprochandl) – дозволяє встановити нову адресу підпрограми обробки заданого переривання для отримання адреси попередньої процедури обробки переривань від таймера та встановлення нової процедури. Функція @KEEP (,,, #main+1) – дозволяє вийти з програми, залишивши задану частину резидентною в пам’яті.
Взаємодія з драйвером маніпулятора “миша” реалізовано за допомогою функції 03h переривання int 33h, яка дозволяє отримати поточні координати курсору “миші” та стан кнопок.
Для встановлення курсора в потрібне положення використовується функції 04h переривання int 33h
2 код програми-калькулятор з поясненнями (ремарками)
?include "tsr.h--"
?include "write.h--" //підключення бібліотек
?include <dos.h-->
?include <mouse.h-->
int hear,min,sek; //оголошення змінних
word cx,dx,ccx,cdx,maxx,minx,maxy,miny;
dword oldvect; //адреса старого вектора переривання
interrupt newprochandl() // функція обробки переривання
{
$ pushf //збереження регістрів оперативного призначення
$ CS:
$ call far oldvect; //імітація виклику на стару адресу перериваня
//збереження регістрів
$ push AX
$ push BX
$ push CX
$ push DX
{
minx=0x0001; //змінна в якій зберігається ліва межа руху курсору
maxx=0x0268; //змінна в якій зберігається права межа руху курсору
miny=0x0001; //змінна в якій зберігається верхня межа руху курсору
maxy=0x0180; //змінна в якій зберігається нижня межа руху курсору
// показати курсор миші
AX=0x0001;
$ INT 0x33;
//______________________________________
AX=0x0003; //зчитати координати положення курсору
$ INT 0x33;
cx=CX; //зберігаємо координату //положення курсору по горизонталі
ccx=CX;
dx=DX; //зберігаємо координату //положення курсору по вертикалі
cdx=DX;
if ( cx < minx) //якщо горизонтальна //координата менша за ліву межу:
{
AX=0x0004; //функція встановлення курсору за вказаними //координатами
CX=0x0268; //встановлюємо курсор в біля правої межі екрану
DX=cdx; //координати курсору по вертикалі залишамо попередні
$ INT 0x33;
}
if ( cx > maxx) //якщо горизонтальна //координата більша за праву межу:
{
AX=0x0004; //функція встановлення курсору за вказаними //координатами
CX=0x0001; //встановлюємо курсор в біля лівої межі екрану
DX=cdx; //координати курсору по вертикалі залишамо попередні
$ INT 0x33;
}
if ( dx < miny) //якщо горизонтальна //координата менша за верхню межу:
{
AX=0x0004; //функція встановлення курсору за вказаними //координатами
CX=ccx; //координати курсору по горизонталі залишамо //попередні
DX=0x0180; //встановлюємо курсор в біля нижньої межі екрану
$ INT 0x33;
}
if ( dx > maxy) //якщо горизонтальна //координата більша за нижню межу:
{
AX=0x0004; //функція встановлення курсору за вказаними //координатами
CX=ccx; //координати курсору по горизонталі залишамо //попередні
DX=0x0001; //встановлюємо курсор біля верхньої межі екрану
$ INT 0x33;
}
}
//відновлюємо регістри зі стеку
$ pop DX
$ pop CX
$ pop BX
$ pop AX
}
main ()
{
GETINTVECT (#oldvect,0x1c ); //зберегти переривання від //обновлення
//системного часу
SETINTVECT (,0x1c, CS, #newprochandl);
@KEEP (,,, #main+1); //залишити програму резидентною
}
3 опис роботи
Програма складається з резидентної частини (що залишається в оперативній пам’яті після завершення програми) та загрузчика.
На початку програми за допомогою функції GETINTVECT (#oldvect,0x1c ) визначається адреса підпрограми обробки переривання Int 1С та зберігається в змінній oldvect. Після цього встановлюється нова підпрограма обробки переривання Int 1С за допомогою функції SETINTVECT (,0x1c, CS, #newprochandl). З цього моменту кожних 1с. буде викликатись нова підпрограма обробки переривання. Викликаємо функцію @KEEP (,,, #main+1) “Завершити програму і залишитись резидентно в пам’яті”.
Підпрограма обробки переривання заносить до стеку регістр прапорців (це зроблено для забезпечення повернення із старої підпрограми в нову по команді pop) та передає управління старій підпрограмі обробки переривання, яка виконує роботу по модифікації показників системного таймера. Після завершення старої підпрограми обробки переривання управління передається в нашу підпрограму. Оскільки виклик переривання Int 1С перервав якийсь процес, то в регістрах знаходяться важливі дані. Тому, для того щоб усунути вплив роботи підпрограми обробки переривання на роботу перерваної програми, необхідно зберегти всі регістри в стеку, а після використання знову відновити їх до попереднього стану. Далі викликається функція 3 переривання Int 33h, яка повертає статус маніпулятора “миша”. В регістрі ВХ – стан клавіш, в СХ – номер колонки координати курсора і в DX – номер рядка.
Якщо значення координати положення курсору по горизонталі менше від мінімального значення (границі екрану), то здійснюється встановлення курсору в кінцеве положення