Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Лабораторная работа №6

Читайте также:
  1. A) дохода лица, работающего по найму и b) дохода самозанятого лица.
  2. III. Работа над темой
  3. Quot;Бедные и средний класс работают ради денег". "Богатые заставляют деньги работать на себя".
  4. Quot;РАБОТА" ЛЮБВИ
  5. V. Самостоятельная работа студентов.
  6. V.Игра «Мы работаем на фабрике».
  7. VIII. Самостоятельная работа студентов

Тема: «Работа с внешними устройствами, на примере видеоадаптера»

(2 часа)

В видеопамяти вся информация записывается в виде длинной ленты данных. А при выводе символов на экран происходит ее преобразование в матрицу (разбивают на строки). Для видео режима 80х25 одна строка занимает 160 байт = 80байт * 2 байта на каждый символ.

Для того чтобы вывести символ на экран, используя видеоадаптер, необходимо вычислить смещение относительно используемого адреса, на который настроен указатель. Для этого используется формула: (y*X1 + x)*2, где y – строка, x – колонка, X1 – количество столбцов используемых в данном режиме.

Работа с ВУ через адресное пространство:

#include<stdio.h>

#include<conio.h>

void main(){

/*записываем в область памяти, принадлежащую внешнему устройству (контроллеру видеоадаптера)*/

clrscr();

char far *ykazat=(char far *)0xB8000000;

*ykazat='*';

}

Пример перехвата прерывания в ОС MS-DOS

#include<dos.h>

#include<stdio.h>

//задаем адрес видеопамяти

char far *ykazat=(char far*)0xB8000000;

/*объявляем переменную, в которой сохраняется перехваченный вектор прерывания*/

void interrupt(*old_vect) (...);

//новая функция обработки прерывания

void interrupt fun_vector(...){

//сохраняем в стеке используемые перехваченным прерыванием регистры

asm{

push ax

push bx

push es

}

//переводим номер функции в ASCII код

if (_AH>9) *ykazat=_AH+0x41-10;

else *ykazat=_AH+0x30;

//восстанавливаем регистры

asm{

pop es

pop bx

pop ax

}

old_vect(); //вызов старого прерывания

};

void main(){

old_vect=getvect(0x10); /*сохраняем значение перехватываемого вектора*/

setvect(0x10,fun_vector); /*записываем новое значение вектора*/

_AH=0x0e;

_AL='@';

geninterrupt(0x10);

setvect(0x10,old_vect);/*восстанавливаем перехвач.

вектор*/

}

Прерывание по таймеру 1Ch (пользовательское) – этот вектор (0:0070) BIOS берет по каждому тику аппаратных часов. Первоначально он использует IRET, но может быть изменен пользовательской программой с целью адресовать фоновую программу пользователя, базирующуюся на таймере. И поскольку программа INT 1Ch выполняется во время низкоуровневого аппаратного прерывания, и система еще не сбрасывает контроллер прерываний, поэтому другие аппаратные прерывания (в том числе прерывание от клавиатуры) не будут происходить при работе INT 1Ch, т.е. не будет работать ввод пользователя. Поэтому большинство программ перехватывают вектор INT 08h, вызывают нужный вектор, а только затем выполняют операции, зависящие от времени, после того как BIOS закончит свою работу.

Задание:

1. Записать в виде прямой диагонали фамилию и имя, используя прямой доступ к видеопамяти (выполнить то же самое для обратной диагонали).

2. Дополнительное задание:

Написать программу, перехватывающую вектор 1Ch (таймер), с целью увеличения счетчика задержки по времени. В векторе прерывания увеличивать счетчик на 1. В основной программе использовать счетчик для задержки на определенное количество секунд.

1секунда=18 тиков (18,2)

Пояснение: создаваемой функции дается задание увеличения тиков. Пример: 18*3=3 секунды.


Дата добавления: 2015-07-11; просмотров: 95 | Нарушение авторских прав


Читайте в этой же книге: Лабораторная работа №1 | Лабораторная работа №2 | Задание на выполнение | Лабораторная работа №8 | Лабораторная работа №9 |
<== предыдущая страница | следующая страница ==>
Лабораторная работа №3| Лабораторная работа №7

mybiblioteka.su - 2015-2024 год. (0.006 сек.)