Отображение монохромного файла BMP на экране

Анализ этапов разработки программы отображения монохромного файла ВМР на экране монитора в 256-цветовом видеорежиме средствами языка assembler для микропроцессора Intel-8086. Проектирование пользовательского интерфейса. Особенности программной реализации.

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

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

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

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

Московский Энергетический Институт

(Технический Университет)

Курсовая работа

По дисциплине

"Системное Программное Обеспечение"

Отображение монохромного файла BMP на экране

Выполнил студент

Группы А-7-06

Горбачев Антон

Москва, 2009 г.

Содержание

1. Анализ задания

2. Проектирование пользовательского интерфейса

2.1 Общие требования

2.2 Особенности программной реализации

3. Разработка алгоритма

3.1 Считывание информации из файла, анализ заголовка

3.2 Установка видеорежима и анализ его параметров

3.3 Разработка процедуры вывода изображения на экран

3.4 Схема алгоритма

4. Разработка второстепенных процедур и макрокоманд

5. Тестирование и отладка

Заключение

Список литературы

Приложение

1. АНАЛИЗ ЗАДАНИЯ

Техническое задание:

Разработать программу отображения монохромного (1 бит на точку) файла ВМР на экране монитора в 256-цветовом видеорежиме средствами языка assembler для микропроцессора Intel 8086.

Поставленная задача будет реализована в видеорежиме VESA c разрешением экрана 640х480 точек.

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

2. ПРОЕКТИРОВАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА

2.1 Общие требования

монохромный файл программа видеорежим

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

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

В случае необходимости повторного вывода изображения на экран можно поступить двумя способами:

а) перезапустить программу после осуществления ее завершения;

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

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

2.2 Особенности программной реализации

Методы открытия файла и ввод входной информации

Для открытия файла, необходимо использовать одну из функций языка программирования. Наиболее удобной является та функция открытия файла, которая осуществляется при наличии ASCII-строки с адресом файла, т.к. в данном случае адрес наиболее просто сформировать, например, ввести с клавиатуры. При этом данная функция каким-либо образом должна фиксировать ошибку в случае открытия несуществующего файла, а также возвращать файловый номер в случае успешного открытия, для последующего обращения. Рассматривая перечень данных требований, несложно выбрать функцию 3DH, выполняющуюся по прерыванию INT 21H. Данная функция требует для своего открытия ASCIIZ-строки с адресом и именем файла в формате:

<Название диска>:\<названия папок>\...\<имя файла>.bmp,

а также устанавливает флаг CF регистра флагов в случае отсутствия файла и возвращает файловый номер, если открытие произошло успешно.

Программу на языке assembler можно записать следующим образом:

mov ah,3dh ; Установка команды открытия файла

mov al,00h ; установка режима «только чтение»

lea dx,adr ; Сохранение ASCIIZ-строки с адресом файла

int 21h ; выполнение

jc outp ; переход к завершающей части в случаи ошибки.

Таким образом, остается организовать ввод ASCIIZ-строки с адресом в вышеописанном формате. Оптимальным способом реализации ввода, является организация процедуры ввода адреса и обращение к ней перед открытием файла. Наиболее простым будет ввод адреса посимвольно с клавиатуры с проверкой каждого введенного символа на случай нажатия клавиши Enter, т.к. именно по нажатию данной клавиши целесообразно завершить операцию ввода. Из-за отсутствия на клавиатуре отдельной клавиши ввода «:» - необходимо также организовать ввод данного символа отдельно. При вводе адреса можно допускать ошибки, таким образом, уместно будет запрограммировать клавишу back для удаления неверно введенного символа.

Пример возможной реализации процедуры ввода адреса:

mov ah,07h ; функция ввода символа без эхо

int 21h ; осуществление ввода

cmp al,0dh ; проверяем на нажатие enter

je end_for ; если нажали, то выходим из процедуры по метке

cmp al,3Bh ; проверяем нажатие двоеточия

je dvoetoch ; если нажали клавишу «Ж», то вводится двоеточие

cmp al,08h ; проверяем нажатие клавиши back

je back ; в случае нажатия данной клавиши, переходим по

……

;метке в ту часть процедуры, где осуществляется удаление введенного символа.

Осуществление установки цвета фона экрана

Т.к. изображение монохромное и выводится в черно-белом варианте, то для наглядности необходимо установить цвет фона экрана, отличный от черного и белого. Реализуем данную установку в процедуре, которую назовем canvas. Действие процедуры должно заключаться в передаче в видеобуфер кода цвета фона (выберем коричневый) по адресу текущей активной точки экрана. Для этого организуем цикл, пробегающий адреса всех точек экрана в видеобуфере и помещающий в соответствующие ячейки код цвета фона. Координаты текущей точки будем вычислять как номер сегмента видеопамяти и смещения в соответствующем сегменте, т.к. это единственный способ вычисления положения точки в режимах VESA.

Способ вычисления координат точки на экране будет рассмотрен далее при проектировании алгоритма вывода изображения.

Реализация запроса на повторное выполнение программы

Т.к. при работе программы возможны случаи ввода ошибочной информации, а также может появиться необходимость повторить выполнение программы без осуществления выхода, то необходимо разработать запрос на повторное выполнение. Запрос на повторение выполнения программы можно организовать в виде строки вида:

«Do you want repeat?(Y/N)»,

и при нажатии соответствующей клавиши осуществить либо выход из программы, либо переход к повторному вводу адреса. Т.к. пользователь может нажимать случайные кнопки, отличные от «Y» и «N», то нужно отфильтровывать случайные нажатия клавиш до момента нажатия функциональных клавиш.

Разработаем возможный вариант программы:

L1:

call perenos;Вызов функции переноса каретки на пустую строку

mov ah,09h;функция вывода строки на экран

mov dx, offset message5 ;строка «Do you want repeat?(Y/N)»

int 21h;осуществляем вывод

L2:

mov ah,08h;функция ввода символа

int 21h;осуществляем ввод

cmp al,79h;если вводим y, то повторяем вывод картинки

jne L3;если введенный символ не у, то переходим дальше

call main;запускаем программу вывода с самого начала

L3:

cmp al,6Eh ;если вводим n, то выход из программы

je full_end;выходим из программы

jmp L2 ;если не n, то возвращаемся наверх, пока не введем n или y

full_end:

mov ax,4c00h;функция завершения программы

int 21h

Таким образом, интерфейс программы, для установки диалога с пользователем, разработан.

3. РАЗРАБОТКА АЛГОРИТМА

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

3.1 Считывание информации из файла, анализ заголовка

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

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

В начале каждого ВМР файла находится его заголовок. Размер заголовка с палитрой занимает первые 62 байта памяти файла, таким образом, это и составит размер первой считываемой из файла порции.

Данным требованиям обращения к файлу удовлетворяет функция языка assembler 3FH, выполняемая по прерыванию INT 21H. Перед выполнением считывания функция требует определения числа считываемых байтов информации, значение файлового номера, определяющего текущую позицию, с которой происходит считывание, а также буферную строку, куда помещается считанная информация. Т.к. необходимо многократное обращение к файлу, функцию считывания целесообразно оформить в виде процедуры. Реализуем процедуру считывания в соответствии с оговоренными требованиями:

readf proc ;процедура считывания из файла порции данных в строку smes

; требует указания числа считываемых байт в регистре CX

psh ax,bx,dx,si ; сохранение РОНОВ в стеке одной макрокомандой

mov bx,fstart ; указание файлового номера

lea dx,smes ; указание буферной строки

mov ah,3fh ; установка функции считывания

int 21h ; выполнение считывания

pp si,dx,bx,ax ; восстановление РОНов

ret ; возврат из подпрограммы

readf endp

Среди ограничений, приведенных в техническом задании, упоминалась необходимость обрабатывать только монохромные изображения. Первое слово заголовка BMP файла всегда содержит символы «BM», представленные кодом 4D42h. По данной информации можно осуществить проверку формата файла и организовать выход, если формат не ВМР. Таким образом, программа считывает первое слово заголовка из буферной строки smes в регистр и сравнивает его содержимое с кодом 4D42h и в случае совпадения выполнение работы программы должно продолжаться.

Одним из способов решения задачи проверки файла на монохромность, является возможность узнать число бит, приходящихся на кодирование точки изображения в области данных файла. Если это число равно 1, то изображение монохромное, в противном случае изображение цветное и его дальнейшая обработка не имеет смысла. Информация о числе бит на точку изображения располагается в заголовке со смещением 1Сh и занимает слово.

Для вывода изображения на экран, необходимо также считать из заголовка и сохранить в памяти следующие величины: ширину изображения (в точках), высоту изображения (в точках), размер области данных (в байтах). Из данных величин легко рассчитывается ширина изображения в байтах путем деления ширины изображения в точках на 8. Такое вычисление справедливо, в силу того, что 1 байт изображения хранит 8 бит, каждый из которых принимает значение “1”(точка белого цвета) или “0”(точка черного цвета). А также размер строки файла в байтах путем деления размера области данных рисунка на его высоту, выраженную в точках.

Вышеназванные величины имеют в заголовке файла следующее смещение:

Ширина изображения - 12h ( 2 байта)

Высота изображения - 16h (2 байта)

Размер области данных - 22h (4 байта)

3.2 Установка видеорежима и анализ его параметров

Выбранный выше видеорежим VESA, имеющий разрешение 640 х 480 точек экрана может быть установлен специальной функцией BIOS 4F02h по прерыванию INT 10H. При установке данного видеорежима, в массив, который необходимо объявить заранее, автоматически заносится информация, которую нужно проанализировать и сохранить для осуществления последующего вывода изображения на экран. В частности данная информация необходима для точного вычисления координаты точки на экране и занесения ее кода в соответствующую ячейку видеопамяти.

Название требуемых величин и их смещение в массиве:

Высота экрана в точках - 12h (2 байта)

Ширина экрана в точках - 14h (2 байта)

Размер сегмента (окна) видеопамяти в байтах - 4h

Адрес видеобуфера - 08h

3.3 Разработка процедуры вывода изображения на экран

Вывод изображения - основная задача данной программы. В силу того, что информация, как оговорено выше, будет считываться из файла построчно, а изображение в файле представляет из себя матрицу, то организуем процедуру в виде двух вложенных циклов, внешний из которых будет пробегать число строк в картинке от значения высоты изображения к 0, а внутренний цикл - от 0 до размера ширины картинки в точках и будет осуществлять вывод точек изображения. Таким образом, печать изображения на экран будет организована построчно слева на право.

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

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

Значение ширины экрана необходимо умножить на номер текущей выводимой строки изображения, при этом результат умножения будет содержаться в регистрах ax(младшая часть) и dx(старшая часть). Не сложно заметить, что содержимое регистра dx - содержит номер сегмента (окна) видеопамяти, а регистр ах - смещение в этом окне. Далее во внутреннем цикле, после вывода каждой точки значение смещения увеличивается на 1, для перехода к следующей точке в строке.

3.4 Схема алгоритма

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

Рис. 1. Схема алгоритма

4. РАЗРАБОТКА ВТОРОСТЕПЕННЫХ ПРОЦЕДУР И МАКРОКОМАНД

Название процедур, выполняющих второстепенные функции в программе, а также их характеристики описаны в таблице 1.

Таблица 1 Второстепенные процедуры

Название процедуры

Ее назначение

Setwin

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

Таким образом, данная процедура - процедура установки номера активного сегмента (окна) видеопамяти, в который производится запись.

perenos

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

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

psh macro a,b,c,d

push a

push b

push c

push d

endm

pp macro a,b,c,d

pop a

pop b

pop c

pop d

endm

5. ТЕСТИРОВАНИЕ И ОТЛАДКА

Данный программный продукт можно тестировать по нескольким направлениям:

а) На реакцию программы при неправильном вводе имени файла или вводе несуществующего файла.

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

б) На реакцию программы при случайном нажатии клавиш после появления изображения на экране монитора.

В данном случае, обеспечим выход из режима просмотра изображения только при нажатии клавиши Exit. Таким образом, программа будет защищена от случайных нажатий пользователя. Но в случае случайного нажатия клавиши Exit, программа предложит ввести название адрес изображения снова, следовательно, можно будет восстановить утраченное состояние дисплея.

в) На попытку открыть файл очень большого размера (превышающий область вывода на экране).

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

Случай открытия не ВМР файла, а также открытие цветного ВМР файла был оговорен выше.

ЗАКЛЮЧЕНИЕ

Исходя из вышеприведенного описания, разработанная программа для выполнения требует:

а) Наличие на диске монохромного .BMP файла

б) Наличие видеокарты поддерживающей видеорежимы VESA

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

а) Внедрение более совершенного диалога пользователя с программой для предоставления более широкого диапазона возможных действий в случаях невыполнения условий работоспособности.

б) Разработка более совершенных алгоритмов вывода графического изображения на экран компьютера.

СПИСОК ЛИТЕРАТУРЫ

1. Абель П., Язык ассемблера для IBM PC и программирования - М.: Высшая школа, 1992. - 447 с.

2. Финогенов К.Г., Самоучитель по системным функциям MS-DOS. - М.: Горячая линия - Телеком, 2001. - 382 с.

3. Соколенко П., Программирование SVGA-графики для IBM PC.

ПРИЛОЖЕНИЯ

Приложение А

Перечень переменных, используемых в программе

Полный перечень всех переменных с описанием приведен в таблице 2.

Таблица 2 Переменные, объявленные в программе

Идентификатор

Смысл

wp

Ширина изображения в точках

wb

Ширина изображения в байтах

hp

Высота изображения в точках

fwb

Длина строки файла в байтах

bcn

Количество разрядов на 1 точку изображения

hscr

Высота экрана в точках

vscr

Ширина экрана в точках

vbuff

Адрес видеосегмента

nshr

Число от 0 до 16 для контроля количества сдвигов в регистре при извлечении бита изображения.

numw

Номер окна

mass

Массив с информацией о режиме

Message1-6

Вспомогательные сообщения

fon

Переменная, хранящая цвет фона экрана

adr

Хранит адрес ВМР изображения

fstart

Для хранения адреса места последнего считывания (файловый номер)

smes

Буферная строка для считывания информации из файла

sch

Счетчик строк в процедуре переноса строки

Приложение Б

Листинг программы

.model small

.stack 100h

.data

wp dw 0 ;ширина изображения в точках

wb dw 0;ширина изображения в байтах

hp dw 0;высота изображения в точках

fwb dw 0;длинна строки файла в байтах

bcn db 0;количество разрядов на 1 точку изображения

hscr dw 0;высота экрана в пикселях

vscr dw 0;ширина экрана в пикселях

vbuff dw 0;адрес видео сегмента

nshr dw 0;число от 0 до 16 для контроля числа сдвигов в

;регистре.

numw dw 0;номер окна

mass db 255 dup(?);строка для ввода информации об установленном

;режиме

message1 db 'File you want to be opened probably does`t exist or it is not .BMP file!$'

message2 db 'Necessary mode is not supported!$'

message3 db 'You try to open color file!$'

message4 db 'For some reasons new mode was not set!$'

message5 db 'Do you want repeat?(Y/N)$'

message6 db 'Enter the adress of the picture:$'

fon dw 0606h ;коричневый фон экрана

adr db 128 dup(?);строка для ввода адреса файла

fstart dw ?;для хранения адреса места последнего

;считывания (файловый номер)

smes db 160 dup(?);буферная строка для считывания информации из файла

sch db 1;счетчик строк в процедуре переноса строки

.code

mov ax,@data

mov ds,ax

mov es,ax

psh macro a,b,c,d;макрос для загона в стек 4 объектов

push a

push b

push c

push d

endm

pp macro a,b,c,d;макрос для выборки из стека 4 объектов

pop a

pop b

pop c

pop d

endm

main proc

call perenos

mov ah,09h

mov dx, offset message6

int 21h

call perenos

call Addr;ввод адреса файла

mov ah,3dh

mov al,00h

lea dx,adr

int 21h

jc outp

;Считывание заголовка

mov fstart,ax;сохранение файлового номера

mov cx,62d;считываем заголовок и палитру

call readf

; проверяем ВМР ли файл открыли, и черно-белый ли он

mov si, offset smes

mov dx,[si]

cmp dx,4d42h

jne outp;если не ВМР, то выходим

mov dx,[si+1ch];считываем кол-во бит на разряд

mov bcn,dl

cmp dx,0001h;если не 1, то выходим

je next

call perenos

mov ah,09h

mov dx, offset message3

int 21h

jmp L1

outp:

call perenos

mov ah,09h

mov dx, offset message1

int 21h

jmp L1

next:

; Обработка заголовка для файла под windows

mov dx,[si+12h];ширина картинки в пикселях

mov wp,dx

mov ax,dx;вычисляем ширину картинки в байтах

mov cl,8

div cl;смотрим с остатком или без него разделилось

cmp ah,00h

je s

mov ah,00h

inc al

s:

mov wb,ax;сохраняем ширину картинки в байтах

cmp wp,640d;проверка на превышение ширины картинки значения 640

jbe s0

mov dx, 640d

mov wp, dx

s0:

mov dx,[si+16h];высота картинки в пикселях

mov hp,dx

mov dx,[si+22h] ;вычисляем ширину строки файла в байтах

mov ax,dx;путем деления размера области данных рисунка

;на его высоту

mov dx,[si+24h]

div hp

mov fwb,ax

cmp hp,480d;проверка на превышение высоты картинки значения 480

jbe s1

mov dx,480d

mov hp, dx

s1:

; jmp test2

test2: ;проверка на поддержание нужного режима

lea di, mass

mov ax,4f01h

mov cx,101h;код режима Vesa: 640x480 256 цветов.

int 10h

cmp ax,4fh

jz set_mode

call perenos

mov ah,09h

mov dx, offset message2

int 21h

jmp outp

set_mode:;установка режима

mov bx,101h;код режима

mov ax,4f02h;код команды установки режима

int 10h

cmp ax,4fh;проверка правильности установки

jz next2

call perenos

mov ah,09h

mov dx, offset message4

int 21h

jmp ddd

next2:;считываем информацию об экране окна в массив mass

lea di,mass

mov dx,[di+12h];считываем высоту экрана в точках

mov hscr,dx

mov dx,[di+14h];считываем ширину экрана в точках

mov vscr,dx

mov dx,[di+08h];считываем адрес видео сегмента

mov vbuff,dx

call canvas

call picture

ddd:

mov ah,08h

int 21h

cmp al, 1bh

jne ddd

; возвращение старого режима при завершении программы

back_mode:

mov bl,03d;код старого режима

mov bh,00h

mov ax,4f02h;код команды установки

int 10h

mov sch,1D;присваиваем счетчику строк 1

call perenos;осущестляем перенос строки строки на позицию sch

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

L1:

call perenos

mov ah,09h

mov dx, offset message5

int 21h

L2:

mov ah,08h

int 21h

cmp al,79h;если вводим y, то повторяем вывод картинки

jne L3

call main

L3:

cmp al,6Eh;если вводим n, то выход из программы

je full_end

jmp L2

full_end:

mov ax,4c00h

int 21h

; процедура установки видео окна(нового сегмента видеопамяти)

; параметров не требует.

setwin proc

psh ax,cx,bx,dx

xor bx,bx

mov dx,numw;вводим номер окна

mov ax,4f05h

int 10h

pp dx,bx,cx,ax

ret

setwin endp

;процедура ввода адреса файла и его имени

;параметров не требует.

Addr proc

lea si, adr

mov di,0

dec sch

psh ax,cx,bx,dx

mov cx,128D

for:

mov ah,07h;вводим символ без эхо

int 21h

cmp al,0dh;проверяем нажатие enter

je end_for

cmp al,3Bh;проверяем нажатие двоеточия

je dvoetoch

cmp al,08h;проверяем нажатия клавиши back

je back

mov ah,02h;если все нормально выводим символ на экран

mov dl,al

int 21h

mov [si],dl;сохраняем его в строке адреса

inc si

inc di

jmp ee

dvoetoch:

mov ah,02h;если нажали двоеточие, выводим его

mov dl,':'

int 21h

mov [si],':';сохраняем в строке адреса

inc si

inc di

jmp ee

back: ;если ввели неверный символ и хотим его удалить

cmp di,0 ;есть ли на экране введенные символы?

je ee

dec si;возвращаемся на предыдущий символ в строке,

;чтобы его перезаписать

dec di;возвращаемся на предыдущую позицию на экране

mov ah,02h;осуществление перевода каретки на предыдущий

;символ

mov bh,00;номер экрана

mov dx,di;номер символа

mov dh,sch;номер строки

int 10h

mov ah,02h;затираем неверно введенный символ пробелом

mov dl,' '

int 21h

mov ah,02h;снова переводим на него каретку

mov bh,00

mov dx,di

mov dh,sch

int 10h

ee:

loop for

end_for:

mov [si],0;строка с адресом файла должна заканчиваться

;нулем для распознавания ее конца

inc sch

pp dx,bx,cx,ax

ret

Addr endp

;процедура считывания из файла порции данных в строку smes

; перед вызовом процедуры необходимо указать в сх число считываемых байтов из файла.

readf proc

psh ax,bx,dx,si

mov bx,fstart

lea dx,smes

mov ah,3fh

int 21h

pp si,dx,bx,ax

ret

readf endp

; Процедура установки фона экрана

; не требует параметров, все используемые ею данные зарезервированы в памяти.

canvas proc

psh es,di,cx,si

mov dx,0000h

mov numw,dx;обнуляем переменную номера окна

call setwin;уснановка нулевого окна

mov ax,vbuff

mov es,ax;сохраняем в es адрес видеосегмента

xor di,di;обнуление di

mov ax,vscr;сохраняем в ax ширину экрана

mul hscr;умножаем на высоту экрана

mov cx,dx;в dx после умножения будет число окон,

;влезающих в экран

mov dx,ax;а в ах будет смещение относительно последнего

;окна

mov ax,fon;сохраняем в ах код цвета фона

circ:;запускаем цикл

push cx

mov cx,32768;число слов цвета, записанных в память

;видеосегмента в текущее окно(сегмент)

rep stosw;пересылаем 65536 байтов цвета фона в i окно

inc numw

call setwin;устанавливаем его

pop cx

loop circ;возврат к началу цикла

mov cx,dx;закрашиваем последние части последнего окна

rep stosw;пересылаем слова цвета

mov dx,0000h

mov numw,dx;снова устанавливаем нулевое окно

call setwin

pp si,cx,di,es

ret

canvas endp

;процедура вывода картинки

; данная процедура не требует параметров, все используемые ею данные зарезервированы в памяти.

picture proc

psh es,di,cx,si

mov ax,vbuff;адрес буфера видеосегмента

mov es,ax;сохраняем его в еs

mov cx,hp;заносим в сх высоту картинки, т.к выводим построчно, снизу вверх

for1:

push cx

mov cx,fwb;заносим в сх размер строки файла в байтах, для

;считывания из файла

call readf;считываем строку файла сверху вниз

lea si, smes;в si адрес начала буфера обмена, в котором

;считанная строка изображ.

pop cx

push cx

mov ax,hscr;для вычисления адреса строки картинки на

;экране помещаем в ах ширину экрана

mul cx;умножаем на номер текущей строки, которую

;выводим на экран

mov numw,dx;после умножения в dx будет номер окна

mov di,ax;а в ах, смещение в этом окне

call setwin;устанавливаем окно

mov cx,wp;заносим в сх ширину картинки в точках, для

;организации цикла вывода строки поточечно

mov nshr,16;переменная для контроля сдвига в регистре на 1

;разряд (от 0 до 16)

mov bx,[si];считываем в bx текущие 16 точек изображения

mov dh,bh;меняем байты местами, т.к в памяти они

;переставлены

mov bh,bl

mov bl,dh

for2:

push cx

shl bx,1;сдвигаем содержимое bx влево,при этом

;вытесненный бит пишется в cf

jb white;если cf=1, то точка белая, иначе - черная

mov al,00h;код белого цвета

stosb;пересылаем его в видеопамять по адресу es:di,

;в di - смещение относительно текущего окна

jmp per

white:;если в cf=0, то точка черного цвета

mov al,0fh;код черного цвета

stosb;засылаем его в память

per:

cmp di,0000h;если смещение в окне достигло предельного

;значения

jne ok;если не достигла переходим на оk

inc numw;если достигла, то увеличичаем номер окна

call setwin;устанавливаем его

xor di,di;обнуляем значение смещения относительно нового окна

ok:

dec nshr;уменьшаем nshr на 1, чтобы следить, сколько битов сдвинуто

cmp nshr,0;если она равна 0(т.е. сдвинули все содержимое bx)

jne ok1;если еще не все, то переходим на метку ок1

add si,2;а если вытолкнули все биты,

mov bx,[si];то считываем новые 16 точек из буфера обмена

mov dh,bh;переставляем байты местами

mov bh,bl

mov bl,dh

mov nshr,16;заносим 16 для новых 16 сдвигов.

ok1:

pop cx

loop for2

pop cx

loop for1

pp si,cx,di,es

ret

picture endp

; процедура осуществляет перевод каретки на пустую строку в текстовом режиме

; не требует никаких параметров

perenos proc

push dx

push bx

push ax

mov dh,sch

mov ah,02h

mov bh,00

mov dl,00

int 10h

pop ax

pop bx

pop dx

inc sch

ret

perenos endp

main endp

end

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


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

  • Проект игры "Ловушка", созданный при помощи языка программирования C++. Описание заголовочных файлов. Правила и цель игры "Ловушка". Отображение движущихся объектов игры на экране с помощью заголовочного файла "gameclass.h". Описание игрового процесса.

    курсовая работа [70,6 K], добавлен 14.10.2012

  • Функциональная схема микропроцессора Intel 8086 (i8086). Формирование физического адреса памяти, выборка команд из памяти и запись их в очередь команд. Система команд процессора. Суть защищенного режима, переход из защищенного режима в реальный режим.

    практическая работа [93,3 K], добавлен 24.03.2013

  • Формирование на экране меню для выбора функций. Элементы пользовательского интерфейса. Описание внутренних переменных, входных и выходных данных языка программирования Си. Выбор пользователем функции. Создание программы "Список коммерческих банков".

    курсовая работа [491,9 K], добавлен 17.03.2015

  • Область применения данной программы. Распределение ставок средствами визуального программирования. Сообщения оператору. Текст программы. Графическое отображение передвижения наездников на экране. Возможность случайного распределения номеров наездников.

    курсовая работа [57,0 K], добавлен 20.11.2013

  • Разработка программы, представляющей собой простой текстовый редактор, использующий структуру данных для промежуточного хранения редактируемого файла. Функциональное описание разработки. Внутренняя структура двоичного файла нового класса "bin_file".

    курсовая работа [254,6 K], добавлен 26.01.2013

  • Разработка приложений на платформе Win32 для исследования взаимодействия между процессами через отображение файла в память. Модель приложений "клиент - сервер". Описание алгоритма работы программы-клиента и программы-сервера. Результаты работы приложений.

    курсовая работа [869,3 K], добавлен 18.05.2014

  • Разработка шаблона для работы с двоичным файлом, в котором хранится структура данных (двоичное дерево объектов). Представление двоичного дерева в файле. Вставка объекта в дерево, его удаление. Алгоритм сжатия файла. Описание пользовательского интерфейса.

    курсовая работа [1,1 M], добавлен 26.01.2013

  • Краткое описание этапов разработки программного продукта. Анализ поставленных задач и определение основных функций программы. Разработка пользовательского интерфейса. Составление программной документации. Техническое задание на разработку проекта.

    дипломная работа [1,5 M], добавлен 06.04.2013

  • Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.

    контрольная работа [1,0 M], добавлен 23.11.2014

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

    дипломная работа [411,1 K], добавлен 02.03.2011

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