English
English
Slovensky
Slovensky
Česky
Česky
Šarišsky
Šarišsky
 
Kategorija: Programy zos Pascalu (KMP)

Program: Graeditor.pas
Subor exe: Graeditor.exe
Program editor umoznuje vytvaret, ukladat i nacitat z disku graficke soubory s priponou gra. Jedna se o muj vlastni format ve kterem je zakodovana grafika 160x200 pixelu s barevnou hloubkou 16 barev vybranych ze 65535ti. Vysledny graficky soubor zabira 9048 bajtu takze je vhodny pro prilinkovavani napr. do her v assembleru.

prvnich 8000 bajtu je grafika 160x200 (viz rozkodovani) obsahuje same hodnoty 0 1 2 3

dalsich 1000 bajtu obsahuje ctverice bajtu pro kazdy ctverecek 8x8 pixelu - zde uz jsou nahrany barvy 0-15

poslednich 48 bajtu obsahuje barevnou paletu pro prvnich 16 barev.

V programu je pouzito zakodovani a rozkodovani. Po rozkodovani zabira stranka 160x200x16 32KB zakodovana 9KB.

K zakodovani je pouzito prevodu decadickych cisel na binarni . Takze 4 pixely zabiraji presne jeden bajt. 00 01 10 11 b

Program obsahuje napovedu ve ktere je ovladani editoru. Vse je na klavesnici.

Zname chyby: kdyz se otevira soubor a zada se jmeno neexistujuciho souboru nebo nejak spatne dojde k padu programu (chybi File not found funkce) druha znama chyba: v casti editoru kde se pracuje se schrankou se obsah schranky napravo zobrazuje spatne ale jinak schranka funguje
Kuklo še: 236x


{ GRAEDITOR.PAS                        Copyright (c) Martin Kolecek }
{ Program editor umoznuje vytvaret, ukladat i nacitat z disku       }
{ graficke soubory s priponou gra. Jedna se o muj vlastni format    }
{ ve kterem je zakodovana grafika 160x200 pixelu s barevnou hloubkou}
{ 16 barev vybranych ze 65535ti. Vysledny graficky soubor zabira    }
{ 9048 bajtu takze je vhodny pro prilinkovavani napr. do her v      }
{ assembleru.                                                       }
{                                                                   }
{ prvnich 8000 bajtu je grafika 160x200 (viz rozkodovani)           }
{ obsahuje same hodnoty 0 1 2 3                                     }
{                                                                   }
{ dalsich 1000 bajtu obsahuje ctverice bajtu pro kazdy ctverecek 8x8}
{ pixelu - zde uz jsou nahrany barvy 0-15                           }
{                                                                   }
{ poslednich 48 bajtu obsahuje barevnou paletu pro prvnich 16 barev.}
{                                                                   }
{ V programu je pouzito zakodovani a rozkodovani. Po rozkodovani    }
{ zabira stranka 160x200x16 32KB zakodovana 9KB.                    }
{                                                                   }
{ K zakodovani je pouzito prevodu decadickych cisel na binarni.     }
{ Takze 4 pixely zabiraji presne jeden bajt. 00 01 10 11 b          }
{                                                                   }
{ Program obsahuje napovedu ve ktere je ovladani editoru.           }
{ Vse je na klavesnici.                                             }
{                                                                   }
{ Zname chyby: kdyz se otevira soubor a zada se jmeno neexistujuciho}
{ souboru nebo nejak spatne dojde k padu programu (chybi File not   }
{ found funkce)                                                     }
{ druha znama chyba: v casti editoru kde se pracuje se schrankou se }
{ obsah schranky napravo zobrazuje spatne ale jinak schranka funguje}
{                                                                   }
{ Author: Martin Kolecek                                            }
{ Datum: 01.08.2008                           http://www.trsek.com  }
 
Program GraEditor;
Uses CRT;
 
Type
 TRGB= Record
         R: Byte;
         G: Byte;
         B: Byte;
       End;
 
Const
  FileNamePripona: string[4] = '.gra';
 
Var
  MMSelect: Byte;
  PalSelect: Byte;
 
  B4X,B4Y: Byte;
  B4X2,B4Y2: Byte;
  B4X3,B4Y3: Integer;
 
  EX,EY: Byte;
  EX2,EY2: Byte;
  Xs,Ys: Integer;
  Color: array[0..3] of Byte;
 
  F: File;
  FileName: string[12];
  FileNameJmeno: string[8];
 
  Clipboard: array[0..63] of Byte; {64B 8x8}
  Clipboard2: array[0..3] of Byte; {barvy 4}
 
  Grafika: array[0..7999] of Byte;
  Barvy4: array[0..999] of Byte;
  Paleta: array[0..47] of Byte;
  Barva: array[0..15] of TRGB;
 
  Buffer32,Buffer2: Pointer;
  BufferSeg32,BufferSeg2: Word;
 
  a7,a6,a5,a4,a3,a2,a1,a0: Byte;
  b7,b6,b5,b4,b3,b2,b1,b0: Byte;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure NoBeep;
Begin
  While KeyPressed do ReadKey;
End;
 
 
Procedure Init320x200; Assembler;
Asm
  Mov AH, 00h
  Mov AL, 13h
  Int 10h
End;
 
 
Procedure Init80x25; Assembler;
Asm
  Mov AH, 00h
  Mov AL, 03h
  Int 10h
End;
 
 
Procedure WaitRetrace; Assembler;
Asm
    Mov dx,3DAh
@l1:
    In al,dx
    And al,08h
    Jnz @l1
@l2:
    In al,dx
    And al,08h
    Jz  @l2
End;
 
 
Procedure WritePixel (X:Word;Y,Barva:Byte);
Begin
  Mem[$A000:Y*320+X]:=Barva;
End;
 
 
Procedure Blok(x1,y1,x2,y2,Barva:Word);
Var x,y: Word;
Begin
   For y:=y1 to y2 do
   For x:=x1 to x2 do WritePixel(x,y,Barva);
End;
 
 
Procedure Ramecek (X1,Y1,X2,Y2,Barva: Word);
Var DelkaX,DelkaY,I: Word;
Begin
 DelkaX := X2-X1; DelkaY := Y2-Y1;
 For I := 0 to DelkaX do WritePixel (X1+I,Y1,Barva);
 For I := 0 to DelkaX do WritePixel (X1+I,Y2,Barva);
 For I := 0 to DelkaY do WritePixel (X1,Y1+I,Barva);
 For I := 0 to DelkaY do WritePixel (X2,Y1+I,Barva);
End;
 
 
Procedure GetPal(Color:Byte; Var R,G,B:Byte);
Begin
   Port[$3c7]:=Color;
   R:=Port[$3c9];
   G:=Port[$3c9];
   B:=Port[$3c9];
End;
 
 
Function GetPalR(Color:Byte): Byte;
Var R,G,B: Byte;
Begin
   Port[$3c7]:=Color;
   R:=Port[$3c9];
   G:=Port[$3c9];
   B:=Port[$3c9];
   GetPalR:=R;
End;
 
 
Function GetPalG(Color:Byte): Byte;
Var R,G,B: Byte;
Begin
   Port[$3c7]:=Color;
   R:=Port[$3c9];
   G:=Port[$3c9];
   B:=Port[$3c9];
   GetPalG:=G;
End;
 
 
Function GetPalB(Color:Byte): Byte;
Var R,G,B: Byte;
Begin
   Port[$3c7]:=Color;
   R:=Port[$3c9];
   G:=Port[$3c9];
   B:=Port[$3c9];
   GetPalB:=B;
End;
 
 
Procedure SetPal(Color:Byte; R,G,B:Byte);
Begin
   Port[$3c8]:=Color;
   Port[$3c9]:=R;
   Port[$3c9]:=G;
   Port[$3c9]:=B;
End;
 
 
Procedure SoundStorno;
Begin
  Sound(300); Delay(20); NoSound;
  Sound(250); Delay(20); NoSound;
  Sound(200); Delay(20); NoSound;
End;
 
 
Procedure SoundDone;
Begin
  Sound(200); Delay(20); NoSound;
  Sound(250); Delay(20); NoSound;
  Sound(300); Delay(20); NoSound;
  Sound(350); Delay(20); NoSound;
  Sound(400); Delay(20); NoSound;
  Sound(500); Delay(50); NoSound;
End;
 
 
Procedure InitBuffers;
Var I: Word;
Begin
  GetMem(Buffer32,32000); BufferSeg32:=Seg(Buffer32^);
  GetMem(Buffer2,2000); BufferSeg2:=Seg(Buffer2^);
  For I:=0 to 31999 do mem[BufferSeg32:I]:=0; {vymaz bufferu}
  For I:=0 to 1999 do mem[BufferSeg2:I]:=0;   {vymaz bufferu}
End;
 
 
Procedure ShutdownBuffers;
Begin
  FreeMem(Buffer32,32000);
  FreeMem(Buffer2,2000);
End;
 
 
Function Bin2Dec(b7,b6,b5,b4,b3,b2,b1,b0: Byte): Byte;
Var I: Byte;
Begin
  I:=0;
  If b7=1 then Inc(I,128);
  If b6=1 then Inc(I,64);
  If b5=1 then Inc(I,32);
  If b4=1 then Inc(I,16);
  If b3=1 then Inc(I,8);
  If b2=1 then Inc(I,4);
  If b1=1 then Inc(I,2);
  If b0=1 then Inc(I,1);
  Bin2Dec:=I;
End;
 
 
Procedure Dec2Bin(DCnum:Byte);
Begin
  If DCnum>=128 then Begin b7:=1; Dec(DCnum,128); End else b7:=0;
  If DCnum>=64  then Begin b6:=1; Dec(DCnum,64);  End else b6:=0;
  If DCnum>=32  then Begin b5:=1; Dec(DCnum,32);  End else b5:=0;
  If DCnum>=16  then Begin b4:=1; Dec(DCnum,16);  End else b4:=0;
  If DCnum>=8   then Begin b3:=1; Dec(DCnum,8);   End else b3:=0;
  If DCnum>=4   then Begin b2:=1; Dec(DCnum,4);   End else b2:=0;
  If DCnum>=2   then Begin b1:=1; Dec(DCnum,2);   End else b1:=0;
  If DCnum>=1   then Begin b0:=1; Dec(DCnum,1);   End else b0:=0;
End;
 
 
Procedure Zakodovat;
Var A,I: Word;
Begin
  A:=0; I:=0;
  Repeat
    Dec2Bin(mem[BufferSeg32:A+0]); a0:=b0; a1:=b1;
    Dec2Bin(mem[BufferSeg32:A+1]); a2:=b0; a3:=b1;
    Dec2Bin(mem[BufferSeg32:A+2]); a4:=b0; a5:=b1;
    Dec2Bin(mem[BufferSeg32:A+3]); a6:=b0; a7:=b1;
    Grafika[I]:=Bin2Dec(a7,a6,a5,a4,a3,a2,a1,a0);
    Inc(A,4);
    Inc(I);
  Until I=8000;
  A:=0; I:=0;
  Repeat
    Dec2Bin(mem[BufferSeg2:A+0]); a0:=b0; a1:=b1; a2:=b2; a3:=b3;
    Dec2Bin(mem[BufferSeg2:A+1]); a4:=b0; a5:=b1; a6:=b2; a7:=b3;
    Barvy4[I]:=Bin2Dec(a7,a6,a5,a4,a3,a2,a1,a0);
    Inc(A,2);
    Inc(I);
  Until I=1000;
  A:=0;
  For I:=0 to 15 do
  Begin
    Paleta[A+0]:=Barva[I].R;
    Paleta[A+1]:=Barva[I].G;
    Paleta[A+2]:=Barva[I].B;
    Inc(A,3);
  End;
End;
 
 
Procedure Rozkodovat;
Var A,I: Word;
Begin
  A:=0; I:=0;
  Repeat
    Dec2Bin(Grafika[I]);
    mem[BufferSeg32:A+0]:=Bin2Dec(0,0,0,0,0,0,b1,b0);
    mem[BufferSeg32:A+1]:=Bin2Dec(0,0,0,0,0,0,b3,b2);
    mem[BufferSeg32:A+2]:=Bin2Dec(0,0,0,0,0,0,b5,b4);
    mem[BufferSeg32:A+3]:=Bin2Dec(0,0,0,0,0,0,b7,b6);
    Inc(A,4);
    Inc(I);
  Until I=8000;
  A:=0; I:=0;
  Repeat
    Dec2Bin(Barvy4[I]);
    mem[BufferSeg2:A+0]:=Bin2Dec(0,0,0,0,b3,b2,b1,b0);
    mem[BufferSeg2:A+1]:=Bin2Dec(0,0,0,0,b7,b6,b5,b4);
    Inc(A,2);
    Inc(I);
  Until I=1000;
  A:=0;
  For I:=0 to 15 do
  Begin
    Barva[I].R:=Paleta[A+0];
    Barva[I].G:=Paleta[A+1];
    Barva[I].B:=Paleta[A+2];
    Inc(A,3);
  End;
End;
 
 
Procedure FnSave;
Begin
  Assign(F,Filename);
  Reset(F,1);
  Zakodovat;
  BlockWrite(F,Grafika,8000);
  BlockWrite(F,Barvy4,1000);
  BlockWrite(F,Paleta,48);
  Close(F);
  SoundDone;
End;
 
 
Procedure PrepareColors;
Var I: Byte;
Begin
  SetPal(251,0,0,0);     {Black}
  SetPal(252,63,63,63);  {White}
  SetPal(253,63,0,0);    {Red}
  SetPal(254,0,63,0);    {Green}
  SetPal(255,0,0,63);    {Blue}
  For I:=0 to 15 do
  SetPal(I,Barva[I].R,Barva[I].G,Barva[I].B);
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure WriteEPScreen;
Var x,y,I: Word;
Begin
  {Nastaveni palety}
  For I:=0 to 15 do SetPal(I,Barva[I].R,Barva[I].G,Barva[I].B);
 
  {Oramovani}
  x:=0; y:=0; Ramecek(x,y,x+319,y+199,252);
 
  {Editovana barva}
  x:=140; y:=50; Ramecek(x,y,x+100,y+100,252);
  Blok(x+2,y+2,x+98,y+98,PalSelect);
 
  {Barvy + mazani kurzoru}
  x:=12; y:=10;
  For I:=0 to 15 do
  Begin
    Blok(x,y,x+7,y+7,I);
    Ramecek(x-2,y-2,x+9,y+9,252);
    Ramecek(x-4,y-4,x+11,y+11,251);
    Ramecek(x-6,y-6,x+13,y+13,251);
    Inc(x,19);
  End;
 
  {Kurzor}
  x:=12; y:=10; I:=0;
  While I<PalSelect do Begin Inc(x,19); Inc(I); End;
  Ramecek(x-4,y-4,x+11,y+11,252);
  Ramecek(x-6,y-6,x+13,y+13,252);
 
  x:=10; y:=30; Ramecek(x,y,x+62,y+138,252);
 
  {Editor palety + mazani policek RGB}
  x:=12; y:=32; Ramecek(x,y,x+18,y+8,253); Blok(x+2,y+2,x+16,y+6,253);
  x:=32; y:=32; Ramecek(x,y,x+18,y+8,254); Blok(x+2,y+2,x+16,y+6,254);
  x:=52; y:=32; Ramecek(x,y,x+18,y+8,255); Blok(x+2,y+2,x+16,y+6,255);
  x:=12; y:=42; For I:=0 to 62 do Begin Blok(x,y,x+18,y,251); Inc(y,2); End;
  x:=32; y:=42; For I:=0 to 62 do Begin Blok(x,y,x+18,y,251); Inc(y,2); End;
  x:=52; y:=42; For I:=0 to 62 do Begin Blok(x,y,x+18,y,251); Inc(y,2); End;
 
  {Policka s hodnotami RGB}
  x:=12; y:=42; I:=0;
  While I< Barva[PalSelect].R do
  Begin Blok(x,y,x+18,y,253); Inc(y,2); Inc(I); End;
  x:=32; y:=42; I:=0;
  While I< Barva[PalSelect].G do
  Begin Blok(x,y,x+18,y,254); Inc(y,2); Inc(I); End;
  x:=52; y:=42; I:=0;
  While I< Barva[PalSelect].B do
  Begin Blok(x,y,x+18,y,255); Inc(y,2); Inc(I); End;
End;
 
 
Procedure EditorPalety;
Var Ending: Boolean;
Begin
  PalSelect:=1;
  Ending:=False;
  Blok(0,0,319,199,251);
  Repeat
    WaitRetrace;
    WriteEPScreen;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{Left}     75: Begin If PalSelect>0  then Dec(PalSelect) else PalSelect:=15; End;
{Right}    77: Begin If PalSelect<15 then Inc(PalSelect) else PalSelect:=0;  End;
{Insert}   82: Begin If Barva[PalSelect].R>0  then Dec(Barva[PalSelect].R) else Barva[PalSelect].R:=0;  End;
{Delete}   83: Begin If Barva[PalSelect].R<63 then Inc(Barva[PalSelect].R) else Barva[PalSelect].R:=63; End;
{Home}     71: Begin If Barva[PalSelect].G>0  then Dec(Barva[PalSelect].G) else Barva[PalSelect].G:=0;  End;
{End}      79: Begin If Barva[PalSelect].G<63 then Inc(Barva[PalSelect].G) else Barva[PalSelect].G:=63; End;
{PageUp}   73: Begin If Barva[PalSelect].B>0  then Dec(Barva[PalSelect].B) else Barva[PalSelect].B:=0;  End;
{PageDown} 81: Begin If Barva[PalSelect].B<63 then Inc(Barva[PalSelect].B) else Barva[PalSelect].B:=63; End;
{F2}       60: Begin FnSave; End;
{F8}       66: Begin SoundStorno; End;
{F7}       65: Begin SoundStorno; End;
{F6}       64: Begin SoundStorno; End;
{F5}       63: Begin Ending:=True; End;
{Esc}       1: Begin Ending:=True; End;
    End; {Case Port[$60] End}
  Until Ending=True;
  Blok(0,0,319,199,251);
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure Setup4Colors;
Var I,X,Y,Offset: Word;
Begin
  X:=Trunc((EX*8+EX2)/8);
  Y:=Trunc((EY*8+EY2)/8);
  Offset:=(Y*20+X)*4;
  For I:=0 to 3 do
  Color[I]:=mem[BufferSeg2:Offset+I];
End;
 
 
Procedure WriteGScreen;
Var I,Xa,Ya,x,y,X1,Y1,Xp,Yp,Offset32,Offset2: Word;
Begin
  Ramecek(160,160,319,199,252);
 
  {Nastaveni spravnych barev 160x200 po krocich 8x8}
  For Ya:=0 to 24 do
  For Xa:=0 to 19 do
  Begin
    For y:=0 to 7 do
    For x:=0 to 7 do
    Begin
      X1:=Trunc((Xa*8+x)/8);
      Y1:=Trunc((Ya*8+y)/8);
      Offset2:=(Y1*20+X1)*4;
      Offset32:=((Ya*8+y)*160)+(Xa*8+x);
      Case mem[BufferSeg32:Offset32] of
        0: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+0]);
        1: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+1]);
        2: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+2]);
        3: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+3]);
      End; {Case End}
    End;
  End;
 
  {Kurzor 40x40}
  x:=EX*8; y:=EY*8;
  Ramecek(x,y,x+39,y+39,252);
 
  {Vykresleni obsahu 40x40}
  x:=160; y:=0;
  For Y1:=0 to 39 do
  Begin
    x:=160;
    For X1:=0 to 39 do
    Begin
      Xp:=Trunc((EX*8+X1)/8);
      Yp:=Trunc((EY*8+Y1)/8);
      Offset2:=(Yp*20+Xp)*4;
      Offset32:=(EY*8+Y1)*160+(EX*8+X1);
      Case mem[BufferSeg32:Offset32] of
        0: Blok(x+1,y+1,x+2,y+2,mem[BufferSeg2:Offset2+0]);
        1: Blok(x+1,y+1,x+2,y+2,mem[BufferSeg2:Offset2+1]);
        2: Blok(x+1,y+1,x+2,y+2,mem[BufferSeg2:Offset2+2]);
        3: Blok(x+1,y+1,x+2,y+2,mem[BufferSeg2:Offset2+3]);
      End; {Case End;}
      Inc(x,4);
    End;
    Inc(y,4);
  End;
 
  {Vymazavani kurzoru v editacnim poli}
  For Ya:=0 to 39 do
  For Xa:=0 to 39 do
  Begin
    x:=Xa*4+160; y:=Ya*4;
    Ramecek(x,y,x+3,y+3,251);
  End;
 
  {Kurzor v editacnim poli}
  x:=EX2*4+160; y:=EY2*4;
  Ramecek(x,y,x+3,y+3,252);
 
  {4 kreslici barvy ASDF}
  x:=160; y:=160;
  For I:=0 to 3 do
  Begin
    Ramecek(x,y,x+39,y+39,252);
    Blok(x+1,y+1,x+38,y+38,Color[I]);
    Inc(x,40);
  End;
 
End;
 
 
Procedure EditorGrafiky;
Var Ending: Boolean;
Begin
  EX:=0; EY:=0;
  EX2:=0; EY2:=0;
  Ending:=False;
  Blok(0,0,319,199,251);
  Repeat
    Setup4Colors;
    WaitRetrace;
    WriteGScreen;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{J}     36: Begin If EX2>0  then Dec(EX2) else EX2:=39; End;
{L}     38: Begin If EX2<39 then Inc(EX2) else EX2:=0;  End;
{I}     23: Begin If EY2>0  then Dec(EY2) else EY2:=39; End;
{K}     37: Begin If EY2<39 then Inc(EY2) else EY2:=0;  End;
 
{A}     30: Begin mem[BufferSeg32:((EY*8+EY2)*160)+(EX*8+EX2)]:=0; End;
{S}     31: Begin mem[BufferSeg32:((EY*8+EY2)*160)+(EX*8+EX2)]:=1; End;
{D}     32: Begin mem[BufferSeg32:((EY*8+EY2)*160)+(EX*8+EX2)]:=2; End;
{F}     33: Begin mem[BufferSeg32:((EY*8+EY2)*160)+(EX*8+EX2)]:=3; End;
 
{Left}  75: Begin If EX>0  then Dec(EX) else EX:=15; End;
{Right} 77: Begin If EX<15 then Inc(EX) else EX:=0;  End;
{Up}    72: Begin If EY>0  then Dec(EY) else EY:=20; End;
{Down}  80: Begin If EY<20 then Inc(EY) else EY:=0;  End;
 
{F2}    60: Begin FnSave; End;
{F8}    66: Begin SoundStorno; End;
{F7}    65: Begin SoundStorno; End;
{F6}    64: Begin SoundStorno; End;
{F5}    63: Begin Ending:=True; End;
{Esc}    1: Begin Ending:=True; End;
    End; {Case Port[$60] End}
  Until Ending=True;
  Blok(0,0,319,199,251);
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure WriteE4Screen;
Var x,y,X1,Y1,I,I2: Word;
Begin
  Ramecek(160,0,319,199,252);
 
  {Vymazavani kurzoru - vyber barvy}
  x:=160; y:=0; I:=0;
  For Y1:=0 to 3 do
  Begin
    x:=160;
    For X1:=0 to 3 do
    Begin
      Ramecek(x+2,y+2,x+37,y+37,251);
      Blok(x+6,y+6,x+33,y+33,I);
      inc(x,40); Inc(I);
    End;
    Inc(y,40);
  End;
 
  {Kurzor - vyber barvy}
  x:=160+B4X2*40; y:=B4Y2*40;
  Ramecek(x+2,y+2,x+37,y+37,252);
 
  {nahled 4 vybranych barev}
  x:=160; y:=160;
  For I:=0 to 3 do
  Begin
    Ramecek(x,y,x+39,y+39,252);
    Blok(x+2,y+2,x+37,y+37,mem[BufferSeg2:B4Y3*20+B4X3+I]);
    Inc(x,40);
  End;
 
  {Vymazavani kurzoru a vykresleni 4barvy}
  x:=0; y:=0; I:=0;
  For Y1:=0 to 24 do
  Begin
    x:=0;
    For X1:=0 to 19 do
    Begin
      Ramecek(x,y,x+7,y+7,251);
      Blok(x+2,y+2,x+3,y+3,mem[BufferSeg2:I+0]);
      Blok(x+4,y+2,x+5,y+3,mem[BufferSeg2:I+1]);
      Blok(x+2,y+4,x+3,y+5,mem[BufferSeg2:I+2]);
      Blok(x+4,y+4,x+5,y+5,mem[BufferSeg2:I+3]);
      inc(x,8); Inc(I,4);
    End;
    Inc(y,8);
  End;
 
  {Kurzor}
  x:=B4X*8; y:=B4Y*8;
  Ramecek(x,y,x+7,y+7,252);
 
End;
 
 
Procedure Editor4Barvy;
Var Ending: Boolean;
    I: Word;
Begin
  B4X:=0; B4Y:=0;
  B4X2:=0; B4Y2:=0;
  B4X3:=0; B4Y3:=0;
  Ending:=False;
  Blok(0,0,319,199,251);
  Repeat
    WaitRetrace;
    WriteE4Screen;
    ReadKey; Delay(100); NoBeep;
    Case Port[$60] of
{J}     36: Begin
              If B4X>0  then Dec(B4X) else B4X:=19;
              If B4X3>0 then Dec(B4X3,4) else B4X3:=76;
            End;
{L}     38: Begin
              If B4X<19 then Inc(B4X) else B4X:=0;
              If B4X3<76 then Inc(B4X3,4) else B4X3:=0;
            End;
{I}     23: Begin
              If B4Y>0  then Dec(B4Y) else B4Y:=24;
              If B4Y3>0 then Dec(B4Y3,4) else B4Y3:=96;
            End;
{K}     37: Begin
              If B4Y<24 then Inc(B4Y) else B4Y:=0;
              If B4Y3<96 then Inc(B4Y3,4) else B4Y3:=0;
            End;
 
{A}     30: Begin mem[BufferSeg2:(B4Y3*20+B4X3)+0]:=B4Y2*4+B4X2; End;
{S}     31: Begin mem[BufferSeg2:(B4Y3*20+B4X3)+1]:=B4Y2*4+B4X2; End;
{D}     32: Begin mem[BufferSeg2:(B4Y3*20+B4X3)+2]:=B4Y2*4+B4X2; End;
{F}     33: Begin mem[BufferSeg2:(B4Y3*20+B4X3)+3]:=B4Y2*4+B4X2; End;
 
{Left}  75: Begin If B4X2>0 then Dec(B4X2) else B4X2:=3; End;
{Right} 77: Begin If B4X2<3 then Inc(B4X2) else B4X2:=0; End;
{Up}    72: Begin If B4Y2>0 then Dec(B4Y2) else B4Y2:=3; End;
{Down}  80: Begin If B4Y2<3 then Inc(B4Y2) else B4Y2:=0; End;
{F2}    60: Begin FnSave; End;
{F8}    66: Begin SoundStorno; End;
{F7}    65: Begin SoundStorno; End;
{F6}    64: Begin SoundStorno; End;
{F5}    63: Begin Ending:=True; End;
{Esc}    1: Begin Ending:=True; End;
    End; {Case Port[$60] End}
  Until Ending=True;
  Blok(0,0,319,199,251);
End;
 
 
{XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}
Procedure Copy2ClipBoard;
Var Offset32,Offset2,X1,Y1,Xe,Ye,x,y,I: Word;
Begin
  {kopirovani do schranky 64B 8x8}
  x:=Xs*8; y:=Ys*8;
  For Ye:=0 to 7 do
  Begin
    For Xe:=0 to 7 do
    Begin
      Offset32:=((y+Ye)*160)+(x+Xe);
      Clipboard[I]:=mem[BufferSeg32:Offset32];
      Inc(I);
    End;
  End;
  {kopirovani do schranky barvy 4}
  x:=0; y:=0;
  X1:=Trunc((Xs*8+x)/8);
  Y1:=Trunc((Ys*8+y)/8);
  Offset2:=(Y1*20+X1)*4;
  For I:=0 to 3 do Clipboard2[I]:=mem[BufferSeg2:Offset2+I];
End;
 
 
Procedure RestoreFromClipBoard;
Var Offset32,Offset2,X1,Y1,Xe,Ye,x,y,I: Word;
Begin
  {vylozeni ze schranky 64B}
  x:=Xs*8; y:=Ys*8;
  For Ye:=0 to 7 do
  Begin
    For Xe:=0 to 7 do
    Begin
      Offset32:=((y+Ye)*160)+(x+Xe);
      mem[BufferSeg32:Offset32]:=Clipboard[I];
      Inc(I);
    End;
  End;
  {vylozeni ze schranky barvy 4}
  x:=0; y:=0;
  X1:=Trunc((Xs*8+x)/8);
  Y1:=Trunc((Ys*8+y)/8);
  Offset2:=(Y1*20+X1)*4;
  For I:=0 to 3 do mem[BufferSeg2:Offset2+I]:=Clipboard2[I];
 
End;
 
 
Procedure WriteEScreen;
Var Offset32,Offset2,Xa,Ya,X1,Y1,x,y,I,BarvaVeSchrance: Word;
Begin
  Ramecek(160,0,319,199,252);
 
  {Nastaveni spravnych barev 160x200 po krocich 8x8}
  For Ya:=0 to 24 do
  For Xa:=0 to 19 do
  Begin
    For y:=0 to 7 do
    For x:=0 to 7 do
    Begin
      X1:=Trunc((Xa*8+x)/8);
      Y1:=Trunc((Ya*8+y)/8);
      Offset2:=(Y1*20+X1)*4;
      Offset32:=((Ya*8+y)*160)+(Xa*8+x);
      Case mem[BufferSeg32:Offset32] of
        0: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+0]);
        1: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+1]);
        2: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+2]);
        3: WritePixel((Xa*8+x),(Ya*8+y),mem[BufferSeg2:Offset2+3]);
      End; {Case End}
    End;
  End;
 
  {Kurzor 8x8}
  x:=Xs*8; y:=Ys*8;
  Ramecek(x,y,x+7,y+7,252);
 
 
  {zobrazeni obsahu schranky - nahled barev}
  x:=194; y:=140;
  For I:=0 to 3 do
  Begin
    Blok(x,y,x+9,y+9,ClipBoard2[I]);
    Inc(x,10);
  End;
 
  {zobrazeni obsahu schranky - 8x8}
  Ramecek(194,49,276,131,252);
  x:=195; y:=50; I:=0;
  For Y1:=0 to 7 do
  Begin
    For X1:=0 to 7 do
    Begin
      Case ClipBoard[I] of
        0: Begin BarvaVeSchrance:=ClipBoard2[0]; End;
        1: Begin BarvaVeSchrance:=ClipBoard2[1]; End;
        2: Begin BarvaVeSchrance:=ClipBoard2[2]; End;
        3: Begin BarvaVeSchrance:=ClipBoard2[3]; End;
      End;
      Blok(x+1,y+1,x+9,y+9,BarvaVeSchrance);
      inc(x,10); Inc(I);
    End;
    x:=195; Inc(y,10);
  End;
 
End;
 
 
Procedure FnEditor;
Var Ending: Boolean;