Тема: Графические видеорежимы. Работа с VGA-режимами 


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



ЗНАЕТЕ ЛИ ВЫ?

Тема: Графические видеорежимы. Работа с VGA-режимами



Пример №1. Разработать программу, которая переводит экран в графический режим 13h (320x200) и заселяет его точками случайным образом, после чего эти точки эволюционируют согласно законам алгоритма «Жизнь»: если у точки меньше двух или больше трех соседей, она погибает, а если у пустой позиции есть три соседа, в ней появляется новая точка.

masm

model small

.stack 100h

.code

.186

 

start:

mov AX,@data

mov DS,AX

; заполнение массива ячеек псевдослучайными значениями

xor ax,ax

int 1Ah; Функция АН = 0 INT 1Ah: получить текущее время DX теперь содержит

; число секунд, прошедших с момента включения компьютера,

; которое используется как начальное значение генератора случайных чисел

mov di,320*200+1; максимальный номер ячейки

fill_buffer:

imul dx,4E35h; простой генератор случайных чисел

inc dx; из двух команд

mov ax,dx; текущее случайное число копируется в АХ,

shr ax,15; от него оставляется только один бит,

mov byte ptr [di],al; и в массив копируется 00, если ячейка пуста, и 01, если заселена

dec di; следующая ячейка

jnz fill_buffer; продолжить цикл, если DI не стал равен нулю

 

mov ax,0013h; графический режим 320x200, 256 цветов

int 10h

 

; основной цикл

new_cycle:

; Шаг 1: для каждой ячейки вычисляется число соседей и записывается в старшие 4 бита

; этой ячейки

 

mov di,320*200+1; максимальный номер ячейки

step_1:

mov al,byte ptr [di+1]; в AL вычисляется сумма

add al,byte ptr [di-1]; значений восьми соседних ячеек,

add al,byte ptr [di+319]; при этом в младших четырех

add al,byte ptr [di-319]; битах накапливается число

add al,byte ptr [di+320]; соседей

add al,byte ptr [di-320]

add al,byte ptr [di+321]

add al,byte ptr [di-321]

shl al,4; теперь старшие четыре бита AL – число соседей текущей

; ячейки

or byte ptr [di],al; поместить их в старшие четыре бита текущей ячейки

dec di; следующая ячейка

jnz step_1; продолжить цикл, если DI не стал равен нулю

 

; Шаг 2: изменение состояния ячеек в соответствии с полученными в шаге 1

; значениями числа соседей

 

mov di,320*200+1; максимальный номер ячейки

flip_cycle:

mov al,byte ptr [di]; считать ячейку из массива

shr al,4; AL = число соседей

cmp al,3; если число соседей = 3,

je birth; ячейка заселяется,

cmp al,2; если число соседей = 2,

je f_c_continue; ячейка не изменяется,

mov byte ptr [di],0; иначе - ячейка погибает

jmp short f_c_continue

birth:

mov byte ptr [di],1

f_c_continue:

and byte ptr [di],0Fh; обнулить число соседей в старших битах ячейки

dec di; следующая ячейка

jnz flip_cycle

;

; Вывод массива на экран средствами BIOS

;

mov si,320*200+1; максимальный номер ячейки

mov cx,319; максимальный номер столбца

mov dx,199; максимальный номер строки

zdisplay:

mov al,byte ptr [si]; цвет точки (00 - черный, 01 - синий)

mov ah,0Ch; номер видеофункции в АН

int 10h; вывести точку на экран

dec si; следующая ячейка

dec cx; следующий номер столбца

jns zdisplay; если столбцы не закончились - продолжить,

mov cx,319; иначе: снова максимальный номер столбца в СХ

dec dx; и следующий номер строки в DX,

jns zdisplay; если и строки закончились - выход из цикла

mov ah,1; если не нажата клавиша

int 16h

jz new_cycle; следующий шаг жизни

 

mov ax,0003h; восстановить текстовый режим

int 10h

mov ax,4C00h; и завершить программу

int 21h

.fardata?; сегмент дальних неинициализированных данных

db 320*200+1 dup(?); содержит массив ячеек

end start

 

Задание для самостоятельной работы:

Разработать программу, которая переводит экран в графический режим 13h (320x200) и заселяет его точками случайным образом, после чего эти точки эволюционируют согласно законам алгоритма «Жизнь»: если у точки меньше двух или больше трех соседей, она погибает, а если у пустой позиции есть три соседа, в ней появляется новая точка. При этом, так как для хранения информации о каждой ячейке используется один байт, то осуществить вывод данных на экран в режиме 13h, выполнив простое копирование.

 

 


 


;Изобразить в правом верхнем углу экрана окно с синим крестом на белом фоне.

;По нажатию клавиши F1 последовательно копировать его в левое верхнее,левое

;нижнее и правое нижнее окно экрана.По клавише Е все стирать, по клавише R на-

;чинать заново(использовать режим 1 видео-вывода)

 

model small

.stack 100h

.data

;-------------------------------------

color db 7

color1 db 1

flag db 0

er db 0

;-------------------------------------

ports macro prt,nreg,val;

mov dx,prt

mov al,nreg

out dx,al

 

inc dx

 

mov al,val

out dx,al

endm

;--------------------------------------

.code

Start: mov ax,@data

mov ds,ax

 

mov ax,0a000h;Для графического режима

mov es,ax

 

mov AH,0;Режим 640Х480

MOV AL,12H;

INT 10H;

main: call draw

mov ah,00h;Чтение символа с ожиданием

int 16h

cmp al,1bh;ESC-Exit

jne m0

cmp ah,01h

je exit

m0: cmp ah,3bh;F1-Copy

jne m1

add flag,1;изменение содержимого флага на 1

call fcopy

m1: cmp al,45H;E-ERASE

jne m2

call erase

mov er,1;установка флага в 1

m2: cmp al,52H;R-Restart

jne m3

mov flag,0;обнуление флагов

mov er,0;

m3: jmp main

exit: mov ax,4c00h

int 21h

;-------------------Очистка экрана--------------------------------

erase proc

mov bx,0

xor si,si

mov cx,480*80

 

beg1: ports 3c4h,2,0fh

ports 3ceh,8,0ffh

mov byte ptr es:[bx][si],0

inc si

cmp si,80

jb lp

add bx,80

xor si,si

lp: loop beg1

ret

erase endp

;----------------------Быстрое копирование--------------------------

fcopy proc

;-----------------------------------------------------------

cmp flag,1;Левое верхнее положение

jne k1

mov bp,0;координата

jmp kop

;-----------------------------------------------------------

k1: cmp flag,2;Левое нижнее положение

jne k2

mov bp,420*80;координата

jmp kop

;-----------------------------------------------------------

k2: cmp flag,3;Правое нижнее положение

je kop1

ret

kop1: mov bp,420*80+64;координата

kop: ports 3ceh,5,1;установка режима быстрого копирования(1 режим)

mov bx,64;установка начальной координаты копируемого обьекта

mov cx,60*16;16 байт длина Х 60 пикселей

beg3: mov al,es:[bx][si]

mov es:[bp][si],al

inc si

cmp si,16

jb lp3

xor si,si

add bx,80

add bp,80

lp3: loop beg3

ports 3ceh,5,2;установка режима быстрого закрашивания(2 режим) необходимо для выполнения процедуры draw

ret

fcopy endp

draw Proc

cmp er,1;Если была нажата кнопка E - очистка,то ничего не рисовать, сразу выход из процедуры

jne mt1

ret

mt1: cmp flag,0;Если не было нажато клавиши F1,то прорисовка;картинки в правом верхнем углу экрана

je mt2

ret

mt2: mov bx,64

xor si,si

mov cx,60*16

ports 3c4h,2,0fh

ports 3ceh,8,0ffh

mov byte ptr es:[bx][si],0

begin:

;--------Синия вертикальная полоска------------

cmp si,8;сравниваем с серединой белого флага по горизонтали

jne met1

ports 3c4h,2,color1

mov byte ptr es:[bx][si],0ffh

inc si

jmp lp1

;--------Синия горизонтальная полоска----------

met1:

cmp bx,64+80*25;сравниваем с серединой белого флага по;вертикали

jne met2

push cx

mov cx,8*16

 

beg: ports 3c4h,2,color1

mov byte ptr es:[bx][si],0ffh

inc si

cmp si,16

jb lp2

add bx,80

xor si,si

lp2: loop beg

pop cx

sub cx,8*16

met2:;---------Белый фон----------------------------

ports 3c4h,2,color

mov byte ptr es:[bx][si],0ffh

inc si

cmp si,16

jb lp1

add bx,80

xor si,si

lp1: loop begin

ret

draw endp

end Start



Вариант 2


;Вариант №6. Изобразить на экране синюю решетку толщиной 2 пикселя.

;По нажатию клавиши ALT/E последовательно менять фон за решеткой по

;правилу белый-желтый-красный.

 

 

.model small

.stack 100h

.data

;-------------------------------------

shag dw 0

color db 1

cvet db 8

 

;-------------------------------------

ports macro prt,nreg,val;

mov dx,prt

mov al,nreg

out dx,al

 

inc dx

 

mov al,val

out dx,al

endm

;--------------------------------------

 

.code

Start: mov ax,@data

mov ds,ax

 

mov ax,0a000h;Для графического режима

mov es,ax

 

mov AH,0

MOV AL,12H

INT 10H

 

main: call draw

mov ah,00h

int 16h

 

cmp al,1bh

je exit

cmp ah,12h

je fon1

 

jmp main

 

fon1: call fon

 

jmp main

 

exit: mov ax,4c00h

int 21h

;--------------------------------------------------------------

fon proc

;-------------FON--------------------------------------

cmp cvet,6

jne p2

dec cvet

p2: cmp cvet,4

jne p1

mov cvet,8

p1: dec cvet

 

mov AH, 10h

mov AL, 0

mov BL, 0; nomer cvetovogo registra. 0 - cvet fona

mov BH, cvet; RGB kod zanosimyj v cvetovoj registr

int 10h

 

ret

fon endp

;--------------------------------------------------------------

draw Proc

;-------------RESHETKA---------------------------------

 

mov bx,0

mov shag,80*5

xor si,si

mov cx,480*80

 

ports 3c4h,2,0fh

ports 3ceh,8,0ffh

mov byte ptr es:[bx][si],0

 

ports 3c4h,2,color

 

begin: cmp bx,shag

jne met1

add shag,80*7

;----------Gorizontalinie linii----------

push cx

mov cx,80*2

beg: mov byte ptr es:[bx][si],0ffh

 

inc si

cmp si,80

 

jb lp

add bx,80

xor si,si

lp: loop beg

pop cx

sub cx,2

 

jmp begin

 

;-----------Vertikalinii linii-----------

met1: mov byte ptr es:[bx][si],081h

 

inc si

cmp si,80

 

jb lp1

add bx,80

xor si,si

lp1: loop begin

;--------------------------------------------

ret

 

draw endp

;----------------------------------------------------

 

end Start

 

 

Лабораторная работа № 8.

Тема: Работа с файлами

Пример №1. Создание файла и запись в него данных

;В сегменте команд

;Создадим файл

mov АН,3Ch; Функция создания файла

mov CX, 0; Без атрибутов

mov DX, offset fname; Адрес имени файла

int 21h

mov handle,AX; Сохраним дескриптор файла

; Запишем в файл данные (в данном примере - текстовую строку)

mov AH,40h; Функция записи в файл

mov BX,handle; Дескриптор

mov CX,buflen; Число записываемых байтов

mov DX,offset bufout; Адрес данных

int 21h

; Закроем файл (нет необходимости)

mov АН,3Eh; Функция закрытия файла

mov BX,handle; Дескриптор

int 2lh

; В сегменте данных

bufout db 'Файл номер 1'; Данные для записи в файл

buflen=$-bufout; Ee длина (12 байт)

handle dw 0; Ячейка для дескриптора

fname db 'MYFILE.001',0;Имя файла в формате ASCIIZ

 

Пример №2. Прямой доступ к файлу. Модифицируем созданный ранее файл в примере 1 MYFILE.txt, содержащий строку “Файл номер 1”, в которой следует заменить 1 на 2а.

; В сегменте команд

; Откроем файл

mov AH,3Dh;Функция открытия файла

mov AL,2;Доступ для чтения-записи

mov DX,offset fname;Адрес имени файла

int 21h

mov handle,AX;Сохраним дескриптор

;Установим указатель на байт номер 11

mov AH,42h;Функция установки указателя

mov AL,0;Режим - от начала файла

mov BX,handle;Дескриптор

mov CX, 0;Старшая половина указателя

mov DX, 11;Младшая половина указателя

int 21h

;Модифицируем файл

mov AH,40h;Функция записи

mov BX,handle;Дескриптор

mov CX,2;Число записываемых байтов

mov DX,offset mod;Отсюда выводить

int 21h

;В сегменте данных

mod db '2a';Буфер вывода

handle dw 0;Ячейка для дескриптора

fname db 'MYFILE.txt', 0;Имя файла в формате ASCIIZ

 

Пример №3. Чтение файла

;В сегменте команд

;Откроем файл

mov AH,3Dh; Функция открытия файла

mov AL,2; Доступ для чтения-записи

mov DX,offset fname; Адрес имени файла

int 21h

mov handle,AX; Сохраним дескриптор

; Поставим запрос на чтение 80 байт

mov AH,3Fh; Функция чтения

mov BX,handle; Дескриптор

mov cx,80; сколько читать

mov DX,offset bufin; СЮда

int 21h

mov CX,AX; Сколько реально прочитали

; Выведем прочитанное на экран

mov AH,40h; Функция записи

mov 3X,1; Дескриптор стандартного вывода

mov DX,offset bufin; Отсюда выводить (СХ байт)

int 21h

; В сегменте данных

bufin db 80 dup (' '); Буфер ввода

handle dw 0; Ячейка для дескриптора

fname db 'MYFILE.001',0; Имя файла в формате ASCIIZ

 

Пример №4. Назначение файлу даты и времени создания

;В сегменте команд

;Откроем файл

mov AH,3Dh; Функция открытия файла

mov AL,2

mov DX,offset fname; Адрес имени файла

int 21h

mov handle,ax; Получили дескриптор

; Изменим дату и время создания

;Изменим дату и время создания файла

mov ah,57h; Функция даты/времени

mov al,1; Установить дату/время

mov bx,handle; Дескриптор файла

mov сх.,0; очистим Сх

or cx,sec; добавим секунды

or cx,min; добавим минуты

or cx,hour;добавим часы

xor dx,dx; очистим dx

or dx,day; добавим день

or dx,month;добавим месяц

or dx,year; добавим год

int 21h

;В сегменте данных

handle dw 0; ячейка для дескриптора

fname db ‘MYFILE.TXT’,0; имя файла

sec dw 6/2; 6 секунд

min dw 15*32; 15 минут

hour dw 12*2048; 12 часов

day dw 10; 10 число

month dw 3*32; март

year dw 21*512 21 год от 1980, то есть 2001 г.

 

Задание для самостоятельной работы:

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

 

Лабораторная работа №5.

Тема: Работа с массивами



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 251; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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