1   2   3   4   5
Ім'я файлу: КеруванняЗвукомФедорів.docx
Розширення: docx
Розмір: 339кб.
Дата: 23.06.2020
скачати

3.2 Робота з маніпулятором миші


Програма 2.1 Робота с курсором миші в графічному режимі

Згідно завдання, потрібно було вивчити роботу програми, наведену в методичних вказівках до курсової роботи і змінити форму курсору на першу літеру свого прізвища – «Б»За допомогою функції 09h переривання int 33h програма, яка працює в графічному режимі, може змінити форму курсору миші і положення точки в середині зображення курсору, координати якої використовуються як координат курсору іншими функціями.
Регістри на вході: АХ = 0009h;

ВХ = номер позиції покажчика графічного курсору (від -16 до 16);

DX = номер рядка точки-покажчика (від -16 до 16);

ES: DX = вказівник на растрове зображення курсору – область пам'яті розмірів 64 байта.
Ця область складається з 2х масивів по 32 біта. Перший масив – логічна маска розміром 16*16 біт, яка налагоджується на область відеопам'яті з використанням логічної операції «І». Другий масив - теж маска розміром 16*16 біт, але вона налагоджується з використанням логічної операції «виключне АБО». Інвертуємо окремі точки зображення. Створюємо глобальний масив з 64 елементів типу unsigned char. Перші 32 елемента заповнюємо числами 225 - маска логічного «І». Щоб заповнити другий 32 елемента запишемо маску в двійково-десятковому вигляді.

Отримані числа запишемо справа наліво в той же масив. Далі визначаємо поточний відеорежим. За введеному номером відеорежиму встановлюємо поточний відеорежим, з допомогою переривання int 10h. Ініціалізуємо мишу з допомогою функції 00h переривання int 33h.


Рисунок 3.6 – Блок-схема програми роботи з курсором миші в графічному режимі

Листинг 3.4 – Програма роботи з курсором миші в графічному режимі
#include

#include

#include

#include

#include

#include

union REGS reg;

void ms_gform(int xt, int yt, char _far *form);

unsigned char form[64]=

{

//Масив маски "І"

255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255,

//Масив маски "Виключного АБО" - Тут по черзі задаються значення рядків двох розташованих поруч вертикальних матриць, починаючи з правої

255, 255,

255, 255,

255, 255,

255, 255,

31, 248,

255, 251,

255, 251,

31, 248,

223, 251,

223, 251,

31, 248,

255, 255,

255, 255,

255, 255,

255, 255,

255, 255,};

int main(void)

{

unsigned old_videomode, new_videomode;

char buf[20], *bufptr;
//Визначити відеорежим

reg.x.ax=0x0f00;

int86(0x10, ®, ®);

old_videomode=reg.h.al;
//Встановити новий відеорежим

buf[0]=10;

printf("Enter new videomode :");

bufptr=cgets(buf);

new_videomode=atoi(bufptr);

reg.h.ah=0;

reg.h.al=new_videomode;

int86(0x10, ®, ®);
//Ініціалізація миші

reg.x.ax=0;

int86(0x33, ®, ®);

if(reg.x.bx==0)

{ printf("Mouse not found\n");

return -1; }

//Задати нову форму курсору миші

ms_gform(0,0, form);

reg.x.ax=1;

int86(0x33, ®, ®);

getch();

reg.h.ah=0;

reg.h.al=old_videomode;

int86(0x10, ®, ®);

return 0; }

void ms_gform(int xt, int yt, char _far *form)

{struct SREGS segregs;

reg.x.ax=9;

reg.x.bx=xt;

reg.x.cx=yt;

reg.x.dx=FP_OFF(form);

segregs.es=FP_SEG(form);

int86x(0x33, ®, ®, &segregs); }
Програма 2.2 Робота з курсором миші в текстовому режимі

Згідно завдання, потрібно було вивчити роботу програми, приведеної в методичних вказівках, і, використовуючи текстовий режим, змінити форму курсору на першу літеру свого прізвища – «Б». Атрібути кольору задати так: перша цифра числа свого дня народження (1) – колір літери, друга цифра (1) – колір фону.

Ініціалізуємо мишу функцією 00h переривання int 33h і вмикаємо курсор функцією 01h. Міняємо вигляд курсору, визиваючи функцію ms_tform(). В функцію передаємо атрибути кольору і 16-ричний ASCII код «Б». Функція ms_tform() за допомогою 0Аh переривання 33h, міняє форму курсору як описано в завданні. За допомогою функції 03h і переривання 33h визначаємо положення курсору на екрані і виводимо його координати, що містяться у регістрах CX i DX.


Рисунок 3.7 – Блок-схема програми роботи з курсором миші в текстовому режимі

Листинг 3.5 – Програма роботи з курсором в текстовому режимі
#include

#include

#include

#include

union REGS reg;

void ms_tform(int type, int mask1, int mask2);

int main(void)

{

clrscr();

int Button;

// _ініціалізація миші

reg.x.ax=0;

int86(0x33, ®, ®);

if(reg.x.bx==0)

{

printf("Mouse not found\n");

return -1;

}
// Задати нову форму курсору миші

ms_tform(0,0, 0x1181);

// тут 11 -атрибути (фон та кол_р), а 81 - ASCII код "Б" в 16-му код_.

//Вмикаємо курсор

reg.x.ax=1;

int86(0x33, ®, ®);

//Доки не натиснуто клавішу на клавіатур_

while(!kbhit())

{reg.x.ax=3;

int86(0x33, ®, ® );
if (reg.x.bx!=0)

{clrscr();

Button=reg.x.bx;

//визначення натиснутої клавіши

switch(Button)

{

case 1: puts ("left"); break;

case 2: puts ("right"); break;

}

}

}

getch();

return 0;

}

void ms_tform(int type, int mask1, int mask2)

{

reg.x.ax=0xA;

reg.x.bx=type;

reg.x.cx=mask1;

reg.x.dx=mask2;

int86(0x33, ®, ®);

}

3.3 Технічне завдання. Робота з управлінням процесами





Рисунок 3.8 – Блок-схема програми
Лістинг 3.6 – Програма parent.exe
; cat.asm

;
копіює об'єднане вміст всіх файлів, вказаних в командному рядку, в

; стандартний висновок. Можна як вказувати список файлів, так і використовувати маски

; (Символи "*" та "?") В одному або декількох параметрах,

; Наприклад:

; cat header *.txt footer > all-texts поміщає вміст файлу

; header, всіх файлів з розширенням .txt в поточній директорії, і файлу

; footer в файл all-texts

; довгі імена файлів не використовуються, помилки ігноруються

;

; Компіляція:

; TASM:

; tasm /m cat.asm

; tlink /t /x cat.obj
.model tiny

.code

org 80h ; по зсуву 80h від початку PSP знаходяться:

cmd_length db ? ; довжина командної строки

cmd_line db ? ; і сама командна строка

org 100h ; початок COM-програми - 100h від початку PSP

start:

cld ; для команд строкової обробки

mov bp,sp ; збережемо поточну вершину стека в BP

mov cl,cmd_length

cmp cl,1 ; якщо командний рядок порожня -

jle show_usage ; вивести інформацію про програму та вийти

mov ah,1Ah ; функція DOS 1Ah

mov dx,offset DTA

int 21h ; перемістити DTA (за замовчуванням вона збігається з командним рядком PSP)
; перетворити список параметрів в PSP: 81h наступним чином:

; кожен параметр закінчується нулем (ASCIZ-рядок)

; адреси всіх параметрів поміщаються в стек в порядку виявлення

; в змінну argc записується число параметрів

mov cx,-1 ; для команд роботи з рядками

mov di,offset cmd_line ; початок командного рядка в ES: DI

mov al,' ' ; шукати перший символ

repz scasb ; який не є пропуском

dec di ; DI - адреса початку чергового параметра push di ; помістити його в стек

inc word ptr argc ; і збільшити argc на один

mov si,di ; SI = DI для наступної команди lodsb

scan_params:

lodsb ; прочитать следующий символ из параметра,

cmp al,0Dh ; если это 0Dh - это был последний параметр

je params_ended ; и он кончился,

cmp al,20h ; якщо це 20h - цей параметр скінчився,

jne scan_params ; але можуть бути ще

dec si ; SI - перший байт після кінця параметра

mov byte ptr [si],0 ; запишемо в нього 0

mov di,si ; DI = SI для команди scasb

inc di ; DI - Наступного після нуля символ

jmp short find_param ; продовжимо розбір командного рядка
params_ended:

dec si ; SI - перший байт після кінця останнього

mov byte ptr [si],0 ; параметра - записати в нього 0

; кожен параметр сприймається як файл або маска для пошуку файлів

; всі знайдені файли виводяться на stdout. Якщо параметр - не ім'я файлу, то; помилка ігнорується

mov si,word ptr argc ; SI - число залишилися параметрів

next_file_from_param:

dec bp

dec bp ; BP - адрес наступного адреса параметра

dec si ; зменшити число залишилися параметрів,

js no_more_params ; якщо воно стало негативним - все
mov dx,word ptr [bp] ; DS:DX - адреса чергового параметра

mov ah,4Eh ; Функція DOS 4Eh

mov cx,0100111b ; шукати всі файли, крім директорій і міток тома

int 21h ; знайти перший файл

jc next_file_from_param ; якщо сталася помилка - файлу немає

call output_found ; вивести знайдений файл на stdout

find_next:

mov ah,4Fh ; Функція DOS 4Fh

mov dx,offset DTA ; адрес нашої області DTA

int 21h ; найти наступний файл

jc next_file_from_param ; якщо помилка - файли скінчилися

call output_found ; вивести найдений файл на stdout

jmp short find_next ; продовжувати пошук файлів

no_more_params:

mov ax,word ptr argc

shl ax,1

add sp,ax ; видалити з стека 2 * argc байтів

; (Тобто весь список адресів

; параметрів командного рядка)

ret ; кінець програми

; процедура show_usage

; виводить інформацію про програму

;

show_usage:

mov ah,9 ; Функція DOS 09h

mov dx,offset usage

int 21h ; вивести строку на екран

ret ; вихід з процедури

; процедура output_found

; виводить в stdout файл, ім'я якого знаходиться в області DTA
output_found:

mov dx,offset DTA+1Eh ; адрес ASCIZ-строки с ім'ям файлу

mov ax,3D00h ; Функція DOS 3Dh

int 21h ; відкрити файл (al = 0 - тільки на читання),

jc skip_file ; якщо помилка - не чіпати цей файл

mov bx,ax ; ідентифікатор файлу - в BX

mov di,1 ; DI буде зберігати ідентифікатор STDOUT

do_output:

mov cx,1024 ; розмір блоку для читання файлу

mov dx,offset DTA+45 ; буфер для читання / запису розташовується за кінцем DTA

mov ah,3Fh ; Функція DOS 3Fh

int 21h ; прочитати 1024 з файлу,

jc file_done ; якщо помилка - закрити файл

mov cx,ax ; число реально прочитаних байтів в CX,

jcxz file_done ; якщо це не нуль - закрити файл
mov ah,40h ; Функція DOS 40h

xchg bx,di ; BX = 1 - пристрій STDOUT

int 21h ; висновок прочитаного числа байтів в STDOUT

xchg di,bx ; повернути ідентифікатор файлу в BX jc file_done ; якщо помилка - закрити файл

jmp short do_output ; продовжити виведення файлу

file_done:

mov ah,3Eh ; Функція DOS 3Eh

int 21h ; закрити файл

skip_file:

ret ; кінець процедури output_found

usage db 'cat.asm v1.0',0Dh,0Ah

db 'concatenate and print files to stdout',0Dh,0Ah

db 'usage: cat filename.ext, ...',0Dh,0Ah

db '(filenames can contain wildcards)',0Dh,0Ah,'$'
argc dw 0; число параметрів (повинен бути 0 при старті програми!)
DTA: ; область DTA починається відразу за кінцем файлу, а відразу за областю DTA починається 1024- байтний буфер для читання файлу.

end start

4. ЗВІТ ПРО ТЕСТУВАННЯ ПРОГРАМ
Програма sys_ta:

Методика випробування: за принципом порівняння з технічним завданням.

Результати: програма повністю задовольняє запропонованим завданням.

У програмі задаються ноти і їхньої тривалості, залежно від яких програється мелодія за допомогою системного динаміка.

Програма sys_tb: Вимагає наявності графічних драйверів(EGAVGA.BGІ).

Методика випробування: за принципом порівняння з технічним завданням.

Результати: програма повністю задовольняє запропонованим завданням. Програма дозволяє вводити значення затримки, протягом затримки виводити на екран геометричні фігури, які ілюструють відлік часу.

Програма sys_tc:

Методика випробування: за принципом порівняння з технічним завданням.

Результати: програма повністю задовольняє запропонованим завданням. Інформує, скільки часу пройшло між першим і другим натисканням будь-якої клавіші, фіксуючи на екрані початок, і кінець відліку часу.

Програми sys_m1 і sys_m2: Вимагають можливості використання DOS, тому випробування проводилися в MS-DOS .

Методика випробування: за принципом порівняння з технічним завданням.

Результати: програми повністю задовольняє запропонованим завданням. Демонструють зміна форми курсору в графічному й текстовому режимах відповідно. Форма курсору миші у вигляді букви 'Б', колір букви - 1, колір тла - 1. Визначається натиснута клавіша миші.

Програма sys_3:

Методика випробування: за принципом порівняння з технічним завданням.




ВИСНОВОК



У даній курсовій роботі , я одержав практичні навички по розробці системних програм :

- закріплені відомості про системний таймер і динамік комп'ютера, отримані навички використання цих пристроїв;

- реалізована робота з мишею в текстовому й графічному режимах.

- вивчена робота з командами для роботи з командним рядком.

Виконання роботи сприяло підвищенню знань і практичних навичок в області системного програмування.

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ



1. Александр Побегайло- Системное программирование в Windows .

2. Всеволод Несвижский-Программирование аппаратных средств в Windows.

3. Солдатов Б.Т., Кузьміна Л.В., Хохлов Н.Н. Методичні вказівки до виконання курсової роботи з дисципліни “Системне програмування” для студентів спеціальностей 8.091501 "Комп'ютерні системи та мережі", 7.091503 "Спеціалізовані комп'ютерні системи" усіх форм навчання. – Запоріжжя: ЗНТУ, 2005. – 36 с.

4. Зубков С.В. Assembler для DOS, Windows и UNIX. 1999.

5.Александр Молчанов - Системное программное обеспечение. Лабораторный практикум.

6.Руслан Аблязов-Программирование на ассемблере на платформе x86-64.
1   2   3   4   5

скачати

© Усі права захищені
написати до нас