Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

Лабораторная работа №12. Тема: Графические видеорежимы. Работа с 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