Логическая организация текстового видеобуфера. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Логическая организация текстового видеобуфера.



 

2-х байтовые коды символов записываются в видеобуфер в том порядке, в каком они должны появляться на экране, т.е. первые 80 двухбайтовых полей - соответствуют первой строке, вторые 80 - второй строке и т. д. Таким образом, переход на следующую строку осуществляется не с помощью управляющих кодов возврата каретки или перевода строки, а с размещением кодов символа в другом месте буфера, в полях, соответствующих следующей строке. Вообще при формировании изображения непосредственно в видеобуфере, в обход программ DOS и BIOS, все управляющие коды ASCII теряют свои управляющие функции и отображаются в виде соответствующих им символов. Трактовка же кодов 10,13-перевода строки и ВК- выполняется программами DOS или BIOS, которые в данном случае не активизируются.

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

 

mov AX,0B800h;сегментный адрес видеобуфера

mov ES,AX;загрузка в ES

mov BX,80*2*5;смещение в видеобуфере(в байтах)

mov AL,’*’;код ASCII символа в AL

mov AH,0Eh;атрибут- желтый на черном

mov ES:[BX],AX;запись в видеобуфер

mov ES:[BX+162],0B0Fh;цвет светлобирюзовый по черному,;символ с кодом ASCII Fh

 

Выражение 80*2*5 – смещение от начала видеобуфера первого байта строки 5. В регистр AL –соответствующий первому (четному) байту знакоместа, записывается код ASCII требуемого символа, в регистр АН, соответствующий второму (нечетному) байту знакоместа - код атрибута.

Последняя команда -- базово индексная адресация со смещением

[BX(база)+SI(индекс)+смещение]

Код 0Fh - солнышко

Часть данных подготавливается в буфере пользователя и уже потом переносится в видеобуфер.

Команда mov не может осуществлять пересылку из памяти в память. Для этого предусмотрены специальные команды movsb (move string byte- пересылка строки байтов) и movsw(move string word- пересылка строки слов). Команды пересылают по одному элементу строки, кот. Может быть или байтом или словом. Операнд-источник, т.е. исходная строка, адресуется через пару регистров DS:SI. Операнд-приёмник, т.е. строка назначения через ES:DI.

Однократное выполнение команды пересылает один элемент строки, при этом после каждой операции пересылки, регистры SI и DI положительное (если флаг DF регистра флагов равен 0) или отрицательное (если флаг DF=1) приращения. Величина приращения равна 1 или 2 в зависимости от пересылаемых слов.

 

Для movsb приращение SI,DI= +1,DF=0

-1, DF=1

 

movsw SI,DI= +2,DF=0

-2,DF=1

 

Для того, чтобы переслать целую строку, команда movsb/movsw предворяется префиксом повторения rep, который заставляет процессор выполнить команду CX раз.

Запишем строку в видеобуфер:

 

push CS;DS на наш сегмент

pop DS; команд

mov AX,0B800h;

mov ES,AX;ES-> на видеобуфер

mov SI, offset msg;SI= адрес источника

movDI, 80*2*12+37*2;DI= адрес приёмника

mov CX,msglen;CX-число пересылаемых битов

cld; сброс DF - вперед

rep movsb; пересылка в цикле

;Данные

msg DB ‘П’,1Eh,’р’,1Eh,’Н’,1Eh,’М’,1Eh,’Е’,1Eh,’Р’,1Eh

msglen=$-msg

 

Сдвиг от начала видеобуфера составляет 12 строк по 80 символов + 37 символов.

В некоторых случаях операции со строками удобнее выполнять от конца строк. Тогда команда std (set direction flag) - установить направление назад.

Если для всех символов атрибут одинаковый, то программа может быть организована следующим образом:

 

; DS на наш сегмент

; ES на строку 0 видеобуфера

mov DI, 80*2*5; начальное смещение на экране

; Будем переносить байт за байтом на экран, вставляя между кодами

; ASCII биты атрибута

mov CX, str_len; длина строки

movSI,offset str; смещение исходной строки

cld; DF=0 вперед

mov AH,attr; атрибут в AH

next: lodsb; загрузим в AL очередной символ

stosw; выгрузим символ = атрибут из AX в;;видеобуфер

loop next; повторять str_len раз

;Данные

str DB ’Пример вывода в видеобуфер’

str_len=$-str

attr DB 1Eh; атрибут всех символов строк

 

SI- смещение исходной строки

DI-смещение в видеобуфере

 

В каждом слове видеобуфера младший байт отводится под код ASCII, старший под код атрибута. Слова, переносимые в видеобуфер, формируются в АХ. Поскольку атрибут не изменяется, он загружается в АН перед началом цикла.

Команда lodsb– загружает в содержимое байта по адресу DS:SI. После чего SI увеличивается на 1. Stosw переносит АХ по адресу ES:DI, после чего увеличивается на 2.

 

 

Программирование портов.

Звук.

 

Управление аппаратурой компьютера осуществляется через управляющие регистры этой аппаратуры. Каждый из регистров имеет свой адрес от 0000h до FFFFh. Этот адрес или номер называется портом и программирование аппаратуры путем непосредственного обращения к портам называется программирование через порты. Обращение к портам осуществляется с помощью 2-х команд.

In - ввод из порта

Out - вывод в порт

Рассмотрим программирование через порты на примере управления динамиком компьютера.

 
Программирование звука в простейшем случае осуществляется путём периодического включения и выключения тока, протекающего через динамик, по командам программы. Если частота переключения лежит в пределах 16-16Кгц- мы слышим звуковой тон соответствующей частоты. Для управления током динамика служит бит 1 порта с номером 61h.

61h      

 

 

 


Таким образом, программа должна непосредственно переключать этот бит, что исключает выполнение другой программы. Для того чтобы получить звуковое сопровождение одновременно с выполнением другой программы необходимо воспользоваться методом описанным ниже.

Пример простейшей программы, генерирующий одиночный звуковой сигнал заданной высоты.

 

Cli; запрет асинхронного прерыванмя

in AL,61h; ввод содержимого порта 61h

mov CX,4000; длительность звукового сигнала

begin:

push CX; сохранить служебный цикл

or AL,2; установим бит 1

out 61h,AL; выведем в порт, включив динамик

mov CX,1000; пауза, в течении которой через

loop $; динамик течёт ток

and AL,11111101B; сбросим бит 1

out 61h,AL; выведем в порт, выключив динамик

mov CX,1000; организуем паузу, в течении которой

loop $; через динамик не течёт ток

pop CX; восстановим служебный цикл

loop begin; выводим

sti; разрешим прерывание

 

cli – в действительности просто запретить прерывание только от таймера, который прерывая 18 раз в сек будут прерывать генерацию тока и искажённость звука. Для выборочного запр. прерывания надо программировать контролер, запрещающий все прерывания. Поместить данные из порта можно только в регистр AL или AX. Номер порта задаётся в команде в виде числа, если номер не превышает FFh или поместить в регистр DX. В последнем случае используется команда in AL,DX.

Чтение из порта необходимо, т.к. нельзя изменять отдельные биты.

Команда loop $ передаёт управление сама на себя, т.е.label1: loop label1.

Команда and сбрасывает бит. Ток в динамике выключается, образуя второй полупериод звукового колебания. Частота и длительность звукового тока в этом случае зависит от скорости работы процессора. Для того чтобы не зависеть от CPU используется следующая история.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 323; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 54.144.233.198 (0.131 с.)