Розробка системних програм

Особливості удосконалення програми регулювання системного таймера комп'ютера. Специфіка розробки такої програми для роботи з мишею в текстовому й графічному режимах, що містить функції, пов'язані з її обслуговуванням. Робота з керуванням програмами.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 05.03.2012
Размер файла 356,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Розробка системних програм

ЗМІСТ

програма комп'ютер керування

  • ВСТУП
  • 1 АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ
    • 1.1 Засоби генерації точно відміряних відрізків часу
    • 1.2 Засоби роботи з мишею
    • 1.3 Індивідуальне завдання
  • 2 Аналіз взаємодії системної програми з апаратною частиною комп'ютера та операційною системою
    • 2.1 Управління системним таймером і звуком
    • 2.2 Робота з маніпулятором миші
  • 3 ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
  • 3 РОЗРОБКА АЛГОРИТМІВ І ПРОГРАМНОГО КОДУ
    • 3.1 Керування системним таймером та звуком
    • 3.2 Робота з маніпулятором миші
    • 3.3 Індивідуальне завдання. Робота з управлінням процесами.
  • 4 ЗВІТ ПРО ТЕСТУВАННЯ ПРОГРАМ
  • ВИСНОВКИ
  • ПЕРЕЛІК ПОСИЛАНЬ

ВСТУП

У курсовому проекті виконуються завдання, пов'язані із системним програмуванням, роботою з апаратною частиною комп'ютера.

Курсова робота розбита на три завдання.

Перше завдання пов'язане з роботою системного таймера комп'ютера.

Крім годинника реального часу, будь-який комп'ютер (навіть найпростіший ІBM PC) містить пристрій, названий системним таймером. Цей пристрій підключений до лінії запиту на переривання ІRQ0 і виробляє переривання ІNT 8h приблизно 18,2 рази в секунду (точне значення - 1193180/65536 разів у секунду). У завданні передбачається розібратися з роботою системного таймера, проаналізувати запропоновану програму, удосконалити її й написати дві інші програми, які використовують системний таймер.

Друге завдання стосується роботи з мишею.

Для роботи з мишею використовується вектор переривання ІNT 33h. Ця програма виконує всі операції, пов'язані з обслуговуванням миші, а саме:

· скидання миші й установку драйвера у вихідний стан,

· включення й вимикання курсору в певному місці екрана,

· визначення поточних координат курсору й поточного стану клавіш,

· визначення області на екрані, у межах якої може переміщатися курсор,

· визначення форми графічного й текстового курсорів,

· визначення величини переміщення у сотих частках дюйма,

· та інші.

У роботі пропонуються програми для роботи з мишею в текстовому й графічному режимах, які містять деякі з перерахованих вище функцій. Потрібно проаналізувати й удосконалити ці програми.

Третє завдання припускає роботу з керуванням програмами.

Програма копіює об'єднаний зміст всіх файлів, що вказаний в командному рядку, на стандартний вивід. Можна задавати як список файлів, так і використовувати маски (символи “*”,”?”). Довгі назви файлів не використовуються.

1 АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

програма комп'ютер керування

1.1 Засоби генерації точно відміряних відрізків часу

Для вивчення роботи з генерацією відрізків часу треба виконати наступні завдання.

Відкомпілювати й виконати програму sys_t.cpp, що демонструє використання системного таймера для формування відрізків часу, які не залежать від тактової частоти ІBM-сумісної ЕОМ. З'ясувати, яким чином впливає на тон звуку значення коефіцієнта октави.

Продемонструвати звучання мелодії, заданої згідно варіанта, у різних октавах

Для непарних номерів варіанту - Під час програвання мелодії до екрану вивести прямокутник (або іншу геометричну фігуру), колір якого змінюється зі зміною частоти ноти, яка звучить.

Продемонструвати результати роботи програми керівнику курсової роботи.

Створити програму, що відтворює затримку на задане число секунд

Значення затримки в секундах рівне номеру студента в журналі академгрупи.

Для непарного номера варіанту - Створити інтерфейс для вводу з клавіатури значення затримки й протягом затримки виводити до екрану символи, або числа, що ілюструють відлік часу.

Продемонструвати результати роботи програми керівнику курсової роботи.

Створити програму, що інформує, скільки секунд пройшло між першим і другим натисканням будь-якої клавіші

Фіксувати на екрані початок, і кінець рахунку часу.

Продемонструвати результати роботи програми керівникові курсової роботи.

1.2 Засоби роботи з мишею

Ознайомитись зі способами роботи з маніпулятором миші, навчитися ініціалізувати мишу й змінювати форму курсору миші.

Відкомпілювати й виконати програму sys_m1.cpp, що демонструє зміну форми курсору в графічному режимі. Задати форму курсору миші у вигляді першої букви свого прізвища (`Б').

Продемонструвати результати роботи програми керівнику курсової роботи.

Відкомпілювати й виконати програму sys_m2.cpp, що демонструє зміну форми курсору в текстовому режимі

Задати форму курсору миші у вигляді першої букви свого прізвища (`Б'). Атрибути кольору букви й тла встановити наступні:

колір букви - перша цифра числа свого дня народження (2);

колір тла - друга цифра числа свого дня народження (0).

Продемонструвати результати роботи програми керівникові курсової роботи.

Для непарного номера варіанту - Визначити клавішу, яку було натиснуто.

1.3 Індивідуальне завдання

Третє завдання припускає роботу з керуванням програмами.

Програма копіює об'єднаний зміст всіх файлів, що вказані в командному рядку, на стандартний вивід. Можна задавати як список файлів, так і використовувати маски (символи “*”,”?”). Довгі назви файлів не використовуються.

2 Аналіз взаємодії системної програми з апаратною частиною комп'ютера та операційною системою

2.1 Управління системним таймером і звуком

Будь-який комп'ютер містить пристрій, що має назву системний таймер. Це пристрій, який під'єднано до лінії запиту на апаратне переривання IRQ0 та виробляє програмне переривання INT 8h приблизно 18,2 рази на секунду (точне значення - 1193180/65536 раз на секунду).

Обробник переривання таймеру

При ініціалізації BIOS встановлює свій обробник для переривання таймеру. Цей обробник кожний раз збільшує на одиницю поточне значення 4-байтової змінної, що розташовано в області даних BIOS за адресою 0000:046Ch - лічильник таймеру. Якщо цей лічильник переповниться внаслідок того, що пройшло більш ніж 24 години з моменту запуску таймеру, в комірку 0000:047h заноситься значення 1.

Друга дія, що виконується стандартним обробником переривання таймеру, - контроль за роботою двигунів НГМД. Якщо після останнього звернення до НГМД пройшло більш ніж 2 секунди, обробник переривання вимикає двигун. Комірка за адресою 0000:0440h містить час, який залишився до вимикання двигуна. Цей час постійно зменшується обробником переривання таймеру. Коли він стає рівним нулю, двигун НГМД вимикається.

Остання дія, яку виконує обробник переривання таймеру, - виклик програмного переривання INT 1Ch. Після ініціалізації системи вектор INT 1Ch вказує на команду IRET, тобто обробник переривання INT 1Ch нічого не виконує. Програма може встановити власний обробник цього переривання для того, щоб виконувати які-небудь періодичні дії.

Таймер зазвичай реалізується на мікросхемі Intel 8253 (для комп'ютерів IBM PC та IBM PC/XT) або 8254 (для комп'ютерів IBM PC/AT та IBM PS/2), а також на аналогах цих мікросхем.

Канали таймеру

В сучасних комп'ютерах задіяні всі три канали таймеру.

Канал 0 використовується в системному годиннику часу доби (не слід плутати з годинником реального часу, що реалізовано на іншій мікросхемі). Цей канал працює в режимі 3 й використовується як генератор імпульсів з частотою приблизно 18,2 Гц. Саме ці імпульси викликають апаратне переривання IRQ0 та програмне INT 8h.

Канал 1 використовується для регенерації вмісту динамічної пам'яті комп'ютера. Вихід каналу OUT використовується для запиту до каналу прямого доступу DMA, котрий виконує оновлення вмісту пам'яті.

Канал 2 під'єднаний до гучномовця комп'ютера й може бути використано для генерації звуків або музики або як генератор випадкових чисел. Канал використовує режим 3 таймерів 8253 та 8254.

Таймер та музика

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

Налаштовування таймеру для програвання музики

Канал 2 мікросхеми 8254 зв'язаний з гучномовцем комп'ютера. Однак гучномовець не просто з'єднано з виходом OUT каналу 2. Порт виводу 61h також використовується для керування гучномовцем. Молодший біт порту 61h під'єднано до входу GATE каналу 2 таймеру. Цей біт при встановленні в одиницю дозволяє роботу каналу, тобто генерацію імпульсів для гучномовця.

Додатково для керування гучномовцем використовується біт 1 порту 61h. Якщо цей біт встановлено, імпульси від каналу 2 таймеру зможуть проходити на гучномовець.

Таким чином, для включення звуку необхідно виконати наступні дії:

· Запрограмувати канал 2 таймеру на необхідну частоту (завантажити регістр лічильника каналу необхідним значенням);

· Встановити два молодших біти порту 61h. Так як інші 6 бітів порту 61h використовуються для інших цілей, встановлення молодших бітів має виконуватись таким чином, щоб значення інших бітів не було змінено. Для цього спочатку необхідно прочитати байт з порту 61h в робочу комірку пам'яті, встановити там необхідні біти, потім вивести нове значення байту до порту 61h. Для вимикання звуку необхідно скинути два молодших біти порту 61h, при цьому не можна змінювати значення інших бітів цього порту.

Одноголоса мелодія складається з нот, розділених або не розділених паузами. При програванні мелодії необхідно для кожної ноти програмувати відповідним чином канал 2 таймеру й вмикати гучномовець (за допомогою порту 61h) на відповідний час, рівний довжині ноти. Потім програма повинна вимкнути динамік та витримати паузу перед програванням наступної ноти, якщо така пауза необхідна.

Програма може генерувати звуки й іншим чином, не використовуючи таймер. Для цього необхідно скинути молодший біт порту 61h та, керуючи бітом 1 цього порту, формувати імпульси для гучномовця. Інакше кажучи, програма повинна періодично встановлювати та скидати цей біт. Висота генерації звуку буде відповідати періоду зміни стану вказаного біту.

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

Для роботи з маніпулятором миші використовується вектор переривання INT 33h. Ця програма виконує всі операції, що пов'язані з обслуговуванням миші:

· скидання параметрів миші та встановлення драйверу в вихідний стан;

· ввімкнення та вимкнення курсору в зазначеному місці екрану;

· визначення поточних координат курсору й поточного стану клавіш;

· визначення координат курсору й стану клавіш в момент натискання на клавішу й в момент відпускання клавіші;

· визначення області на екрані, в межах якої курсор може пересуватися;

· визначення області на екрані, в межах якої курсор не буде видно;

· зазначення форми графічного й текстового курсорів;

· визначення величини пересування миші в сотих долях дюйма;

· підключення до драйверу процедури, визначеної в програмі, що отримує керування при натисканні на задану клавішу або при пересуванні миші;

· збереження та відновлення стану драйверу;

· керування швидкістю руху курсору;

· зазначення або визначення сторінки відеопам'яті, що використовується;

· керування драйвером миші.

Ініціалізація миші

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

Р

егістри на вході: АX=0000h

Регістри на виході: AX = стан миші

BX = кількість клавіш у миші.

Якщо на виході з переривання регістр AX містить значення 0000h, це свідчить проте, що драйвер миші відсутній. Якщо значення змісту цього регістру рівне 0FFFFh, драйвер миші є й можна використовувати інші функції для роботи з мишею.

Вмикання(вимикання) курсору миші

Для вмикання курсору миші використовується функція 01h. Ця функція дозволяє вмикати або вимикати курсор миші:

Регістри на вході: АХ = 0001h

Регістри на виході: Регістри не використовуються.

Для керування видимістю курсору драйвер використовує внутрішній лічильник. Цей лічильник можна збільшувати, викликаючи функцію 01h переривання 33h, або зменшувати за допомогою функції 02h.

Після ініціалізації драйверу функцією 00h лічильник встановлюється рівним -1. Після першого виклику функції 01h лічильник стає рівним нулю. При цьому курсор миші стає видимим, його можна пересувати по екрану.

Якщо лічильник рівний нулю, то наступний виклик функції 01h ігноруються драйвером. Для того, щоб згасити курсор, використовується функція 02h, яка при виклику зменшує кожного разу зміст лічильника на одиницю.

Функція 01h скидає область, в якій курсор не відображається(Якщо така область була раніш встановлена функцією 10h).

Для вимикання курсору миші використовується функція 02h. Функція зменшує на одиницю лічильник видимості курсору. Якщо вміст лічильника стає рівним -1, зображення курсору зникає з екрану.

Регістри на вході: АХ = 0002h

Регістри на виході: Регістри не використовуються.

Якщо програма застосовує для виводу до екрану метод прямого запису до відеопам'яті, перед поновленням змісту екрану необхідно згасити курсор, а після завершення оновлення - відобразити його знову.

Це пов'язане з тим, що драйвер миші запам'ятовує старе значення атрибуту символу, на який посилався курсор до поновлення змісту відеопам'яті. Якщо змінити атрибут, записавши нове значення безпосередньо до екранної пам'яті, то якщо встановити курсор миші на інший символ, зображення старого символу буде зіпсовано - з'явиться прямокутник(наче б то ще одне зображення курсору миші).

Визначення положення курсору

Для визначення положення курсору використовується функція 03h. Ця функція повертає поточні координати курсору миші й стан клавіш.

Регістри на вході: АХ = 0003h

Регістри на виході: ВХ = стан клавіш миші;

СХ = X координата курсору;

DX = Y координата курсору;

Встановлення форми курсору в графічному режимі

За допомогою функції 09h програма, що працює в графічному режимі, може змінити форму курсору миші та положення точки в середині зображення курсору, координати якої використовуються в якості координат курсору іншими функціями.

Регістри на вході: АХ = 0009h

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

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

ES:DX = покажчик на растрове зображення курсору

Регістри на виході: Регістри не використовуються

Регістри ES:DX посилаються на область пам'яті розміром 64 байти. Ця область складається з двох масивів довжиною по 32 байти. Перший масив - логічна маска розміром 16х16 біт, яка накладається на ділянку відеопам'яті з використанням логічної операції "І". Другий масив - також маска розміром 16х16 біт, але вона накладається з використанням логічної операції "Виключного АБО", інвертуючи окремі точки зображення.

Номери позиції й рядку точки-покажчика, які задаються за замовчуванням, рівні нулю(ВХ = СХ = 0). Це відповідає верхній лівій точці в зображенні курсору. Значення ВХ = СХ = 15 відповідають ніжній правій точці.

Встановлення форми курсору в текстовому режимі

За допомогою функції 0Ah програма може змінити форму курсору миші в текстовому режимі.

Регістри на вході: AX = 000Ah

BX = тип курсору:

0 - задається програмно;

1 - задається апаратно;

СХ = маска екрану (для ВХ = 0) або кінцевий рядок курсору (для ВХ = 1)

DX = маска курсору (для ВХ = 0) або кінцевий рядок курсору (для ВХ = 1)

Регістри на виході: Регістри не використовуються

В залежності від змісту регістру ВХ драйвер миші використовує курсор, зазначений апаратними засобами, або курсор, що зазначено програмно. За замовчуванням використовується програмний курсор, який відображається у вигляді символу з інвертованим значенням атрибуту. Курсор, сформований апаратними засобами, має вигляд аналогічний звичайному текстовому курсору, його форма - прямокутник. Розмір прямокутника можні задавати за допомогою регістрів СХ та DX.

Для курсору, що зазначено програмно, спочатку виконується операція логічного "І" над вмістом відеопам'яті в тому місці, куди посилається курсор, та маскою екрану. Потім виконується операція "Виключного АБО" з маскою курсору.

Молодший байт масок, відповідає коду ASCII символу, старший - це байт атрибуту символу.

Значення, що використовується за замовчуванням, - ВХ = 7700h, CX = FFFFh.

Якщо треба змінити колір курсору, не змінюючи його форму, треба задати СХ = 00FFh, ВХ = хх00h, де хх зазначає колір.

ІНДИВІДУАЛЬНЕ ЗАВДАННЯ

Програми завантажуються в пам'ять для виконання за допомогою функції DOS Exec (Int 21h, функція 4Bh), яка грає роль системного завантажувача. При запуску програми через командний рядок функцію Exec викликає командний процесор COMMAND.COM. Інакше - через оболонку DOS або інший програмний інтерфейс. Програма, завантажена функцією Exec в пам'ять, включає три компоненти: оточення, префікс програмного сегменту (PSP) і власне програму.

У процесі початкового завантаження DOS створює так зване оточення, в якому будуть працювати керуючі програми і, перш за все, командний процесор COMMAND.COM. Оточення представляє собою область пам'яті, в якій у вигляді символьних рядків записані значення змінних, які називаються змінними оточення. Кожен рядок має формат змінна = значення і закінчується нульовим байтом.

Після того, як виконане початкове завантаження DOS, активною програмою стає командний процесор, який фактично нічого не робить, очікуючи введення команди з клавіатури. Отримавши команду оператора на запуск, COMMAND.COM, активізуючи цю програму, передає їй своє оточення. Після завершення програми і повернення управління батьківському процесові оточення дочірньої програми знищується, і батьківський процес продовжує працювати зі своїм власним оточенням.

Друга структура даних, що формується функцією Exec при активізації викликається програми, - PSP - займає обсяг 256 байт і фактично включається до складу завантажується програми. У слово PSP з адресою 2Ch DOS поміщає сегментну адресу оточення програми, а в область, що починається з адреси 80h - хвіст команди. У байті за адресою 80h знаходиться довжина хвоста, а потім розташовуються самі параметри у вигляді символьного рядка. За допомогою хвоста командного рядка програмі часто передаються ключі, керуючі її роботою, а також імена робочих файлів.

У разі, якщо команда не передавалася б інтерпретатору DOS, а виконувалася нами самостійно, то виявилося б: щоб запустити будь-яку програму з-під shell.com, треба б було попередньо переходити в директорію з цією програмою або вводити її з повним шляхом. Справа в тому, що COMMAND.COM при запуску файлу шукає його по черзі в кожній з директорій, зазначених у змінній середовища PATH.DOS створює копію всіх змінних середовища (так зване оточення DOS) для кожного запускається процесу. Сегментний адресу копії оточення для поточного процесу розташовується в PSP за зміщенням 2Сh. У цьому сегменті записані всі змінні поспіль у формі ASCIZ-рядків виду «COMSPEC = C:/WINDOWS/COMMAND.COM», 0. Після закінчення останнього рядка стоїть додатковий нульовий байт, потім слово (зазвичай 1) - кількість додаткових рядків оточення, а потім - додаткові рядки. Перший додатковий рядок - завжди повний шлях та ім'я поточної програми - також у формі ASCIZ-рядків. При запуску нової програми за допомогою функції 4Bh можна створити повністю нове оточення і передати його сегментну адресу програмою або просто вказати 0, дозволивши DOS зібрати оточення поточної програми.

При запуску програми DOS поміщає весь командний рядок (включаючи останній символ 0Dh) в блок PSP запущеної програми з зміщенням 81h та її довжину в байтах 80h (таким чином, довжина командного рядка не може бути більше 7Eh (126) символів). Під Windows 95 і 4DOS, якщо командний рядок перевищує ці розміри, байт PSP: 0080h (довжина) встановлюється в 7Fh, в останній байт PSP (PSP: 00FFh) записується 0Dh, перші 126 байт командного рядка розміщуються в PSP, а весь рядок цілком - у змінній середовища CMDLINE.

3. РОЗРОБКА АЛГОРИТМІВ І ПРОГРАМНОГО КОДУ

3.1 Керування системним таймером та звуком

Програма 1.1 - Програвання мелодії на динаміку ПК

Згідно з завданням було потрібно розробити програму, яка б відтворювала послідовність нот із додатка А, варіант 5 - Ми(1/4) Ми(1/4) Ми(1/4) Фа(1/2) Ми(1/4) Ре(1/4) Син(1/4) До(1/4) Ре(1/2).

Кожній ноті відповідає певна частота і тривалість її відтворення в тіках системного таймера. Створюємо два масиви типу int. У масив iMel[] запишемо частоти нот заданої мелодії, закінчивши масив нулем. У масив iDel[] - довжину нот в тіках, де 9 приймемо за ?, а 4 - за ? ноти, так як системний таймер викликає переривання приблизно 18 разів на секунду. Програємо кожну ноту на динаміці, виконуючи функцію, яка генерує звук з висотою тону і довжиною, незалежно від тактової частоти ЕОМ (у нашому випадку називається tm_sound ()).

Функція затримки (в нашому випадку називається tm_delay ()) формує відрізки часу, що не залежать від частоти процесора IBM-сумісної ЕОМ. У цю функцію передається один параметр - ціле число тіків системного таймера, на яке слід виконати затримку. Заносить в регістр si необхідну затримку в тиках.

Зчитуємо вміст лічильника таймера функцією 00h переривання 1Ah. Результат заноситься в регістр BX і до нього додається число тіків, на які виконується затримка. Далі знову зчитується значення системного таймера в регістр DX і поки воно не буде дорівнювати значенню з регістра BX, буде виконуватися умовний перехід jne і знову переривання 1Ah і порівняння вмісту DX і BX.

В функцію, що генерує звук tm_sound(), передаються 3 параметри - частота ноти, тривалість і октава. Функція звертається до управляючого порту 43h, посилає в цей порт послідовність бітів для вибору каналу таймера, статусу читання/запису, режима операції и форми представлення чисел. Визначає коефіцієнт ділення. Загружає коефіцієнт ділення в регістр лічильника-таймера (висота звука). Вмикає динамік, виконує затримку функцією tm_delay() и вимикає динамік через звертання до його порту.

Рисунок 3.1 - Блок-схема програми, що програє мелодію.

Рисунок 3.2 - Блок-схема функції tm_sound

Рисунок 3.3 - Блок-схема функції tm_delay

Лістинг 3.1- Програма програвання мелодії на динаміку ПК

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

int i;

int left, top, right, bottom;

void main (void);

void tm_sound (int, int, int);//функція генерації звуку;

void tm_delay (int); //функція для створення затримки;

//Масив частот (еквівалент нот в герцах) другої октави

int iMel[ ] = { 330,330,330,349,330,293,247,261,293,

0 };

//Масив довжин звуків в тіках

int iDel[ ] = { 4,4,4,2,4,4,4,4,2,

4 };

int iOct; // коефіцієнт октави

void main (void)

{

/*---------------------*/

int gdriver = DETECT, gmode, errorcode;

/* initialize graphics and local variables */

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

}

left = getmaxx() / 2 - 50;

top = getmaxy() / 2 - 50;

right = getmaxx() / 2 + 50;

bottom = getmaxy() / 2 + 50;

for(iOct=2;iOct<3;iOct++)

{

for ( i = 0; iMel[i] != 0; i++ )

tm_sound ( iMel[i], iDel[i], iOct-1);

}

}

/*Функція tm_sound генерує звук з висотою тону й довжиною, незалежною від тактової частоти ЕОМ. Це досягнуто за рахунок того, що за замовчуванням кількість тіків в секунду однакова для всіх IBM-сумісних ЕОМ. Частота тіків - приблизно 18,2 Гц. */

void tm_sound(int iFreq, int iTime, int Oct)

{

int iPer, //Коефіцієнт ділення;

iOct = Oct //Коефіцієнт октави;

; //Додатковий лічильник;

/*Звернутися до керуючого порту 43h. Надіслати до цього порту послідовність бітів (байт) для вибору каналу таймеру, статусу читання/запису, режиму операції та форми представлення чисел і т.і. */

outp(0x43, 0xb6);

// З'ясувати коефіцієнт ділення,

iPer = 1193180L / (pow(2,iOct)*iFreq);//1193180 Гц - частота кварцового генератору;

/*Завантажити коефіцієнт ділення до регістру лічильника таймеру (задати висоту звуку). Завантажити спочатку молодший, а потім старший байт: */

outp(0x42, iPer & 0x00ff);

outp(0x42, ((iPer & 0xff00)>>8));

//Ввімкнути динамік:

outp(0x61, inp(0x61) | 3);

//Виконати затримку:

setcolor(i);

rectangle(left,top,right,bottom);

tm_delay(iTime);

//Вимкнути динамік:

outp(0x61, inp(0x61) & 0xfc);

}

//Функція tm_delay для отримання затримки.

void tm_delay ( int iTicks)

{

_asm {

push si //; завантажити до стеку вміст регістру SI;

mov si,iTicks //;занести до регістру необхідну затримку в тіках;

mov ah,0 //; функція 00h - для зчитування вмісту лічильника таймеру;

int 1ah //; переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

mov bx,dx //; це слово занести до регістру BX

add bx,si //; й до нього додано число тіків, рівне затримці;

}

delay_loop:

/* З кожним тіком таймеру вміст лічильника за допомогою переривання BIOS INT 8h збільшується на одиницю */

_asm {

int 1ah //;- переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

cmp dx, bx //; порівняти з вмістом регістру BX;

jne delay_loop //;якщо не рівні - затримка продовжується;

pop si //; - інакше поновлення регістру SI значенням зі стеку

Програма 1.2 - Виконання затримки на ціле число секунд

Програма виконання затримки на ціле число секунд реалізує інтерфейс для введення цілого числа секунд затримки з клавіатури. На початку виконання програми проводиться затримка на 2 секунди - за варіантом курсової роботи, далі знову проводиться затримка на кількість секунд, введену з клавіатури. В обох випадках виконується функція tm_delay (), яка в свою чергу використовує функцію затримки delay () бібліотеки "dos.h", що приймає в якості параметрів кількість мілісекунд. Також до і після виконання tm_delay() використовується функція clock () бібліотеки "time.h", що повертає приблизне процесорний час використане програмою. У кінці програми виводиться час затримки отримане на основі вимірів.

Рисунок 3.4 - Блок-схема програми виконання затримки на ціле число секунд

Лістинг 3.2 - Програма виконання затримки на ціле число секунд

#include <dos.h>

#include <graphics.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

void tm_delay ( int iTicks)

{

_asm {

push si //; завантажити до стеку вміст регістру SI;

mov si,iTicks //;занести до регістру необхідну затримку в тіках;

mov ah,0 //; функція 00h - для зчитування вмісту лічильника таймеру;

int 1ah //; переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

mov bx,dx //; це слово занести до регістру BX

add bx,si //; й до нього додано число тіків, рівне затримці;

}

delay_loop:

/* З кожним тіком таймеру вміст лічильника за допомогою переривання BIOS INT 8h збільшується на одиницю */

_asm {

int 1ah //;- переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

cmp dx, bx //; порівняти з вмістом регістру BX;

jne delay_loop //;якщо не рівні - затримка продовжується;

pop si //; - інакше поновлення регістру SI значенням зі стеку

}

};

void main()

{

int i,t;

cout<<"Enter count of second:\n";

cin>>t;

int left, top, right, bottom;

int gdriver = DETECT, gmode, errorcode;

/* initialize graphics and local variables */

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

}

left = getmaxx() / 2 - 50;

top = getmaxy() / 2 - 50;

right = getmaxx() / 2 + 50;

bottom = getmaxy() / 2 + 50;

char msg[10];

cout<<" delay begin...\n";

for(i=0;i<t;i++)

{

left+=5;

top+=5;

right+=5;

bottom+=5;

setcolor(4);

rectangle(left,top,right,bottom);

setcolor(5);

sprintf(msg, "%d sec", i);

outtextxy(left+(right-left)/2-5, top+(bottom-top)/2-5, msg);

tm_delay(18);

setcolor(0);

rectangle(left,top,right,bottom);

outtextxy(left+(right-left)/2-5, top+(bottom-top)/2-5, msg);

}

cout<<"\n "<<" delay last\n Press any key";

getch();

closegraph();

}

Програма 1.3 - Фіксація часу між першим і другим натисканням клавіші

Згідно завдання, потрібно було розробити алгоритм, засікати час між двома натисканнями будь-якої клавіші клавіатури і виводити його на екран. Кінець і початок відліку часу фіксувати на екрані ПК.

Для цієї програми змінна - лічильник тиків системного таймера count ініціалізується нульовим значенням. Після виведення інформаційного напису викликаємо функцію, що зупиняє програму до натискання клавіші getch (), чекаючи першого натискання клавіші. Після натискання клавіші запускається нескінченний цикл while(!kbhit ()) (kbhit () -функція бібліотеки «conio.h», яка приймає ненульове значення у момент натиснення клавіші). У тілі циклу виконуємо затримку на 1 тік за допомогою функції tm_delay (), описаної для програми 1.1 і інкрементуємо значення лічильника тиків count. Після натискання будь-якої клавіші роздруковуємо значення лічильника тиків, обчислюємо минулий час в секундах, розділивши count на 18 і також виводимо його на екран.

Рисунок 3.5 - Блок-схема програми фіксації часу між натисканнями клавіш

Лістинг 3.3 - Програма фіксації часу між натисканнями клавіш.

#include <dos.h>

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <math.h>

void main()

{

int n1,n2;

cout<<"press any key\n\n";

getch();

_asm {

mov ah,0 //; функція 00h - для зчитування вмісту лічильника таймеру;

int 1ah //; переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

mov n1,dx //; це слово занести y n1

}

cout<<"delay on...\npress key to stop\n\n";

getch();

_asm {

mov ah,0 //; функція 00h - для зчитування вмісту лічильника таймеру;

int 1ah //; переривання для роботи з таймером; в регістрі DX зчитане молодше слово лічильника таймеру

mov n2,dx //; це слово занести y n2

}

cout<<"left time="<<n2-n1<<" ticks or "<<(n2-n1)/18.2<<" seconds";

getch();

clrscr();

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<dos.h>

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<iostream.h>

#include<windows.h>

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, &reg, &reg);

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, &reg);

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

reg.x.ax=0;

int86(0x33, &reg, &reg);

if(reg.x.bx==0)

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

return -1; }

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

ms_gform(0,0, form);

reg.x.ax=1;

int86(0x33, &reg, &reg);

getch();

reg.h.ah=0;

reg.h.al=old_videomode;

int86(0x10, &reg, &reg);

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, &reg, &reg, &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 <dos.h>

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

union REGS reg;

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

int main(void)

{

clrscr();

int Button;

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

reg.x.ax=0;

int86(0x33, &reg, &reg);

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, &reg, &reg);

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

while(!kbhit())

{reg.x.ax=3;

int86(0x33, &reg, &reg );

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, &reg, &reg);

}

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

find_param:

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. Библиотека системного программиста.

2. Финогенов К.Г. Самоучитель по функциям MS DOS. - Москва. Радио и связь. 1995. - 382 с.

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

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

Размещено на Allbest


Подобные документы

  • Програми, які виводять на екран характеристики комп'ютера. Розробка програми "Монітор використання ресурсів комп’ютера" на мові програмування ASM-86. Алгоритм програми та її реалізація. Системні вимоги, інструкція для користувача, лістинг програми.

    курсовая работа [22,2 K], добавлен 08.08.2009

  • Функції комп'ютерної програми-органайзера, пов'язані із забезпеченням роботи календаря, записної книжки, менеджера контактів (адресно-телефонної книги), годинника, калькулятора. Програмна модель, розробка інтерфейсу і тестування програми, інсталяція.

    курсовая работа [932,8 K], добавлен 03.06.2010

  • Комп’ютерні віруси: джерела виникнення та згубна дія. Групи вірусів, найбільш небезпечні серед них. Робота з антивірусними програмами, перевірка комп'ютера за допомогою антивірусної програми на наявність вірусів. Рекомендації щодо уникнення вірусів.

    лабораторная работа [15,5 K], добавлен 03.10.2010

  • Проектування програми керування мікропроцесорним пристроєм світлової індикації на мові С та Assembler. Розробка алгоритму роботи програми, структурної та електричної принципових схем. Здійснення комп’ютерного моделювання для перевірки розроблених програм.

    курсовая работа [710,7 K], добавлен 04.12.2014

  • Основні принципи дії та архітектура прототипних варіантів CISC-комп'ютера. Інструкції асемблерної мови і принцип трансляції асемблерної програми у машинний код. Розробка тестової програми. Перевірка правильності роботи реалізованих команд у прикладах.

    курсовая работа [446,1 K], добавлен 03.02.2011

  • Класифікація пристроїв системного блока. Програми його сервісного обслуговування. Перевірка працездатності комп'ютера та основні несправності. Програми для очищення реєстру. Сервісне обслуговування HDD. Антивірусні програми Для видалення вірусів.

    курсовая работа [4,2 M], добавлен 08.01.2014

  • Ведення протоколу роботи комп’ютера. Розробка програми для створення списку розширень файлів і занесення часу і дати доступу до них на мові програмування Асемблер. Виклик переривання 21h код-функції та занесення до регістрів. Алгоритм та лістинг програми.

    курсовая работа [14,1 K], добавлен 08.08.2009

  • Огляд існуючих методів розробки компіляторів, детальний опис мови. Характеристика та специфіка процесу розробки програми компілятора на рівні блок-схем і тексту програми. Подання тексту компілятора, а також результатів тестування розробленої програми.

    курсовая работа [510,2 K], добавлен 03.06.2011

  • Вибір засобу виконання поставленої задачі. Функції переривання INT 21h MS DOS, що використані при роботі програм. Функції роботи із DTA та інші функції переривання INT 21h. Функція завершення програми. Розробка програми на Pascal. Допоміжні процедури.

    дипломная работа [89,0 K], добавлен 20.01.2009

  • Мультимедіа як пристрої комп’ютера, призначені для роботи зі звуковою і відеоінформацією. Структура та функціональні особливості мультимедійних програмних засобів. Основні можливості програми з розробки презентацій. Класифікація та типи презентацій.

    презентация [1,1 M], добавлен 17.03.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.