Графика DOS. Цветок В общем, палитру выставляйте как хотите, главное, чтобы переходы между цветами были плавными. Для хранения изображения "цветка", заведем массив flower, размером 640x400. Нарисуем в нем наш "цветок". Формулу для рисования "цветка" можно найти в любом нормальном учебнике по "вышке". Для всех тех кто уже успел забыть этот кошмар или у кого он еще не начался, так уж быть, вот процедура инициализации массива: Код (C): for(long y=-200;y<200;y++) for(long x=-320;x<320;x++) flower[(x+320)+(y+200)*640]=0.75*cos(16*atan2(y,x))*256/TWO_PI+ 1.5*sin(8*atan2(y,x))*256/TWO_PI+ sqrt(x*x+y*y); Меняя коэффициенты в формуле можно получить довольно забавные версии этого эффекта. В результате мы получим в массиве flower красивый такой цветок или не совсем красивый или совсем не красивый... Психоделическая составляющая эффектаТеперь определимся сколько нам потребуется "цветков" на экране, мне хватило трех, при большем количестве "цветков" на экране довольно трудно становиться понять, что твориться на экране. Правда если хочешь "словить глюков" - поставь цветков так 5 - 7 и смотри на экран минут этак пять, глюков может и не словишь, но глаза заболят обязательно. Но перед тем, как мы начнем наслаждаться резью в глазах надо еще сделать кое-что. Возьмем какую-нибудь точку в массиве flower, причем не любую, а такую, чтобы X координата лежала в промежутке от 0 до 320, а Y координата в промежутке от 0 до 200. Начиная с этой точки скопируем кусок массива, размером 320x200, на экран. Получим изображение куска "цветка". Если теперь сдвигать начальную точку, в каждом новом кадре, на новое место, то получим изображение перемещающегося цветка. Теперь допустим, что начальных точек две, и на экран копируется не один кусок "цветка", а два. Причем накладывается они друг на друга обычным сложением цветов. В результате получим требуемый эффект. Вот. Реализуется это примерно так: Код (C): x=160+120*sin(time*0.5+1.0); y=100+90*cos(time*1.5+2.0); offset1=x+(y<<7)+(y<<9); x=160+120*sin(time*1.0+1.5); y=100+90*cos(time*2.0+0.5); offset2=x+(y<<7)+(y<<9); for(y=0;y<200;y++) for(x=0;x<320;x++) { screen[x+(y<<6)+(y<<8)]=flowers[x+(y<<7)+(y<<9)+offset1]+ flowers[x+(y<<7)+(y<<9)+offset2]; } Добавить еще "цветков" думаю вам не составит труда. Взято здесь, текст программы немного переделан, в результате СОМ-файл уменьшился с 1106 байт до 885 байт Код (ASM): ; masm dos com # .model tiny .code .686p .mmx org 100h VGA_SEGMENT equ 0A000h IMPUT_STATUS_0 equ 3DAh ;регистр статуса ввода 0 WIDTH_SCREEN equ 320 HEIGHT_SCREEN equ 200 SCREENSIZE equ WIDTH_SCREEN*HEIGHT_SCREEN MEMBLOCKSIZE equ SCREENSIZE/16 start: flowers equ word ptr [bp-40] screen equ word ptr [bp-38] i equ word ptr [bp-36] c0 equ word ptr [bp-34] v equ dword ptr [bp-32] u equ dword ptr [bp-28] offset1 equ dword ptr [bp-24] offset2 equ dword ptr [bp-20] offset3 equ dword ptr [bp-16] x equ dword ptr [bp-12] y equ dword ptr [bp-8] time equ dword ptr [bp-4] mov sp, 0D60h mov ah, 4Ah; ADJUST MEMORY BLOCK SIZE (SETBLOCK) mov bx, 0D6h; ES = segment address of block to change int 21h ; BX = new size in paragraphs enter 40, 0 mov time, 0 mov bx, MEMBLOCKSIZE mov ah, 48h; DOS - 2+ - ALLOCATE MEMORY int 21h ; BX = number of 16-byte paragraphs desired mov screen, ax mov bx, MEMBLOCKSIZE*4 mov ah, 48h; DOS - 2+ - ALLOCATE MEMORY int 21h ; BX = number of 16-byte paragraphs desired mov flowers, ax ;initflower------------------------------------------ mov y, -HEIGHT_SCREEN a0: mov x, -WIDTH_SCREEN @@: mov eax, x imul eax mov v, eax; v = x^2 mov eax, y imul eax add eax, v mov u, eax fild u ;u = x^2 + y^2 fsqrt fild x fild y fpatan fld st fmul const16 fcos fmul const96 fxch st(1) fmul const8 fsin fmul const192 faddp st(1), st fldpi fdivp st(1), st faddp st(1), st fistp v mov edi, y add edi, HEIGHT_SCREEN imul edi, WIDTH_SCREEN*2 add edi, x add edi, WIDTH_SCREEN;esi=(y+200)*640 + x + 320 mov eax, edi shr eax, 16 shl ax, 12 add ax,flowers mov es, ax mov al, byte ptr v stosb;flowers[(x+320)+(y+200)*640]= ;= 0.75*cos(16*atan2(y,x))*256/TWO_PI+ ;+ 1.5*sin(8*atan2(y,x))*256/TWO_PI+ ;+ sqrt(x*x+y*y); inc x cmp x,WIDTH_SCREEN jl @b inc y cmp y,HEIGHT_SCREEN jl a0 mov ax, 13h int 10h ; - VIDEO - SET VIDEO MODE ;setcolortable------------------------------------------- mov i,255 mov cx,43;256-213 @@: mov ax, i sub ax, 213 imul ax,3 shr ax,1 mov c0,ax neg ax add ax,63 push i push 63 push 0 push ax ;63-(i-213)*3/2 call setrgbpalette dec i loop @b mov cx,42;213-171 @@: push i push c0 push 0 push 63 call setrgbpalette dec i loop @b mov cx,43;171-128 @@: mov ax, i sub ax, 128;c=(i-128)*3/2; imul ax,3 shr ax,1 mov c0, ax neg ax add ax,63 push i push 0 push ax push 63 call setrgbpalette dec i loop @b mov cx,43;128-85 @@: mov ax, i sub ax, 85 imul ax,3 shr ax,1 mov c0, ax push i push 0 push 63 push c0 call setrgbpalette dec i loop @b mov cx,42;85-43 @@: mov ax, i sub ax, 42 imul ax,3 shr ax,1 mov c0, ax neg ax add ax,63 push i push ax push 63 push 0 call setrgbpalette dec i loop @b mov cx,43 @@: mov ax, i imul ax,3 shr ax,1 mov c0, ax push i push 63 push c0 push 0 call setrgbpalette dec i loop @b ;setcolortable---------------------------------------- begin: fld time fld st fmul const05 fadd const1 fsin fmul const120 fistp x add x,160;x=160+120*sin(time*0.5+1.0); fld time fmul const1_5 fadd const2 fcos fmul const90 fistp y mov eax, y;y=90*cos(time*1.5+2.0) add eax,100 imul eax,WIDTH_SCREEN*2;eax=(y+100)*640 add eax, x mov offset1, eax fld time fadd const1_5 fsin fmul const120 fistp x add x,160;x=160+120*sin(time*1.5+2.0); fld time fmul const2 fadd const05 fcos fmul const90 fistp y;y=90*cos(time*0.5+1.0); mov eax, y add eax, 100 imul eax,WIDTH_SCREEN*2;eax=(y+100)*640 add eax, x mov offset2, eax;eax=(y+100)*640 + x fld time fmul const1_5 fadd const2 fsin fmul const120 fistp x add x,160 ;x=120*sin(time*1.5+2)+160 fld time fmul const05 fadd const1 fcos fmul const90 fistp y ;y=90*cos(time*0.5+1) mov eax, y add eax, 100 imul eax,WIDTH_SCREEN*2 add eax, x mov offset3, eax;eax=(y+100)*640 + x mov fs, screen mov ecx,(HEIGHT_SCREEN-1)*WIDTH_SCREEN a1: mov edx,WIDTH_SCREEN-1 @@: lea edi,[edx+ecx*2];edi=x+y*640 mov esi, edi add esi, offset1 mov eax, esi shr eax, 16 shl ax, 12 add ax,flowers mov es,ax lods byte ptr es:[si] mov bl,al;bl=c1 mov esi,edi add esi,offset2 mov eax,esi shr eax,16 shl ax,12 add ax,flowers mov es,ax lods byte ptr es:[si] add bl,al;bl=c1+c2 mov esi,edi add esi,offset3 mov eax,esi shr eax,16 shl ax,12 add ax,flowers mov es, ax lods byte ptr es:[si] lea esi,[edx+ecx];si=y*320+x add al,bl; al=c1+c2+c3 mov fs:[si], al;screen[x+y*320]=c1+c2+c3 dec edx jns @b sub ecx,WIDTH_SCREEN jns a1 fadd const002 fst time ;time+=0.02 ;copyvirtualscreen-------------------------------------- mov dx,IMPUT_STATUS_0 WaitVerticalSync:in al,dx test al,8 jz WaitVerticalSync WaitNotVerticalSync:in al,dx test al,8 jnz WaitNotVerticalSync mov cx,SCREENSIZE/4 xor si,si push ds mov ds,screen xor di,di push VGA_SEGMENT pop es rep movsd xor ax,ax mov ds,ax mov ax,ds:[41Ah] sub ax,ds:[41Ch] pop ds jz begin exit: mov ax, 3 int 10h int 20h setrgbpalette proc blue equ byte ptr [bp+4] green equ byte ptr [bp+6] red equ byte ptr [bp+8] color equ byte ptr [bp+10] push bp mov bp, sp mov dx, 3C8h mov al,color mov ah,red out dx, ax inc dx mov al,green out dx, al mov al,blue out dx, al pop bp retn 8 setrgbpalette endp const05 dd 0.5 const1 dd 1.0 const1_5 dd 1.5 const2 dd 2.0 const90 dd 90.0 const120 dd 120.0 const96 dd 96.0 const192 dd 192.0 const8 dd 8.0 const16 dd 16.0 const002 dd 0.02 end start