program agn_v1_0;
uses WinTypes, WinProcs, WinCrt, WinDos, strings;
const
 atrybut_jakiegos_pliku=$3F;
var
{********************** zmienne dla transmisji RS232 ***********}
   com2:integer;
   j:TDCB;
   jj:TCOMSTAT;
   prob,odczyt,odczytanych,czekaj,kod,i,ii,k:integer;
   p_in_out:pchar;
   nieudana,blad,wykonano:boolean;
   udanych,nieudanych,bezodzewu:integer;
   znak:array[1..20]of string[1];
   odbiorca,nadawca,dlugosc:integer;
   nadane:array[1..40]of byte;
   odebrane:array[1..40]of byte;
{********************** zmienne ogolne *************************}
   duza_tablica: array[1..10000]of byte;
   grafika:array[1..80]of byte;
   plik,rozszerzenie,linijka,stos1,menu,nazwa_ostatniego_rozkazu,nazwa_rozkazu,
                                                         przed_kursorem,za_kursorem:string;
   rozszerzenie_prezentacji:string[4];
   czasPC:string[8];
   autosuma,wybieranych,wybrany,odczytanych_bajtow,ostatni_bajt_w_duzej_tablicy:integer;
   znakow_tekstu,key,znakow,kursor:integer;
   zmieniona:boolean;
   klawisz,kley:char;
   o_pliku:TSearchRec;
   procetowo:integer;

{********************** koniec zmiennych ***********************}

{***********************************************************************************}
{*                   PROCEDURY ZAPISU I ODCZYTU DO I Z REKLAMY                     *}
{***********************************************************************************}

procedure otworz_com2;
begin
   com2:=opencomm('com2',100,100); {otwieramy COM2}
   j.Id:=com2; {numer urządzenia}
   j.BaudRate:=2500; {prędkość dla IZA'y}
                     {co daje 1250/(8+1+1), czyli 125 bajtów na sekunde}
                     {w IZAAK'u mam czestotliwość 20kHz, czyli 16 razy większą!}
   j.bytesize:=8; {8 bitów}
   j.parity:=0; {bez z sprawdzania parzystości}
   j.stopbits:=0; {jeden bit stopu}
   j.flags:=1;
   k:=setcommstate(j); {ustaw moje parametry portu}
   {rozepchnij buforek slow}
   p_in_out:='x';
end;

procedure zamknij_com2;
begin
   k:=closecomm(1);
end;

function wartosc(znak:string):byte;
{odwrotna do char}
var
poczekalnia:byte;
petla1:integer;
begin
   poczekalnia:=0;
   for petla1:=1 to 255 do if znak=chr(petla1) then poczekalnia:=petla1;
   wartosc:=poczekalnia;
end;

procedure czekamy;
var
   dupka,wartosc:integer;
   whortet:word;
begin
   {czekamy okolo 1 milisekudy}
   wartosc:=0;
   repeat
      inc(wartosc);
      for dupka:=1 to 10 do whortet:=0;
   until (wartosc>999);
end;

procedure zapisz_znak;
var
   kod:byte;
   czekaj:integer;
begin
   {czekaj az kolejka pusta}
   wykonano:=false;
   czekaj:=0;
   repeat
      k:=GetCommError(com2,jj);
      czekamy;
      inc(czekaj);
   until((jj.cbOutQue=0)or(czekaj>99));
   if jj.cbOutQue=0 then begin
      kod:=0;
      for ii:=1 to 255 do if znak[1]=chr(ii) then kod:=ii;
      p_in_out[0]:=char(kod);
      k:=WriteComm(com2,p_in_out,1);
      wykonano:=true;
   end;
end;

procedure czytaj_znak;
var
   czekaj:integer;
   odczytanych:integer;
begin
   czekaj:=0;
   wykonano:=false;
   repeat
      k:=GetCommError(com2,jj);
      odczytanych:=jj.cbInQue;
      inc(czekaj);
   until((odczytanych>0)or(czekaj>50));
   if odczytanych>0 then begin
      k:=ReadComm(com2,p_in_out,1);
      znak[1]:=p_in_out[0];
      kod:=wartosc(znak[1]);
      wykonano:=true;
   end;
end;

procedure zapisz_slowo;
{zapisuje słowo zawarte bajtowo w tablicy tablica[x]}
{dlugosc slowa jest w zmiennej dlugosc (bez autosumy)!}
{maksymalna dlugosc to 99 bajtow}
{postac wyjsciowa to:}
{bajt #FF}
{bajt = nr odbiorcy}
{bajt = nr nadawcy}
{bajt rowny dlugosci slowa z autosuma}
{bajty slowa}
{bajt autosumy}
var
kolejno:integer;
autosuma:byte;
begin
   znak[1]:=chr(255);{=#FF}
   zapisz_znak;
   if not(wykonano) then exit;
   znak[1]:=chr(odbiorca);
   zapisz_znak;
   if not(wykonano) then exit;
   znak[1]:=chr(nadawca);
   zapisz_znak;
   if not(wykonano) then exit;
   znak[1]:=chr(dlugosc);
   zapisz_znak;
   if not(wykonano) then exit;
   autosuma:=0;
   for kolejno:=1 to dlugosc do begin
      autosuma:=autosuma+nadane[kolejno];
      znak[1]:=chr(nadane[kolejno]);
      zapisz_znak;{kolejne znaki}
      if not(wykonano) then exit;
   end;
   znak[1]:=chr(autosuma);
   zapisz_znak;
   {i tak po tym jest exit!}
end;

procedure czytaj_slowo;
{odczytuje słowo do tablicy: tablica[x]}
{dlugosc slowa jest w zmiennej dlugosc (bez autosumy)!}
{maksymalna dlugosc to 99 bajtow}
{postac slowa to:}
{bajt #FF}
{bajt = nr odbiorcy}
{bajt = nr nadawcy}
{bajt rowny dlugosci slowa z autosuma}
{bajty slowa}
{bajt autosumy}
var
   kolejno:integer;
   autosuma:byte;
   czekaj:integer;
begin
   czekaj:=0;
   repeat
      blad:=true;
      kod:=0;
      czytaj_znak;
      if not(wykonano) then kod:=0;
      if wykonano then begin
         czekaj:=0;
      end;
      inc(czekaj);
   until (czekaj>3);{czekaj na znak poczatku}
end;

procedure zapisz_i_odczytaj;
begin
   {w tej procedurze trzeba troszkę poeksperymentować z trzema wartosciami 7000...}
   {...dla innego komputera rzecz jasna!}
   otworz_com2;
   zapisz_slowo;
   inc(prob);
   odczyt:=0;
   i:=1;
   repeat
      czekaj:=0;
      repeat
         k:=GetCommError(com2,jj);
         odczytanych:=jj.cbInQue;
         inc(czekaj);
      until((odczytanych>0)or(czekaj>7000));
      if czekaj<=7000 then begin
         k:=ReadComm(com2,p_in_out,1);
         znak[i]:=p_in_out[0];
         inc(i);
         czekaj:=0;
      end;
   until(czekaj>7000);
   if i>1 then begin
      odczyt:=i-1;
      nieudana:=false;
      for i:=1 to odczyt do begin
         kod:=wartosc(znak[i]);
         odebrane[i]:=wartosc(znak[i]);
      end;
      if((odczyt<>7)or(nieudana))then begin
         inc(nieudanych);
      end else inc(udanych);
   end else begin
      inc(bezodzewu);
   end;
   zamknij_com2;
end;

{******************* koniec procedur dla RS232 *************************************}

procedure naglowek;
begin
   clrscr;
   writeln('**********************************************************************');
   writeln('*   PROGRAM WSPÓŁPRACUJĄCY Z REKLAMĄ ELEKTRONICZNĄ "Agnieszka" v1.0  *');
   writeln('*   Autor: Wiktor SZYMANOWSKI    [http://www.mojaelektronika.as.pl]  *');
   writeln('*   tel. 602 373 072 email:          szymanowski@swinoujscie.com.pl  *');
   writeln('*                            wersja freeko                           *');
   writeln('**********************************************************************');
   writeln;
   writeln('MENU ',menu,':');
end;

function uzupelnij_zerami(liczba:integer;ile_miejsc:integer):string;
var
   s,ss:string;
begin
   s:='';
   if((ile_miejsc<1)or(ile_miejsc>5))then ile_miejsc:=1;
   liczba:=abs(liczba);
   if((liczba<10000)and(ile_miejsc>4))then s:=s+'0';
   if((liczba<1000)and(ile_miejsc>3))then s:=s+'0';
   if((liczba<100)and(ile_miejsc>2))then s:=s+'0';
   if((liczba<10)and(ile_miejsc>1))then s:=s+'0';
   str(liczba,ss);
   uzupelnij_zerami:=s+ss;
end;

procedure press_any_key;
var
  zn:char;
begin
   writeln;
   writeln('...wciśnij coś...');
   zn:=readkey;
end;

function sprawdz_rozkaz(wejsciowy:byte):boolean;
var
   sprawdzenie:boolean;
begin
   sprawdzenie:=false;
   nazwa_rozkazu:='';
   znakow_tekstu:=0;
   if((wejsciowy>127)and(wejsciowy<144))then begin
      sprawdzenie:=true;
      case wejsciowy of
         128:nazwa_rozkazu:='<ROZPOCZNIJ_OD_POCZĄTKU>';
         129:nazwa_rozkazu:='<CZYŚĆ_EKRAN>';
         130:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_OD_PRAWEJ>';
         131:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_OD_LEWEJ>';
         132:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_OD_GÓRY>';
         133:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_OD_DOŁU>';
         134:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_UKOŚNIE>';
         135:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_GÓRA-DÓŁ>';
         136:nazwa_rozkazu:='<WSUŃ(WYSUŃ)_LEWO-PRAWO>';
         137:nazwa_rozkazu:='<WSYP(WYSYP)_PIASKOWO>';
         138:nazwa_rozkazu:='<MRUGAJ>';
         139:nazwa_rozkazu:='<NIE_MRUGAJ>';
         140:nazwa_rozkazu:='<OBRÓĆ_ZAWARTOŚĆ>';
         141:nazwa_rozkazu:='<CZEKAJ>';
         142:nazwa_rozkazu:='<POKAŻ_ZEGAR>';
         143:nazwa_rozkazu:='<WSYP_GRAFIKĘ>';
      end;
      if((wejsciowy=130)or(wejsciowy=131))then znakow_tekstu:=100;
      if((wejsciowy>131)and(wejsciowy<138))then znakow_tekstu:=10;
   end;
   sprawdz_rozkaz:=sprawdzenie;
end;

function kodPC(znaczek:string):byte;
{zamienia odczytany kod znaku PC na znak reklamy Agnieszka}
var
   kod:byte;
   kodek:integer;
begin
   kod:=20;{spacja gdy nic nie znajdzie}
   {koniec linii [ENTER] jest więc także zamieniany na spacje!}
   for kodek:=20 to 255 do begin
      if znaczek=char(kodek) then begin
         kod:=lo(kodek);
         kodek:=254;
      end;
   end;
   if char(kod)='Ą' then kod:=1;
   if char(kod)='ą' then kod:=2;
   if char(kod)='Ć' then kod:=3;
   if char(kod)='ć' then kod:=4;
   if char(kod)='Ę' then kod:=5;
   if char(kod)='ę' then kod:=6;
   if char(kod)='Ł' then kod:=7;
   if char(kod)='ł' then kod:=8;
   if char(kod)='Ń' then kod:=9;
   if char(kod)='ń' then kod:=10;
   if char(kod)='Ó' then kod:=11;
   if char(kod)='ó' then kod:=12;
   if char(kod)='Ś' then kod:=13;
   if char(kod)='ś' then kod:=14;
   if char(kod)='Ż' then kod:=15;
   if char(kod)='ż' then kod:=16;
   if char(kod)='Ź' then kod:=17;
   if char(kod)='ź' then kod:=18;
   kodPC:=kod;
end;

function ascii_PC(wejsciowy:string):byte;
var
   kodak:byte;
   i:integer;
begin
   kodak:=20;
   for i:=0 to 255 do begin
      if char(i)=wejsciowy[1] then begin
         kodak:=lo(i);
         i:=254;
      end;
   end;
   ascii_PC:=kodak;
end;

function kodRSnaPC(wejsciowy:byte):byte;
{zamienia odczytany kod znaku prezentacji na kod PC}
var
   kod:byte;
   kodek:integer;
   pom:boolean;
begin
   kod:=wejsciowy;
   if wejsciowy=1 then kod:=ascii_PC('Ą');
   if wejsciowy=2 then kod:=ascii_PC('ą');
   if wejsciowy=3 then kod:=ascii_PC('Ć');
   if wejsciowy=4 then kod:=ascii_PC('ć');
   if wejsciowy=5 then kod:=ascii_PC('Ę');
   if wejsciowy=6 then kod:=ascii_PC('ę');
   if wejsciowy=7 then kod:=ascii_PC('Ł');
   if wejsciowy=8 then kod:=ascii_PC('ł');
   if wejsciowy=9 then kod:=ascii_PC('Ń');
   if wejsciowy=10 then kod:=ascii_PC('ń');
   if wejsciowy=11 then kod:=ascii_PC('Ó');
   if wejsciowy=12 then kod:=ascii_PC('ó');
   if wejsciowy=13 then kod:=ascii_PC('Ś');
   if wejsciowy=14 then kod:=ascii_PC('ś');
   if wejsciowy=15 then kod:=ascii_PC('Ż');
   if wejsciowy=16 then kod:=ascii_PC('ż');
   if wejsciowy=17 then kod:=ascii_PC('Ź');
   if wejsciowy=18 then kod:=ascii_PC('ź');
   kodRSnaPC:=kod;
end;

function kodRS(znaczek:string):byte;
{tylko odczytuje bajty z pliku, nic nie zamienia}
var
   kod:byte;
   kodek:integer;
begin
   kod:=20;{spacja gdy nic nie znajdzie}
   for kodek:=0 to 255 do begin
      if znaczek=char(kodek) then begin
         kod:=lo(kodek);
         kodek:=254;
      end;
   end;
   kodRS:=kod;
end;

procedure klawiaturek;
begin
   repeat
      key:=0;
      klawisz:=readkey;
      if klawisz<>#0 then begin
         if klawisz=#27 then key:=1;{ESC                   ->wyjście}
         if klawisz=#13 then key:=2;{ENTER                 ->przesuń w prawo}
         if klawisz=#10 then key:=3;{ENTER+Ctrl            ->przesuń w lewo}
         if klawisz=#8 then key:=4;{Backspace              ->kasuj bajt}
         if klawisz=#9 then key:=5;{Tab                    ->wstaw rozkaz}
         if klawisz=#127 then key:=6;{Backspace+Ctrl       ->kursor na poczatek}
         if((klawisz>#31)and(klawisz<#127))then key:=7;{   ->inny klawisz}
         if key=0 then begin {nic wczesniejszego}
            if klawisz>#127 then begin {kod wysoki!!!}
               key:=7;
               {czy polska litera}
               if klawisz=#165 then klawisz:=#1;
               if klawisz=#185 then klawisz:=#2;
               if klawisz=#198 then klawisz:=#3;
               if klawisz=#230 then klawisz:=#4;
               if klawisz=#202 then klawisz:=#5;
               if klawisz=#234 then klawisz:=#6;
               if klawisz=#163 then klawisz:=#7;
               if klawisz=#179 then klawisz:=#8;
               if klawisz=#209 then klawisz:=#9;
               if klawisz=#241 then klawisz:=#10;
               if klawisz=#211 then klawisz:=#11;
               if klawisz=#243 then klawisz:=#12;
               if klawisz=#140 then klawisz:=#13;
               if klawisz=#156 then klawisz:=#14;
               if klawisz=#175 then klawisz:=#15;
               if klawisz=#191 then klawisz:=#16;
               if klawisz=#143 then klawisz:=#17;
               if klawisz=#159 then klawisz:=#18;
               {czy niemiecka litera...}
               if klawisz=#256 then klawisz:=#19;
               if klawisz=#256 then klawisz:=#20;
               if klawisz=#256 then klawisz:=#21;
               if klawisz=#256 then klawisz:=#22;
               if klawisz=#256 then klawisz:=#23;
               if klawisz=#256 then klawisz:=#24;
               if klawisz=#256 then klawisz:=#25;
               if klawisz=#256 then klawisz:=#26;
               {czy znak szczegolny...}
               if klawisz=#256 then klawisz:=#27;
               if klawisz=#256 then klawisz:=#28;
               if klawisz=#256 then klawisz:=#29;
               if klawisz=#256 then klawisz:=#30;
               if klawisz=#256 then klawisz:=#31;
               if klawisz>#31 then key:=0; {jednak nic znanego...}
            end;
         end;
      end else begin
         repeat
            klawisz:=readkey;
            writeln('powtarzam dopóki nie puścisz klawisza...');
         until(keypressed);
      end;
   until(key<>0);
end;

procedure wybor;
var
   pasujacy:boolean;
   zn:char;
begin
   if((wybieranych<3)or(wybieranych>9))then wybieranych:=2;
   writeln('...Twój wybór <od 1 do ',char(48+wybieranych),'>...');
   repeat
      zn:=readkey;
      pasujacy:=false;
      for i:=1 to wybieranych do begin
         if zn=char(48+i) then begin
            pasujacy:=true;
            wybrany:=i;
         end;
      end;
   until(pasujacy);
end;

procedure ustaw_czas;
var
  texdwa:string[2];
  g,m,s,us:word;
  zn:char;
begin
   prob:=0;
   repeat
      czasPC:='';
      otworz_com2;
      dlugosc:=4;
      nadane[1]:=0;
      gettime(g,m,s,us);
      nadane[2]:=g;{godzina}
      nadane[3]:=m;{minuta}
      nadane[4]:=s;{sekunda}
      if nadane[2]<10 then czasPC:=czasPC+' ';
      str(nadane[2],texdwa);
      czasPC:=czasPC+texdwa+':';
      if nadane[3]<10 then czasPC:=czasPC+'0';
      str(nadane[3],texdwa);
      czasPC:=czasPC+texdwa+':';
      if nadane[4]<10 then czasPC:=czasPC+'0';
      str(nadane[4],texdwa);
      czasPC:=czasPC+texdwa;
      zapisz_slowo;
      inc(prob);
      odczyt:=0;
      i:=1;
      repeat
         czekaj:=-30000;
         repeat
            k:=GetCommError(com2,jj);
            odczytanych:=jj.cbInQue;
            inc(czekaj);
         until((odczytanych>0)or(czekaj>30000));
         if czekaj<30000 then begin
            k:=ReadComm(com2,p_in_out,1);
            znak[i]:=p_in_out[0];
            inc(i);
            czekaj:=0;
         end;
      until(czekaj>30000);
      if i>1 then begin
         odczyt:=i-1;
         if odczyt=7 then begin
            autosuma:=wartosc(znak[5])+wartosc(znak[6]);
            if wartosc(znak[5])<>wartosc(znak[6]) then odczyt:=0;
            if wartosc(znak[3])<>3 then odczyt:=0;
            if wartosc(znak[4])<>2 then odczyt:=0;
            if autosuma<>wartosc(znak[7])then odczyt:=0;
         end else odczyt:=0;
      end;
      zamknij_com2;
      inc(prob);
   until((odczyt>0)or(prob>3));
end;

procedure ustawianie_czasu;
begin
   naglowek;
   writeln;
   ustaw_czas;
   if odczyt>0 then writeln('ustawiłem czas zgodny z zegarem komputera: ',czasPC) else
               writeln('nie zdołałem ustawić zegara reklamy');
   press_any_key;
end;

procedure nowa_prezentacja;
var
   kley:char;
begin
   naglowek;
   writeln;
   if zmieniona then begin
      writeln;
      write  ('obecna prezentacja nie została zapisana, ');
      writeln('utworzenie nowej spowoduje jej utratę,');
      writeln('...co wybierasz? ([ENTER]-> utwórz nową / [coś]-> anuluj) ?');
      kley:=readkey;
      if kley<>#13 then exit;
   end;
   zmieniona:=false;
   for i:=2 to 10000 do begin
      duza_tablica[i]:=0;
   end;
   duza_tablica[1]:=130;{rozkaz wczytuj od prawej}
   odczytanych_bajtow:=1;
   kursor:=2;
   ostatni_bajt_w_duzej_tablicy:=odczytanych_bajtow;
   writeln('...utworzyłem nową- pustą prezentację...');
   press_any_key;
end;

procedure odczyt_pliku_tekstowego;
var
   znaleziony_rozkaz,i,ii:integer;
   linijka:string;
   temp:text;
   tempb:file of byte;
   bajt,rozkaz_domyslny:byte;
   jest_plik,tekstowy_prezentacji,czy,jest_rozkaz:boolean;
   max_spacji,spacji:integer;
   kley:char;
begin
   jest_plik:=false;
   tekstowy_prezentacji:=false;
   assign(temp,plik);
   {$I-}reset(temp);{$I+}
   if IOResult=0 then begin
      jest_plik:=true;
      repeat
         readln(temp,linijka);
         for ii:=128 to 143 do begin
            czy:=sprawdz_rozkaz(lo(ii));
            nazwa_rozkazu:='<'+nazwa_rozkazu+'>';
            if nazwa_rozkazu=linijka then begin
               tekstowy_prezentacji:=true;
            end;
         end;
      until(eof(temp));
      close(temp);
   end;
   if((tekstowy_prezentacji)and(jest_plik))then begin
      odczytanych_bajtow:=0;
      assign(temp,plik);
      {$I-}reset(temp);{$I+}
      if IOResult=0 then begin
         odczytanych_bajtow:=1;
         repeat
            jest_rozkaz:=false;
            readln(temp,linijka);
            for ii:=128 to 143 do begin
               czy:=sprawdz_rozkaz(lo(ii));
               nazwa_rozkazu:='<'+nazwa_rozkazu+'>';
               if nazwa_rozkazu=linijka then begin
                  jest_rozkaz:=true;
                  znaleziony_rozkaz:=ii;
               end;
            end;
            if jest_rozkaz then begin
               if odczytanych_bajtow<10000 then begin
                  duza_tablica[odczytanych_bajtow]:=lo(znaleziony_rozkaz);
                  inc(odczytanych_bajtow);
                  if znaleziony_rozkaz=143 then odczytanych_bajtow:=odczytanych_bajtow+80;
               end;
            end else begin
               if odczytanych_bajtow<10000 then begin
                  i:=0;
                  if length(linijka)>0 then begin
                     repeat
                        inc(i);
                        duza_tablica[odczytanych_bajtow]:=kodPC(linijka[i]);
                        inc(odczytanych_bajtow);
                     until(i>=length(linijka));
                  end;
               end;
            end;
         until((eof(temp))or(odczytanych_bajtow>9999));
         close(temp);
         dec(odczytanych_bajtow);
         ostatni_bajt_w_duzej_tablicy:=odczytanych_bajtow;
         zmieniona:=false;
      end;
   end;
   if((not(tekstowy_prezentacji))and(jest_plik))then begin
      writeln;
      writeln('odczytywany plik jest czystym plikiem tekstowym, podaj domyślny rozkaz:');
      for rozkaz_domyslny:=130 to 137 do begin
         if sprawdz_rozkaz(rozkaz_domyslny) then;
         writeln(char(rozkaz_domyslny-64),'- ',nazwa_rozkazu,',');
      end;
      repeat
         rozkaz_domyslny:=0;
         kley:=readkey;
         kley:=upcase(kley);
         rozkaz_domyslny:=ascii_PC(kley)+64;
      until ((rozkaz_domyslny>129)and(rozkaz_domyslny<138));
      assign(tempb,plik);
      {$I-}reset(tempb);{$I+}
      if IOResult=0 then begin
         max_spacji:=3;
         odczytanych_bajtow:=1;
         duza_tablica[odczytanych_bajtow]:=rozkaz_domyslny;
         inc(odczytanych_bajtow);
         repeat
            read(tempb,bajt);
            if((bajt<>10)and(bajt<>13))then begin
               if bajt<>32 then begin
                  duza_tablica[odczytanych_bajtow]:=kodPC(char(bajt));
                  inc(odczytanych_bajtow);
                  spacji:=0;
               end else begin
                  if spacji<max_spacji then begin
                  duza_tablica[odczytanych_bajtow]:=kodPC(char(bajt));
                     inc(odczytanych_bajtow);
                     inc(spacji);
                  end;
               end;
            end else begin
               duza_tablica[odczytanych_bajtow]:=rozkaz_domyslny;
               inc(odczytanych_bajtow);
            end;
         until((eof(tempb))or(odczytanych_bajtow>9999));
         close(tempb);
         dec(odczytanych_bajtow);
         ostatni_bajt_w_duzej_tablicy:=odczytanych_bajtow;
         zmieniona:=false;
      end;
   end;
   if jest_plik then begin
      zmieniona:=false;
      write ('...odczytałem ');
      if odczytanych_bajtow>9999 then begin
         writeln('początek pliku <',plik,'>...');
         odczytanych_bajtow:=9999;
      end else writeln('plik <',plik,'>...');
      press_any_key;
   end;
end;

procedure odczyt_pliku_prezentacji;
var
   i:integer;
   linijka:string;
   temp:text;
   zn:char;
begin
   odczytanych_bajtow:=0;
   assign(temp,plik);
   {$I-}reset(temp);{$I+}
   if IOResult=0 then begin
      zmieniona:=false;
      repeat
         read(temp,zn);
         inc(odczytanych_bajtow);
         duza_tablica[odczytanych_bajtow]:=kodRS(zn);
      until(eof(temp));
      close(temp);
      ostatni_bajt_w_duzej_tablicy:=odczytanych_bajtow;
      zmieniona:=false;
      writeln('...odczytałem plik <',plik,'>...');
      press_any_key;
   end;
end;

procedure odczyt_pliku;
begin
   odczytanych_bajtow:=0;
   if((plik='error')or(plik='quit')) then exit;
   if((rozszerzenie='.txt')or(rozszerzenie=rozszerzenie_prezentacji))then begin
      if rozszerzenie='.txt' then begin
         odczyt_pliku_tekstowego;
      end else begin
         odczyt_pliku_prezentacji;
      end;
   end else plik:='error';
end;

procedure podaj_plik_do_odczytu;
var
   temp:text;
begin
   {po wyjsciu plik zawiera lancuch znakow:
   quit gdy opuszczamy,
   error gdy popelnilismy blad (plik nie istnieje)
   sciezki dostepu do istniejacego pliku}
   naglowek;
   writeln;
   writeln('Podaj plik, z którego pobierzemy materiał dla prezentacji:');
   writeln('lub [ENTER= anuluj]');
   readln(plik);
   if plik='' then begin
      plik:='quit';
      exit;
   end;
   if plik='' then plik:='test_tex.txt';
   rozszerzenie:='      '+plik;
   rozszerzenie:=copy(rozszerzenie,length(rozszerzenie)-3,4);
   for i:=1 to length(rozszerzenie) do begin
      if((kodPC(rozszerzenie[i])<96)and(kodPC(rozszerzenie[i])>64))then begin
         rozszerzenie:=copy(rozszerzenie,1,i-1)+char(kodPC(rozszerzenie[i])+32)
                        +copy(rozszerzenie,i+1,length(rozszerzenie)-i);
      end;
   end;
   if((rozszerzenie<>'.txt')and(rozszerzenie<>rozszerzenie_prezentacji))then begin
      writeln('podaj rozszerzenie pliku:');
      writeln('> [1] tekstowy (',plik,'.txt),');
      writeln('> [2] prezentacji (',plik,rozszerzenie_prezentacji,'),');
      wybieranych:=2;
      wybor;
      case wybrany of
         1:begin
              rozszerzenie:='.txt';
           end;
         2:begin;
              rozszerzenie:=rozszerzenie_prezentacji;
           end;
      end;
      plik:=plik+rozszerzenie;
   end;
   if plik<>'' then begin
      assign(temp,plik);
      {$I-}reset(temp);{$I+}
      if IOResult<>0 then begin
         plik:='';
         write('podany plik "',plik,'" nie istnieje, ');
                                 writeln('lub ścieżka do niego jest inna niż podana,');
         writeln('spróbuj jeszcze raz...');
         writeln;
         press_any_key;
         plik:='error';
      end else close(temp);
   end;
end;

procedure zapis_pliku_tekstowego;
var
   i:integer;
   temp:file of byte;
   bajt:byte;
   zmiana_linijki:boolean;
begin
   odczytanych_bajtow:=1;
   zmiana_linijki:=true;
   assign(temp,plik);
   {$I-}rewrite(temp);{$I+}
   repeat
      bajt:=duza_tablica[odczytanych_bajtow];
      if bajt<128 then begin
         bajt:=kodRSnaPC(bajt);
         if((bajt<>13)and(bajt<>10))then begin
            write(temp,bajt);
         end else begin
            bajt:=32;
            write(temp,bajt);
         end;
         zmiana_linijki:=false;
      end else begin
         if bajt<>143 then begin
            if not(zmiana_linijki) then begin
               bajt:=13;
               write(temp,bajt);
               bajt:=10;
               write(temp,bajt);
               zmiana_linijki:=true;
            end;
         end else begin
            odczytanych_bajtow:=odczytanych_bajtow+80;
            if not(zmiana_linijki) then begin
               bajt:=13;
               write(temp,bajt);
               bajt:=10;
               write(temp,bajt);
               zmiana_linijki:=true;
            end;
         end;
      end;
      inc(odczytanych_bajtow);
   until(odczytanych_bajtow>ostatni_bajt_w_duzej_tablicy);
   close(temp);
   writeln('...zapisałem plik <',plik,'>...');
   press_any_key;
end;

procedure zapis_pliku_tekstowego_prezentacji;
var
   i:integer;
   temp:file of byte;
   bajt:byte;
begin
   odczytanych_bajtow:=1;
   assign(temp,plik);
   {$I-}rewrite(temp);{$I+}
   repeat
      bajt:=duza_tablica[odczytanych_bajtow];
      if bajt>127 then begin
         {tutaj mamy rozkaz}
         if bajt<>143 then begin
            if sprawdz_rozkaz(bajt) then begin
               bajt:=13;
               write(temp,bajt);
               bajt:=10;
               write(temp,bajt);
               for i:=1 to length(nazwa_rozkazu) do begin
                  bajt:=ascii_PC(nazwa_rozkazu[i]);
                  write(temp,bajt);
               end;
               bajt:=13;
               write(temp,bajt);
               bajt:=10;
               write(temp,bajt);
            end;
         end else begin
            {tutaj mamy rozkaz grafika!}
            if sprawdz_rozkaz(bajt) then;
            bajt:=13;
            write(temp,bajt);
            bajt:=10;
            write(temp,bajt);
            nazwa_rozkazu:=nazwa_rozkazu+' + grafika urzytkownika ';
            for i:=1 to length(nazwa_rozkazu) do begin
               bajt:=ascii_PC(nazwa_rozkazu[i]);
               write(temp,bajt);
            end;
            bajt:=13;
            write(temp,bajt);
            bajt:=10;
            write(temp,bajt);
            odczytanych_bajtow:=odczytanych_bajtow+80;
         end;
      end else begin
         bajt:=kodRSnaPC(bajt);
         write(temp,bajt);
      end;
      inc(odczytanych_bajtow);
   until(odczytanych_bajtow>ostatni_bajt_w_duzej_tablicy);
   close(temp);
   zmieniona:=false;
   writeln('...zapisałem plik <',plik,'>...');
   press_any_key;
end;

procedure zapis_pliku_prezentacji;
var
   i:integer;
   temp:file of byte;
   bajt:byte;
begin
   odczytanych_bajtow:=1;
   assign(temp,plik);
   {$I-}rewrite(temp);{$I+}
   repeat
      bajt:=duza_tablica[odczytanych_bajtow];
      write(temp,bajt);
      inc(odczytanych_bajtow);
   until(odczytanych_bajtow>ostatni_bajt_w_duzej_tablicy);
   close(temp);
   zmieniona:=false;
   writeln('...zapisałem plik...');
   press_any_key;
end;

procedure zapis_pliku;
begin
   odczytanych_bajtow:=0;
   if((plik='error')or(plik='quit')) then exit;
   if((rozszerzenie='.txt')or(rozszerzenie=rozszerzenie_prezentacji))then begin
      if rozszerzenie='.txt' then begin
         writeln('plik zapisać jako:');
         writeln('> [1] czysty plik tekstowy');
         writeln('> [2] plik tekstowy z elementami prezentacji');
         wybieranych:=2;
         wybor;
         case wybrany of
            1:begin
                 zapis_pliku_tekstowego;
              end;
            2:begin;
                 zapis_pliku_tekstowego_prezentacji;
                 if((plik<>'error')and(plik<>'quit'))then zmieniona:=false;
              end;
         end;
      end else begin
         zapis_pliku_prezentacji;
         if((plik<>'error')and(plik<>'quit'))then zmieniona:=false;
      end;
   end else plik:='error';
end;

procedure podaj_plik_do_zapisu;
var
   temp:text;
   plikff:pchar;
   data_i_czas:tdatetime;
   kley:char;
begin
   {po wyjsciu plik zawiera lancuch znakow:
   quit gdy opuszczamy,
   error gdy popelnilismy blad
   sciezki dostepu do pliku}
   naglowek;
   writeln;
   plikff:='                                                ';
   write  ('Podaj plik, do którego zapiszemy prezentację ');
   if zmieniona then write('<zmodyfikowana>') else write('<niezmieniona>');
   writeln(':');
   writeln('lub [ENTER= anuluj]');
   readln(plik);
   if plik='' then begin
      plik:='quit';
      exit;
   end;
   if plik='' then plik:='temp.txt';
   rozszerzenie:='      '+plik;
   rozszerzenie:=copy(rozszerzenie,length(rozszerzenie)-3,4);
   for i:=1 to length(rozszerzenie) do begin
      if((kodPC(rozszerzenie[i])<96)and(kodPC(rozszerzenie[i])>64))then begin
         rozszerzenie:=copy(rozszerzenie,1,i-1)+char(kodPC(rozszerzenie[i])+32)
                        +copy(rozszerzenie,i+1,length(rozszerzenie)-i);
      end;
   end;
   repeat
      if rozszerzenie[1]<>'.' then rozszerzenie:=copy(rozszerzenie,2,100);
   until((length(rozszerzenie)<1)or(rozszerzenie[1]='.'));
   if((rozszerzenie<>'.txt')and(rozszerzenie<>rozszerzenie_prezentacji))then begin
      writeln('plik zapisać jako:');
      writeln('> [1] plik tekstowy (',plik,'.txt),');
      writeln('> [2] plik prezentacji (',plik,rozszerzenie_prezentacji,'),');
      wybieranych:=2;
      wybor;
      case wybrany of
         1:begin
              rozszerzenie:='.txt';
           end;
         2:begin;
              rozszerzenie:=rozszerzenie_prezentacji;
           end;
      end;
      plik:=plik+rozszerzenie;
   end;
   if plik<>'' then begin
      for i:=1 to (length(plik)+1) do begin
         if i>length(plik) then plikff[i]:=char(0)
         else plikff[i-1]:=char(lo(kodPC(plik[i])));
      end;
      findfirst(plikff,atrybut_jakiegos_pliku,o_pliku);
      if doserror=0 then begin
         unpacktime(o_pliku.time,data_i_czas);
         writeln;
         writeln('plik o tej nazwie już istnieje,');
         write  (' (ostatnia modyfikacja ',data_i_czas.year,'.');
         write  (uzupelnij_zerami(data_i_czas.month,2));
         write  ('.',uzupelnij_zerami(data_i_czas.day,2),' o ');
         write  (uzupelnij_zerami(data_i_czas.hour,2),':');
         write  (uzupelnij_zerami(data_i_czas.min,2),', ');
         writeln('rozmiar ',o_pliku.size,' bajtów) ');
         writeln('czy mam go zastąpić? [ENTER]->zastąp, coś->anuluj');
         kley:=readkey;
         if kley<>#13 then plik:='error';
      end;
   end;
end;

procedure ustal_teksty_dla_kursora;
var
   opis_bajtu:string[50];
   bajt:byte;
   byl_juz_koniec,koniec,sprawdzenie:boolean;
   delta_grafika:integer;
begin
   koniec:=false;
   byl_juz_koniec:=false;
   przed_kursorem:='          '+'          '+'          '+'          '+
                                              '          '+'          '+'          ';{70spacji}
   for i:=0 to kursor-1 do begin
      opis_bajtu:='';
      if i=0 then begin
         opis_bajtu:='<POCZĄTEK>';
      end;
      if((i>0)and(i<ostatni_bajt_w_duzej_tablicy+1))then begin
         if duza_tablica[i]=143 then begin
            sprawdzenie:=sprawdz_rozkaz(143);
            opis_bajtu:=nazwa_rozkazu;
            i:=i+80;
         end else begin
            bajt:=duza_tablica[i];
            if bajt<128 then begin
               opis_bajtu:=char(kodRSnaPC(bajt));
            end else begin
               sprawdzenie:=sprawdz_rozkaz(bajt);
               opis_bajtu:=nazwa_rozkazu;
            end;
         end;
      end;
      if((not(byl_juz_koniec))and(i>=(ostatni_bajt_w_duzej_tablicy+1)))then begin
         byl_juz_koniec:=true;
         opis_bajtu:='<ROZPOCZNIJ_OD_POCZĄTKU><KONIEC>';
      end;
      przed_kursorem:=przed_kursorem+opis_bajtu;
      przed_kursorem:=copy(przed_kursorem,length(przed_kursorem)-70+1,70);
      if i>kursor-1 then i:=kursor-1;
   end;
   za_kursorem:='';
   delta_grafika:=0;
   for i:=kursor to kursor+69 do begin
     opis_bajtu:='';
      if i=0 then begin
         opis_bajtu:='<POCZĄTEK>';
      end;
      if((i+delta_grafika>0)and((i+delta_grafika)<(ostatni_bajt_w_duzej_tablicy+1)))then begin
         if duza_tablica[i+delta_grafika]=143 then begin
            sprawdzenie:=sprawdz_rozkaz(143);
            opis_bajtu:=nazwa_rozkazu;
            delta_grafika:=delta_grafika+80;
         end else begin
            bajt:=duza_tablica[i+delta_grafika];
            if bajt<128 then begin
               opis_bajtu:=char(kodRSnaPC(bajt));
            end else begin
               sprawdzenie:=sprawdz_rozkaz(bajt);
               opis_bajtu:=nazwa_rozkazu;
            end;
         end;
      end;
      if (i+delta_grafika)>=(ostatni_bajt_w_duzej_tablicy+1) then begin
         if not(koniec) then opis_bajtu:='<ROZPOCZNIJ_OD_POCZĄTKU><KONIEC>'
                                                                    else opis_bajtu:='';
         koniec:=true;
      end;
      za_kursorem:=za_kursorem+opis_bajtu;
      za_kursorem:=copy(za_kursorem,1,70);
   end;
   za_kursorem:=za_kursorem+'          '+'          '+'          '+'          '+
                                             '          '+'          '+'          ';{+70spacji}
   za_kursorem:=copy(za_kursorem,1,70);
end;

procedure wyswietl_sytuacje;
begin
   ustal_teksty_dla_kursora;
   naglowek;
   writeln;
   if zmieniona then
   writeln('------------------ <prezentacja zmodyfikowana> -----------------------')
   else
   writeln('----------------------------------------------------------------------');
   writeln(przed_kursorem);
   writeln(za_kursorem);
   writeln('----------------------------------------------------------------------');
   writeln('długość prezentacji:',ostatni_bajt_w_duzej_tablicy+1,', miejsce kursora:',kursor);
end;

procedure podaj_plik_do_odczytu_grafiki;
var
   temp:text;
begin
   naglowek;
   writeln;
   writeln('Podaj plik, z którego pobierzemy grafikę:');
   writeln('lub [ENTER= anuluj]');
   readln(plik);
   if plik='' then begin
      plik:='quit';
      exit;
   end;
   rozszerzenie:='      '+plik;
   rozszerzenie:=copy(rozszerzenie,length(rozszerzenie)-3,4);
   for i:=1 to length(rozszerzenie) do begin
      if((kodPC(rozszerzenie[i])<96)and(kodPC(rozszerzenie[i])>64))then begin
         rozszerzenie:=copy(rozszerzenie,1,i-1)+char(kodPC(rozszerzenie[i])+32)
                        +copy(rozszerzenie,i+1,length(rozszerzenie)-i);
      end;
   end;
   repeat
      if rozszerzenie[1]<>'.' then rozszerzenie:=copy(rozszerzenie,2,100);
   until((length(rozszerzenie)<1)or(rozszerzenie[1]='.'));
   if rozszerzenie<>'.txt' then begin
      if rozszerzenie='' then begin
         rozszerzenie:='.txt';
         plik:=plik+rozszerzenie;
      end else begin
         plik:='error';
         exit;
      end;
   end;
   if plik<>'' then begin
      assign(temp,plik);
      {$I-}reset(temp);{$I+}
      if IOResult<>0 then begin
         plik:='';
         write('podany plik "',plik,'" nie istnieje, ');
                                 writeln('lub ścieżka do niego jest inna niż podana,');
         writeln('spróbuj jeszcze raz...');
         writeln;
         press_any_key;
         plik:='error';
      end else close(temp);
   end;
end;

procedure podaj_plik_do_zapisu_grafiki;
var
   temp:text;
   plikff:pchar;
   data_i_czas:tdatetime;
   kley:char;
begin
   naglowek;
   writeln;
   plikff:='                                                ';
   writeln('Podaj plik, do którego zapiszemy grafikę:');
   writeln('lub [ENTER= anuluj]');
   readln(plik);
   if plik='' then begin
      plik:='quit';
      exit;
   end;
   rozszerzenie:='      '+plik;
   rozszerzenie:=copy(rozszerzenie,length(rozszerzenie)-3,4);
   for i:=1 to length(rozszerzenie) do begin
      if((kodPC(rozszerzenie[i])<96)and(kodPC(rozszerzenie[i])>64))then begin
         rozszerzenie:=copy(rozszerzenie,1,i-1)+char(kodPC(rozszerzenie[i])+32)
                        +copy(rozszerzenie,i+1,length(rozszerzenie)-i);
      end;
   end;
   repeat
      if rozszerzenie[1]<>'.' then rozszerzenie:=copy(rozszerzenie,2,100);
   until((length(rozszerzenie)<1)or(rozszerzenie[1]='.'));
   if rozszerzenie<>'.txt' then begin
      if rozszerzenie='' then begin
         rozszerzenie:='.txt';
         plik:=plik+rozszerzenie;
      end else begin
         plik:='error';
         exit;
      end;
   end;
   if plik<>'' then begin
      for i:=1 to length(plik) do begin
         plikff[i-1]:=char(lo(kodPC(plik[i])));
      end;
      plikff[i]:=char(0);
      findfirst(plikff,atrybut_jakiegos_pliku,o_pliku);
      if doserror=0 then begin
         unpacktime(o_pliku.time,data_i_czas);
         writeln;
         writeln('plik o tej nazwie już istnieje,');
         write  (' (ostatnia modyfikacja ',data_i_czas.year,'.');
         write  (uzupelnij_zerami(data_i_czas.month,2));
         write  ('.',uzupelnij_zerami(data_i_czas.day,2),' o ');
         write  (uzupelnij_zerami(data_i_czas.hour,2),':');
         write  (uzupelnij_zerami(data_i_czas.min,2),', ');
         writeln('rozmiar ',o_pliku.size,' bajtów) ');
         writeln('czy mam go zastąpić? [ENTER]->zastąp, coś->anuluj');
         kley:=readkey;
         if kley<>#13 then plik:='error';
      end;
   end;
end;

procedure odczytaj_grafike;
var
   temp:text;
   i,linijek:integer;
   znak,bit,bajt,bitek:byte;
   blad_grafiki:boolean;
begin
   podaj_plik_do_odczytu_grafiki;
   if((plik='quit')or(plik='error'))then exit;
   blad_grafiki:=false;
   assign(temp,plik);
   {$I-}reset(temp);{$I+}
   if IOResult=0 then begin
      linijek:=0;
      repeat
         readln(temp,linijka);
         inc(linijek);
         if((length(linijka)=80)and(not(blad_grafiki)))then begin
            znak:=0;
            i:=1;
            repeat
               bit:=0;
               bajt:=0;
               repeat
                  bitek:=kodPC(linijka[i]);
                  if bitek=32 then begin
                     bajt:=2*bajt+0;
                  end else begin
                     if bitek=64 then begin
                        bajt:=2*bajt+1;
                     end else blad_grafiki:=true;
                  end;
                  inc(bit);
                  inc(i);
               until(bit>7);
               if((not(blad_grafiki))and(linijek<9))then begin;
                  grafika[linijek+znak*8]:=bajt;
               end;
               inc(znak);
            until(znak>9);
         end else blad_grafiki:=true;
      until(eof(temp));
   end;
   if not(blad_grafiki) then begin
      write ('...odczytałem grafike z pliku<',plik,'>...');
      press_any_key;
   end else begin
      for i:=1 to 80 do grafika[i]:=0;
      write ('...nie odczytałem poprawnej grafiki...');
      press_any_key;
   end;
end;

procedure zapisz_grafike;
var
   temp:text;
   potega,y,x,bit:integer;
   bajt:byte;
   znak:char;
begin
   podaj_plik_do_zapisu_grafiki;
   if((plik='quit')or(plik='error'))then exit;
   assign(temp,plik);
   {$I-}rewrite(temp);{$I+}
   for y:=0 to 7 do begin
      linijka:='';
      for x:=0 to 9 do begin
         bajt:=grafika[1+y+(8*x)];
         for bit:=7 downto 0 do begin
            potega:=1;
            if bit>0 then potega:=2;
            if bit>1 then begin
               for i:=1 to (bit-1) do potega:=potega*2;
            end;
            if bajt>=potega then begin
               znak:=char(64);
               bajt:=bajt-potega;
            end else znak:=char(32);
            linijka:=linijka+znak;
         end;
      end;
      writeln(temp,linijka);
   end;
   close(temp);
   writeln('...zapisałem plik <',plik,'>...');
   press_any_key;
end;

procedure modyfikuj_grafike;
var
   xkursor,ykursor:integer;
   linijka:string[80];
   x,y,bit,i:integer;
   bajt,potega:integer;
   znak,kley:char;
   bity:array[0..7]of boolean;
begin
   xkursor:=0;
   ykursor:=0;
   repeat
      naglowek;
      writeln;
      writeln('zaprojektuj grafikę dla <WSYP_GRAFIKĘ>; kursor: 4,8,6 i 2, a zmiana to spacja');
      writeln('5 to inwersja całości...          ...i naciśnij [ENTER]');
      writeln;
      write('--------------------------------------------------------------------------------');
      for y:=0 to 7 do begin
         linijka:='';
         for x:=0 to 9 do begin
            bajt:=grafika[1+y+(8*x)];
            for bit:=7 downto 0 do begin
               potega:=1;
               if bit>0 then potega:=2;
               if bit>1 then begin
                  for i:=1 to (bit-1) do potega:=potega*2;
               end;
               if bajt>=potega then begin
                  znak:=char(64);
                  bajt:=bajt-potega;
               end else znak:=char(32);
               if((ykursor=y)and(xkursor=x*8+(7-bit)))then begin
                  if znak=char(64) then znak:=char(42);
                  if znak=char(32) then znak:=char(43);
               end;
               linijka:=linijka+znak;
            end;
         end;
         write(linijka);
      end;
      write('--------------------------------------------------------------------------------');
      kley:=readkey;
      case kley of
      '5':begin{inwersja}
             for i:=1 to 80 do begin
                grafika[i]:=255-grafika[i];
             end;
          end;
      '4':begin{lewo}
             if xkursor>0 then dec(xkursor);
          end;
      '6':begin{prawo}
             if xkursor<79 then inc(xkursor);
          end;
      '8':begin{gora}
             if ykursor>0 then dec(ykursor);
          end;
      '2':begin{dol}
             if ykursor<7 then inc(ykursor);
          end;
      ' ':begin{zmien}
             bajt:=grafika[1+ykursor+(8*(xkursor div 8))];
             for bit:=7 downto 0 do begin
                bity[bit]:=false;
                potega:=1;
                if bit>0 then potega:=2;
                if bit>1 then begin
                   for i:=1 to (bit-1) do potega:=potega*2;
                end;
                if bajt>=potega then begin
                   bity[bit]:=true;
                   bajt:=bajt-potega;
                end;
             end;
             bit:=7-(xkursor mod 8);
             if bity[bit] then bity[bit]:=false else bity[bit]:=true;
             bajt:=0;
             for bit:=7 downto 0 do begin
                potega:=1;
                if bit>0 then potega:=2;
                if bit>1 then begin
                   for i:=1 to (bit-1) do potega:=potega*2;
                end;
                if bity[bit] then bajt:=bajt+potega;
             end;
             grafika[1+ykursor+(8*(xkursor div 8))]:=bajt;
             if xkursor<79 then inc(xkursor);
          end;
      end;
   until kley=#13;{[ENTER]}
end;

procedure projektuj_grafike;
var
   dlugosc_menu:integer;
begin
   dlugosc_menu:=length(menu);
   for i:=1 to 80 do grafika[i]:=0;
   repeat
      naglowek;
      writeln('> [1] Odczytaj grafike');
      writeln('> [2] Modyfikuj grafike');
      writeln('> [3] Zapisz grafike');
      writeln('> [4] Wyjdź');
      wybieranych:=4;
      wybor;
      case wybrany of
      1: begin
            menu:=menu+' / odczyt grafiki';
            odczytaj_grafike;
         end;
      2: begin
            menu:=menu+' / modyfikacja grafiki';
            modyfikuj_grafike;
         end;
      3: begin
            menu:=menu+' / zapisywanie grafiki';
            zapisz_grafike;
         end;
      end;
   until(wybrany=4);
   menu:=copy(menu,1,dlugosc_menu);
end;

procedure zabawa_z_plikiem;
var
   kley:char;
   kod_wstawianego_rozkazu:byte;
   to_grafika:boolean;
begin
   if ostatni_bajt_w_duzej_tablicy>9999 then ostatni_bajt_w_duzej_tablicy:=9999;
   repeat
      if duza_tablica[ostatni_bajt_w_duzej_tablicy]=128 then begin
         duza_tablica[ostatni_bajt_w_duzej_tablicy]:=0;
         dec(ostatni_bajt_w_duzej_tablicy);
      end;
   until(duza_tablica[ostatni_bajt_w_duzej_tablicy]<>128);
   naglowek;
   writeln('MENU [3] Modyfikuj prezentację');
   writeln;
   if ostatni_bajt_w_duzej_tablicy=0 then begin
      zmieniona:=false;
      nowa_prezentacja;
   end;
   kursor:=2;
   if ostatni_bajt_w_duzej_tablicy+1>kursor then dec(kursor);
   repeat
      wyswietl_sytuacje;
      klawiaturek;
      case key of
      2:{ENTER            ->przesuń w prawo}
         begin
            if duza_tablica[kursor]=143 then begin
               kursor:=kursor+81;
               if kursor>(ostatni_bajt_w_duzej_tablicy+1) then kursor:=1;
            end else begin
               inc(kursor);
               if kursor>(ostatni_bajt_w_duzej_tablicy+1) then kursor:=1;
            end;
         end;
      3:{ENTER+Ctrl       ->przesuń w lewo}
         begin
            if kursor>81 then begin
               if duza_tablica[kursor-81]=143 then begin
                  kursor:=kursor-81;
                  if kursor<1 then kursor:=ostatni_bajt_w_duzej_tablicy+1;
               end else begin
                  dec(kursor);
                  if kursor<1 then kursor:=ostatni_bajt_w_duzej_tablicy+1;
               end;
            end else begin
               dec(kursor);
               if kursor<1 then kursor:=ostatni_bajt_w_duzej_tablicy+1;
            end;
         end;
      4:{Backspace        ->kasuj bajt}
         begin
            if kursor>1 then begin
               to_grafika:=false;
               for i:=1 to kursor-1 do begin
                  if duza_tablica[i]=143 then begin
                     i:=i+80;
                     if i>=kursor-1 then begin
                        to_grafika:=true;
                        i:=kursor-1;
                     end;
                  end;
               end;
               if not(to_grafika) then begin
                  for i:=kursor to 10000 do begin
                     duza_tablica[i-1]:=duza_tablica[i];
                  end;
                  duza_tablica[10000]:=0;
                  dec(ostatni_bajt_w_duzej_tablicy);
                  dec(kursor);
                  zmieniona:=true;
               end else begin
                  for i:=kursor to 10000 do begin
                     duza_tablica[i-81]:=duza_tablica[i];
                  end;
                  for i:=1 to 81 do begin
                     duza_tablica[1000-81+i]:=0;
                  end;
                  ostatni_bajt_w_duzej_tablicy:=ostatni_bajt_w_duzej_tablicy-81;
                  kursor:=kursor-81;
                  zmieniona:=true;
               end;
            end;
         end;
      5:{Tab              ->wstaw rozkaz}
         begin
            writeln;
            writeln('...podaj kod wstawianego rozkazu(A-O), lub anuluj [ENTER]');
            repeat
               kley:=readkey;
               kley:=upcase(kley);
               if sprawdz_rozkaz(ascii_PC(kley)-64+128) then
                                               kod_wstawianego_rozkazu:=ascii_PC(kley)-64+128;
               if((kod_wstawianego_rozkazu<129)or(kod_wstawianego_rozkazu>143))then
                                                                   kod_wstawianego_rozkazu:=0;
            until((kley=#13)or(sprawdz_rozkaz(kod_wstawianego_rozkazu)));
            if kley<>#13 then begin
               repeat
                  stos1:=nazwa_rozkazu;
                  wyswietl_sytuacje;
                  nazwa_rozkazu:=stos1;
                  writeln('czy to ten: ',nazwa_rozkazu,' ?');
                  writeln('...potwierdź [TAB], podaj inny kod (A-O), lub anuluj [ENTER]');
                  repeat
                     kley:=readkey;
                     kley:=upcase(kley);
                     if sprawdz_rozkaz(ascii_PC(kley)-64+128) then
                                                 kod_wstawianego_rozkazu:=ascii_PC(kley)-64+128;
                  until((kley=#9)or(kley=#13)or(sprawdz_rozkaz(kod_wstawianego_rozkazu)));
               until((kley=#13)or(kley=#9));
               if((kley=#9)and(kursor<9919))then begin
                  for i:=9999 downto kursor do begin
                     duza_tablica[i+1]:=duza_tablica[i];
                  end;
                  if kod_wstawianego_rozkazu=143 then begin
                     projektuj_grafike;
                     {rozsun}
                     for i:=9919 downto kursor do begin
                        duza_tablica[i+81]:=duza_tablica[i];
                     end;
                     duza_tablica[kursor]:=kod_wstawianego_rozkazu;
                     for i:=1 to 80 do begin
                        duza_tablica[kursor+i]:=grafika[i];
                     end;
                     kursor:=kursor+81;
                     ostatni_bajt_w_duzej_tablicy:=ostatni_bajt_w_duzej_tablicy+81;
                     zmieniona:=true;
                  end else begin
                     duza_tablica[kursor]:=kod_wstawianego_rozkazu;
                     inc(ostatni_bajt_w_duzej_tablicy);
                     inc(kursor);
                     zmieniona:=true;
                  end;
               end;
            end;
         end;
      6:{Backspace+Ctrl   ->kursor na poczatek}
         begin
            kursor:=1;
         end;
      7:{                 ->inny znak}
         begin
            for i:=9999 downto kursor do begin
               duza_tablica[i+1]:=duza_tablica[i];
            end;
            duza_tablica[kursor]:=ascii_PC(klawisz); {kod wstawianego znaku}
            inc(ostatni_bajt_w_duzej_tablicy);
            inc(kursor);
            zmieniona:=true;
         end;
      end;
   until(key=1);
end;

procedure przeslij_prezentacje;
var
   blok,blokow:integer;
   postep:integer;
   tekst_postepu:string;
   ile:integer;
   max_prob:integer;
   kley:char;
   temp1:text;
   plik_tex:string;
   wysylaj_kodami:boolean;
   linijka,kod_tex:string[4];
   kodl,kodh:integer;
begin
   plik_tex:='kody.txt';
   wysylaj_kodami:=false;
   assign(temp1,plik_tex);
   {$I-}reset(temp1);{$I+}
   if IOResult=0 then begin
      readln(temp1,linijka);
      if linijka='monitoruj kody' then wysylaj_kodami:=true;
      close(temp1);
   end;
   naglowek;
   if ostatni_bajt_w_duzej_tablicy<2 then begin
      writeln;
      writeln('...nie mam żadnej prezentacji w pamięci...');
      press_any_key;
      exit;
   end else begin
      repeat
         if duza_tablica[ostatni_bajt_w_duzej_tablicy]=128 then begin
            duza_tablica[ostatni_bajt_w_duzej_tablicy]:=0;
            dec(ostatni_bajt_w_duzej_tablicy);
         end;
      until(duza_tablica[ostatni_bajt_w_duzej_tablicy]<>128);
   end;
   writeln('...ustawiam czas...');
   ustaw_czas;
   inc(ostatni_bajt_w_duzej_tablicy);
   duza_tablica[ostatni_bajt_w_duzej_tablicy]:=128;
   blokow:=(ostatni_bajt_w_duzej_tablicy-1) div 32 +1;
   prob:=0;
   repeat
      dlugosc:=4;
      nadane[1]:=2;
      nadane[2]:=0;
      nadane[3]:=0;
      nadane[4]:=0;
      udanych:=0;
      zapisz_i_odczytaj;
   until((udanych>0)or(prob>4));
   if prob>4 then begin
      writeln;
      writeln('...reklama nie odpowiada...');
      press_any_key;
      exit;
   end else begin
      {sprawdz czy prezentacja sie zmiesci!}
      procetowo:=(blokow*100) div odebrane[5];
      if blokow>odebrane[5] then begin
         writeln;
         writeln('...prezentacja jest zbyt długa dla tej reklamy...');
         writeln('obciąć czy pozostawić? ([ENTER]->obetnij / coś ->pozostaw) ?');
         kley:=readkey;
         if kley=#13 then begin
            {obetnij}
            ostatni_bajt_w_duzej_tablicy:=odebrane[5]*32-1;
            for i:=1 to ostatni_bajt_w_duzej_tablicy do begin
               if duza_tablica[i]=143 then begin
                  i:=i+80;
                  if i>=ostatni_bajt_w_duzej_tablicy then begin
                     ostatni_bajt_w_duzej_tablicy:=i-80;
                  end;
               end;
            end;
            inc(ostatni_bajt_w_duzej_tablicy);
            duza_tablica[ostatni_bajt_w_duzej_tablicy]:=128;
            blokow:=(ostatni_bajt_w_duzej_tablicy-1) div 32 +1;
            writeln;
            writeln('...prezentacja została skrócona do ',blokow*32,' bajtów...');
            writeln;
         end else exit;
      end else writeln('prezentacja zajmuje ',procetowo,'% pamięci reklamy...');
   end;
   write  ('...rozpoczynam transmisje:   0%...');
   max_prob:=10;
   prob:=0;
   repeat
      dlugosc:=4;
      nadane[1]:=1;
      nadane[2]:=blokow;
      nadane[3]:=blokow;
      nadane[4]:=blokow;
      udanych:=0;
      zapisz_i_odczytaj;
   until((udanych>0)or(prob>=max_prob));
   blok:=0;
   if prob>=max_prob then begin
      writeln;
      writeln('...transmisja nieudana...');
      press_any_key;
      exit;
   end else begin
      for i:=1 to 6 do write(char(8));{strzałka w lewo 7 razy}
      postep:=(100*blok) div (blokow+1);
      str(postep,tekst_postepu);
      tekst_postepu:=' '+tekst_postepu+'%...';
      write  (tekst_postepu);
   end;
   prob:=0;
   blok:=1;
   if wysylaj_kodami then begin
      assign(temp1,plik_tex);
      {$I-}rewrite(temp1);{$I+}
   end;
   repeat
      dlugosc:=33;
      nadane[1]:=blok;
      for i:=1 to 32 do begin
         if ((blok-1)*32+i)<(ostatni_bajt_w_duzej_tablicy+1) then
                                               nadane[i+1]:=duza_tablica[(blok-1)*32+i]
         else nadane[i+1]:=128;
         kodh:=-1;
         kodl:=nadane[i+1];
         kodl:=kodl+16;
         repeat
            kodl:=kodl-16;
            inc(kodh);
         until(kodl<16);
         if kodh<10 then kod_tex:='#'+char(48+kodh) else kod_tex:='#'+char(65+kodh-10);
         if kodl<10 then kod_tex:=kod_tex+char(48+kodl) else kod_tex:=kod_tex+char(65+kodl-10);
         if wysylaj_kodami then write(temp1,kod_tex,' ');
      end;
      if wysylaj_kodami then writeln(temp1);
      udanych:=0;
      zapisz_i_odczytaj;
      if udanych>0 then begin
         inc(blok);
         prob:=0;
         ile:=6;
         if postep>9 then ile:=7;
         for i:=1 to ile do write(char(8));{strzałka w lewo 7 razy}
         postep:=(100*blok) div (blokow+1);
         str(postep,tekst_postepu);
         tekst_postepu:=' '+tekst_postepu+'%...';
         if postep>99 then tekst_postepu:='100%';
         write  (tekst_postepu);
      end;
   until((blok>blokow)or(prob>=max_prob));
   if wysylaj_kodami then close(temp1);
   if prob>=max_prob then begin
      writeln;
      writeln('...transmisja nieudana...');
      press_any_key;
   end else begin
      writeln('  -zakończyłem...');
      writeln('...reklama prezentuje...');
      press_any_key;
   end;
end;

BEGIN
   rozszerzenie_prezentacji:='.pzt';
   repeat
      menu:='GŁÓWNE';
      naglowek;
      writeln('> [1] Utwórz nową prezentację');
      writeln('> [2] Odczytaj prezentację');
      writeln('> [3] Modyfikuj prezentację');
      writeln('> [4] Przeslij do reklamy');
      writeln('> [5] Zapisz prezentację');
      writeln('> [6] Projektowanie grafiki');
      writeln('> [7] Ustawienie zegara reklamy');
      writeln('> [8] Zakończ');
      wybieranych:=8;
      wybor;
      case wybrany of
      1: begin
            menu:='[1] Utwórz nową prezentację';
            nowa_prezentacja;
         end;
      2: begin
            menu:='[2] Odczytaj prezentację';
            podaj_plik_do_odczytu;
            odczyt_pliku;
            kursor:=1;
         end;
      3: begin
            menu:='[3] Modyfikuj prezentację';
            zabawa_z_plikiem;
         end;
      4: begin
            menu:='[4] Przeslij do reklamy';
            przeslij_prezentacje;
         end;
      5: begin
            menu:='[5] Zapisz prezentację';
            podaj_plik_do_zapisu;
            zapis_pliku;
         end;
      6: begin
            menu:='[6] Projektowanie grafiki';
            projektuj_grafike;
         end;
      7: begin
            menu:='[7] Ustawienie zegara reklamy';
            ustawianie_czasu;
         end;
      8: begin
            if zmieniona then begin
               repeat
                  menu:='[8] Zakończ';
                  naglowek;
                  writeln;
                  write  ('Prezentacja zawarta w pamięci nie została zapisana, ');
                  writeln('czy zapisać ją teraz?');
                  writeln('[ENTER]->tak, chcę zapisać / coś->nie zapisuj, wyjdź');
                  kley:=readkey;
                  if kley=#13 then begin
                     podaj_plik_do_zapisu;
                     zapis_pliku;
                  end else plik:='inne coś';
               until((plik<>'error')and(plik<>'quit'));
               wybrany:=8;
            end;
         end;
      end;
   until(wybrany=8);
END.