Постановка задачи. Реализовать программирование графического изображения, анимации на языке Ассемблера с использованием динамического изменения значений RGB-палитры
Реализовать программирование графического изображения, анимации на языке Ассемблера с использованием динамического изменения значений RGB-палитры.
Реализация программы
Model small;модель памяти Stack 100h;установка размера стека Data;начало сегмента данных Palette label byte i=0 Rept 8;директива повторения db 0, 0, i*2 i=i+1 Endm;завершение повторения i=0 Rept 8 db i*2, 0, 16-2*i i=i+1 Endm i=0 Rept 16 db 16+47*i/16, 0, 0 i=i+1 Endm i=0 Rept 48 db 63, 21*i/16, 0 i=i+1 Endm i=0 Rept 48 db 63, 63, 21*i/24 i=i+1 Endm db 179*3 dup(63) buffer db 320*200 dup(0) Seed dw 1 exit_msg db "Coded by room320 on 6th of Decemder 2012", 13, 10 Code Определяет набор команд процессора start: Mov ax, 0013h;включение видеорежима Int 10h;вызов BIOS ;установка новой палитры mov ax, @data;копирования адреса сегмента данных (@data) в регистр AX Mov ds, ax Mov dx, 03C8h;цвет Xor al,al Out dx,al;вывод значения Inc dx mov cx, 256*3 Mov si, offset palette;смещение в сегменте set_pal: mov al, [si] Out dx, al Inc si Dec cx Jnz set_pal Mov ax, 0040h;смещение отн-но сегментного адреса Mov es, ax mov ax, es:[006Ch];FCB по умолчанию. Для выполнения операций ввода-вывода для обработки файлов в текущей директории. Mov seed, ax Mov ax, 0A000h;начало видеопамяти в графических режимах Mov es, ax ;до нажатия ESC main: ;генерируем огонь Mov di, offset buffer add di, 320*198 Mov dx, 320 gen_fire: ;random Mov ax, seed Mov cx, 8 new_bit: Mov bx, ax And bx, 002Dh Xor bh, bl Clc Jpe shift Stc shift: rcr ax, 1 Dec cx Jnz new_bit Mov seed, ax mov [di], ax Inc di Dec dx Jnz gen_fire Mov di, offset buffer add di, 320*198+1 Mov dx, 320-2 blur_line: Xor ax, ax Xor bx, bx mov al, [di-1] mov bl, [di] Add ax, bx mov bl, [di+1] Add ax, bx mov bl, [di+2] Add ax, bx Shr ax, 2 mov [di], al Inc di Dec dx Jnz blur_line ;blur fire Mov si, offset buffer Add si, 321 mov cx, 320*199 Xor bx, bx Align 2 blur_fire: Xor ax, ax add al, [si+321] Adc ah, bl add al, [si+319] Adc ah, bl add al, [si-1] Adc ah, bl add al, [si+1] Adc ah, bl Ifdef eight add al, [si-321] Adc ah, bl add al, [si+321] Adc ah, bl add al, [si-319] Adc ah, bl add al, [si+319] Adc ah, bl Shr ax, 3 Else Shr ax, 2 Endif Test ax, ax Jz skip Dec al Align 2 skip: mov [si-320], al Inc di Inc si Dec cx Jnz blur_fire ;pause Mov dx, 10000 Mov ah, 86h Int 15h Mov dx, 03DAh vrtl1: In al, dx Test al, 8 Jnz vrtl1 vrtl2: In al, dx Test al, 8 Jnz vrtl2 Mov si, offset buffer Xor di, di mov cx, 320*100 Rep movsw ;проверка на нажатие ESC In al, 60h Cmp al, 81h Jnz main ;возвражение в текстовый режим Mov ax, 0003h Int 10h ;сообщение по завершению программы Mov ah, 9 Mov dx, offset exit_msg Int 21h ;выход Mov ax, 4C00h Int 21h
|