Отображение монохромного файла 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