{$G+,N+,E+} {286-os utas¡t sok is lesznek} Program Plazma; Uses Crt; Var i,j : integer; paletta : Array[0..764] of byte; {itt lesz t rolva a paletta} buff : Array[0..2] of byte; { tmeneti buffer} c:char; fade_paletta:array[0..764] of byte; Procedure SetRGB(colnum,Red,Green,Blue:byte);Assembler; {a paletta colnum.-dik elem‚nek  t¡r sa } Asm {red,green,blue sz¡n”sszetev“kre} mov dx,$3c8 {kiv lasztjuk a m¢dos¡tani k¡v nt elemet,} mov al,colnum {£gy,hogy a $3c8 portra kikldjk } out dx,al {az elem sz m t} inc dx mov al,red {a $3c9 portra egym s ut n kinyomatjuk} out dx,al {a h rom sz¡n”sszetev“t} mov al,green out dx,al mov al,blue out dx,al {ha r”gt”n a k”vetkez“ elemet is  t akarn nk ¡rni, nem kellene £jb¢l kiv lasztani a k”vetkez“ elemet a $3c8- al a 3 sz¡n”sszetev“ kil”k‚se ut n a VGA automatikusan n”veli az aktu lis elemet (majd a paletta mozgat s n l lesz ennek szerepe)} End; Procedure palettaszamit; {kikeverjk a paletta sz¡neit sz”gfggv‚nyek alapj n, hogy sz‚p } var r,g,b:byte; {sziv rv nyos legyen} Begin for i:=1 to 255 do {255 sz¡nt ¡runk  t, a null t nem} Begin {a sz¡n”sszetev“k kisz m¡t sa, ‚s elt rol sa egy t”mbben} r:=32+round(30*sin( i*pi*2/255 )); paletta[3*i-3]:=r; g:=32+round(30*cos( i*pi*2/255 )); paletta[3*i-2]:=g; b:=32+round(30*{cos(i)*}sin( -i*pi*2/255 )); paletta[3*i-1]:=b; SetRGB(i,r,g,b); End; End; Procedure Plot(X,Y:word;Z:byte);Assembler;{ Egy z sz¡n– pont kirak sa x,y poz¡ci¢ba} Asm {a k‚perny“mem¢ria direkt ¡r s val} mov ax,$a000 {a k‚perny“mem¢ria szegmensc¡me es-be} mov es,ax mov ax,320 {az offset kisz m¡t sa} mul y {offset=x+y*320} mov di,x add di,ax {offset di-be} mov al,Z {sz¡n al-be} cmp al,0 {a null t nem rakjuk ki, helyette 255-”t} jnz @nemnulla dec al @nemnulla: stosb {es:di-re kirakjuk az al sz¡n– pontot} End; Function F(x,y:real):real; {x,y koordin t hoz kisz moljuk a sz¡nt} Begin {F:=128+128*(cos(x*x*y/1000000)+sin(y*y*x/1000000)); } F:=128*cos(x*y/9); {F:=128*sin(x*y/10000); } { x:=x-160; y:=y-100; F:=trunc(((x*x) + (y*y))/100) mod 255; } {F:=y+x;} End; Procedure Init_Video;Assembler; {320X200X256- os m¢dba v lt} Asm mov ax,$13 int $10 End; Procedure Backtotext;Assembler; {vissza sz”veges m¢dba} Asm mov ax,$3 int $10 End; Procedure Palanim; {A paletta mozgat sa } Begin move(paletta,buff,3); {az els“ sz¡n buff-ba} move(paletta[3],paletta,762); {minden sz¡n egyel lejjebb kerl} move(buff,paletta[762],3); {az utols¢ sz¡n hely‚re visszaj”n az els“} {Minden sz¡nt egyel lejjebb toltunk, az es“, pedig h tra csorgott} {miut n a t”mbnkben m r meg van az £j paletta, nem  rt a k rty ‚t is  t ll¡tani} asm cld mov dx,$3c8 {az els“ elem kiv laszt sa} mov al,1 out dx,al lea si,paletta inc dx {az ”sszes sz¡n  t¡r sa} mov cx,255*3 rep outsb end; End; Procedure Palanim2; {FADE OUT } Begin for i:=0 to 764 do if fade_paletta[i]>0 then dec(fade_paletta[i]); {miut n a t”mbnkben m r meg van az £j paletta, nem  rt a k rty ‚t is  t ll¡tani} asm cld mov dx,$3c8 {az els“ elem kiv laszt sa} mov al,1 out dx,al lea si,fade_paletta inc dx {az ”sszes sz¡n  t¡r sa} mov cx,255*3 rep outsb end; End; Procedure Palanim3; {FADE IN } Begin for i:=0 to 764 do if fade_paletta[i]<=paletta[i] then inc(fade_paletta[i]); {miut n a t”mbnkben m r meg van az £j paletta, nem  rt a k rty ‚t is  t ll¡tani} asm cld mov dx,$3c8 {az els“ elem kiv laszt sa} mov al,1 out dx,al lea si,fade_paletta inc dx {az ”sszes sz¡n  t¡r sa} mov cx,255*3 rep outsb end; End; BEGIN Init_video; {320X200X256- os m¢dba v lt} palettaszamit; For i:=0 to 319 do {K‚p rajzolasa} For j:=0 to 199 do Plot(i,j,trunc(F(i,j))); repeat if keypressed then begin c:=readkey; if c='2' then move(paletta,fade_paletta,SizeOf(paletta)); if c='3' then FillChar(fade_paletta,SizeOf(fade_paletta),0); end; if c='1' then palanim; {PLASMA} if c='2' then palanim2; {FADE_OUT} if c='3' then palanim3; {FADE_IN} delay(10); until c='q'; backtotext; {vissza sz”veges m¢dba} END.