{*
 Ukazkovy program pro efekt ohne
 Reseno pomoci zprumerovani okolnich barev
 Warning: Assembler included
 Pro int21h napsal BOby (<)2006
*}
program ohen;

uses crt;

type screen=array[0..199,0..319] of byte;

var scr:screen;
    x,y,c:word;

procedure setmode(m:byte);assembler;
asm
 mov ah,0
 mov al,m
 int 10h
end;

procedure putpixel(var scr:screen;x,y:word;c:byte);
begin
 scr[y,x]:=c;
end;

procedure setcolor(color,r,g,b : byte);
begin
     port[$3c8]:=color;
     port[$3c9]:=r;
     port[$3c9]:=g;
     port[$3c9]:=b;
end;

Begin
 setmode($13);{MCGA mode 320x200x256}
{ SetPalette;}{Nalezani vhodne palety je nad moje sily.(vzdycky to mam moc cerveny:)}
 repeat
  for x:=10 to 310 do
   begin
    scr[199,x]:=random(255);
    scr[198,x]:=random(255);
   end;
  asm
      mov cx,64000
      mov di,offset(scr)+320
      xor bx,bx
      xor ax,ax
@1:
      {Udela prumer ctyr barev}
      mov al,ds:[di-1]  {a:=[X-1,Y]}
      mov bl,ds:[di]    {b:=[X,Y]}
      add ax,bx         {a:=a+b}
      mov bl,ds:[di+1]  {b:=[X+1,Y]}
      add ax,bx         {a:=a+b}
      mov bl,ds:[di+320]{b:=[X,Y+1]}
      add ax,bx         {a:=a+b}
      shr ax,2          {a:=a div 4}
     jz @2              {if (ax(zf)=1) then goto @2}
      sub ax,1          {else ax:=ax-1}
@2:
      mov byte ptr ds:[di-320],al {}
      inc di
      dec cx
     jnz @1 {if (cx(zf)=0) then goto @1}

      {Hodi obrazovku v scr do videosegmentu ($a000)}
      mov si, offset(scr)
      mov ax, 0a000h
      mov es, ax
      xor di,di
      mov cx,15600
      db 66h
      rep movsw
 end;
 until keypressed;
 readkey;
 setmode($03);{Text mode 80x25x16}
End.
{*
 Pascal code se stadartnimi procedurami putpixel a getpixel
 Neuveritelne pomale
Begin
 InitVga;
 repeat
  for x:=10 to 310 do
   begin
    putpixel(x,199,random(255));
    putpixel(x,198,random(255));
   end;
  for y:=0 to 199 do
   for x:=0 to 319 do
    begin
     c:=(getpixel(x,y+1)+
         getpixel(x-1,y+1)+
         getpixel(x+1,y+1)+
         getpixel(x,y+2)) shr 2;
     if c>0 then dec(c);
     putpixel(x,y,c);
    end;
 until keypressed;
 CloseVga;
End.
*}


