Emultor Turingov stroj v pascale

Delphi & Pascal (esk wiki)
Pejt na: navigace, hledn
Kategrie:
turing.pngProgram: Turing.pas
Soubor exe: Turing.exe
Potebn: Trsek.pas
Pklady: Move.turPrepis.tur

Program vznikol ako pomcka pri uen TURINGOVHO stroja na FEI TU Koice. Kad kto absolvoval skku na tmu Moore, Mealy automatov vie o om hovorm. Pomha vizulne pochopi funknos, alebo navrhn vlastn program pre turingov stroj. M prjemn ovldanie. alej monosti krokova navrhnut program, uloi na disk, alebo vybra z disku. Bohuia priiel som o ukkov programy, tak som pr kskov napsal. V ase vzniku sa program teil vekej obube. Dfam e ete niekomu pome, pretoe turingove stroje s zklad asembleru. Neverte? Ani ja som neveril.
{ TURING.PAS                Copyright (c) TrSek alias Zdeno Sekerak }
{ Pre potreby vyucby turingovych strojov.                           }
{ Ma vyborne prepracovane IDE podobne tomu z Turbo Pascalu.         }
{ Pre potreby vyucby je mozne napisany program krokovat, zastavovat.}
{                                                                   }
{ Datum:12.05.1997                             http://www.trsek.com }
 
program turingov_stroj;
 
uses crt,dos,trsek;
 
const shifz:set of char=
    [')','!','@','#','$','%','^','&','*','('];
      shiftz:array[0..9] of char=
    ')!@#$%^&*(';
 
 
var i,y,yr,pp:integer;
    meno:string;
    ss:word;
    re,lock:string;
    ch:char;
    ok:boolean;
    strana:array[1..2,10..70,7..11] of byte;
    paska:array[-15..1102] of char;
    edit:array[1..1024] of string[12];
    inx:array[1..1024,1..2] of word;
    f:text;
 
 
procedure uvod;
const p=65;
var s:string;
begin
s:='EExEEywxjpEEExQEyEV]QESpQEuQEU]WVW';
for i:=1 to length(s) do s[i]:=chr(ord(s[i])-37);
gotoxy(1,24);
sound(110);delay(p);writeln('             ');
sound(98); delay(p);writeln('                                                                           ');
sound(131);delay(p);writeln('                                                                         ');
sound(110);delay(p);writeln('                                           ');
sound(165);delay(p);writeln('                                                    ');
sound(147);delay(p);writeln('                                               ');
sound(196);delay(p);writeln('                                                ');
sound(165);delay(p);writeln('                                                 ');
sound(247);delay(p);writeln('                                                                               ');
sound(220);delay(p);writeln('                                                                               ');
sound(294);delay(p);writeln('                                                                               ');
sound(247);delay(p);writeln('                                             ');
sound(349);delay(p);writeln('                                                                 ');
sound(330);delay(p);writeln('                                                              ');
sound(440);delay(p);writeln('                                                          ');
sound(349);delay(p);writeln('                                                       ');
sound(523);delay(p);writeln;
sound(494);delay(p);writeln;
sound(659);delay(p);writeln(s);
sound(523);delay(p);writeln;
sound(699);delay(p);writeln('                   S I M U L A T O R    F O R   P C   X T / A T ');
sound(659);delay(p);writeln('                             P r e s s   E n t e r ');
nosound;
repeat until (readkey in [#27,#13]);
end;
 
procedure vezmi;
var i,y:integer;
    reg:registers;
begin
 for i:=10 to 70 do
  for y:=7 to 11 do begin
   gotoxy(i,y);
   reg.ah:=8;
   reg.bh:=0;
   intr($10,reg);
   strana[1,i,y]:=reg.ah;
   strana[2,i,y]:=reg.al;
   end;
end;
 
procedure poloz;
var i,y:integer;
    reg:registers;
begin
 for i:=11 to 70 do
  for y:=7 to 11 do begin
   gotoxy(i,y);
   reg.ah:=$9;
   reg.bh:=0;
   reg.al:=strana[2,i,y];
   reg.bl:=strana[1,i,y];
   reg.cx:=1;
   intr($10,reg);
   end;
end;
 
procedure writec(fp,fd:integer;s:string;dlz:integer);
var i,y:integer;
begin
i:=0;y:=0;
repeat
 i:=i+1;y:=y+1;
 if s[i]='^' then begin
     textcolor(fp);i:=i+1;
     write(s[i]);end
    else begin
     textcolor(fd);
     write(s[i]);end;
until (i>=length(s));
textcolor(fd);
for i:=y to dlz do write(' ');
end;
 
function Filnulou(w : Word) : String;
var  s:String;
begin
  Str(w:0,s);
  if Length(s) = 1 then s:='0'+s;
  Filnulou:=s;
end;
 
procedure vpaska(p:integer);
begin
 gotoxy(2,20);
 for i:=p-14 to p+63 do write(paska[i]);
end;
 
procedure inicialy(y1:integer);
var  h, m, s, hund : Word;
begin
 farba(lightgray,black);
 gettime(h,m,s,hund);
 gotoxy(34,23);
 write(Filnulou(h),':',Filnulou(m),':',Filnulou(s));
{ ss:=ss+1;}
 if ss<>s then begin re:=copy(re,2,length(re))+re[1];
                gotoxy(1,22);write(copy(re,1,80));
                ss:=s;
               end;
 getdate(h,m,s,hund);
 gotoxy(17,23);
 write(Filnulou(s),':',Filnulou(m),':',Filnulou(h));
 gotoxy(6,23);
 if y1=0 then write(y:4)
         else write(y1:4);
end;
 
 
procedure okno(y,yr,f:integer);
var xv,yv:integer;
begin
 textbackground(f);textcolor(yellow);
 xv:=3+round(13*int((yr-1)/18));yv:=round(yr-18*int(yr/18));
 if yv=0 then yv:=18;
 gotoxy(xv,yv);
 write(edit[y]);
end;
 
procedure allvypis(y:integer);
begin
 for i:=1 to 108 do okno(y+i-1,i,blue);
end;
 
procedure oprav;
begin
 window(1,1,80,25);
 farba(blue,yellow);
 gotoxy(36,2);write(' ',meno,copy('           ',1,11-length(meno)));
 farba(lightgray,black);
 gotoxy(49,25);write(' ',meno,copy('           ',1,11-length(meno)));
 window(1,3,80,25);
end;
 
procedure save;
var i:integer;
    men:string;
begin
 vezmi;
 farba(lightgray,black);
 open_win(16,9,64,13,' Save ',1);
 gotoxy(11,1);write('Napis mi meno tvojho dristu');
 men:=tread(19,2,11,meno,#0,#0);
 window(1,3,80,25);
 poloz;
 if men='' then exit;
 assign(f,men);
 rewrite(f);
 for i:=1 to 1024 do write(f,paska[i]);
 for i:=1 to 1024 do
  if edit[i][1]<>' ' then begin
     write(f,chr(i div 256));write(f,chr(i mod 256));
     write(f,edit[i]);
     end;
 close(f);
 meno:=men;
 oprav;
end;
 
function valu(sh:string):integer;
var v,i:integer;
begin
 val(sh,v,i);
 while ((i<>0) and (sh<>'')) do begin delete(sh,i,1);
                       val(sh,v,i);end;
 valu:=v;
end;
 
procedure load(ak:integer);
var i,y:integer;
    ch:char;
    s:string[11];
    men:string;
    dir:searchrec;
begin
 vezmi;men:=meno;
 farba(lightgray,black);
 if ak<>0 then begin
  open_win(16,9,64,13,' Load ',1);
  gotoxy(7,1);write('Ako sa vola program, ktory mam nahrat');
  men:=tread(19,2,11,meno,#0,#0);
  window(1,3,80,25);
  end;
 textcolor(yellow);
 poloz;
 if men='' then exit;
 {$I-}
 assign(f,men);
 reset(f);
 {$I+}
 if ioresult<>0 then begin
    vezmi;
    farba(lightgray,black);
    open_win(16,9,64,12,' Ty error ',1);
    gotoxy(11,1);write('No ale ',men,' neexistuje.');
    repeat until (readkey in [#27,#32,#13]);
    window(1,3,80,25);
    poloz;
    textcolor(yellow);
    exit;
    end;
 for i:=1 to 1024 do edit[i]:='           ';
 for i:=1 to 1024 do begin inx[i,1]:=0;inx[i,2]:=0;end;
 for i:=1 to 1024 do read(f,paska[i]);
 findfirst(men,archive,dir);
 for i:=1 to (dir.size-1024) div 13 do begin
  read(f,ch);y:=ord(ch);
  read(f,ch);y:=y*256+ord(ch);
  read(f,s);edit[y]:=s;
  if edit[y][1]<>#16 then begin
    inx[y,1]:=valu(copy(edit[y],2,3));
    inx[y,2]:=valu(copy(edit[y],9,3));
    end;
  end;
 close(f);
 pp:=1;
 if ak<>0 then begin allvypis(1);
               okno(1,1,cyan);farba(blue,yellow);
               vpaska(pp);oprav;
               end;
 meno:=men;
end;
 
procedure edit_paska;
var ch:char;
begin
 textbackground(lightgray);
 vpaska(pp);
 repeat
  inicialy(pp);
  if keypressed then begin ch:=readkey;
   if ch=#0 then case readkey of
     #75:begin pp:=pp-1;if pp<1 then pp:=1;vpaska(pp);end;
     #77:begin pp:=pp+1;if pp>1024 then pp:=1024;vpaska(pp);end;
     #71:begin pp:=1;vpaska(pp);end;
     #79:begin pp:=pp+78;if pp>1024 then pp:=1024;
               vpaska(pp);end;
     end;
   if ch=#32 then begin for i:=1 to 1024 do paska[i]:='B';
                  pp:=1;end;
   if ch in ['!'..'z'] then begin
    paska[pp]:=ch;
    pp:=pp+1;if pp>1024 then pp:=1024;
    vpaska(pp);
    gotoxy(16,20);
    end;
   end;
 until (ch in [#13,#27,#32]);
 farba(blue,yellow);vpaska(pp);
end;
 
procedure krak;
begin
 farba(lightgray,black);
 open_win(20,9,58,13,' No krak !!! ',1);
 gotoxy(2,1);write('        Nelegalna kopia. ');
 gotoxy(2,2);write('  Radsej si program kup u TRSEKa,');
 gotoxy(2,3);write('     alebo jeho distributorov');
 delay(1400);
 repeat until keypressed;
 halt(1);
end;
 
procedure run(pr:integer);
var ns,nsr,i,is,akt:integer;
    vykon:boolean;
begin
if not(ok) then krak;
akt:=999;ns:=y;nsr:=yr;is:=y;ch:=#31;
for i:=1 to 1024 do if (akt>inx[i,1]) and (inx[i,1]<>0) then akt:=inx[i,1];
repeat
 vykon:=true;
 for i:=1 to 1024 do begin
  if ((inx[i,1]=akt) and not (ch in [#27,#13,#32])) then
     if edit[i][5]=paska[pp] then begin
        inicialy(pp);ss:=ss+3;
        vykon:=false;
        if (not(pr=0) and ((is-y+yr)>0) and ((is-y+yr)<109)) then okno(is,is-y+yr,blue);
        if (not(pr=0) and ((i-y+yr)>0) and ((i-y+yr)<109)) then okno(i,i-y+yr,cyan)
                      else if not(pr=0) then begin y:=i-8;
                           if y<1 then y:=1;
                           allvypis(y);yr:=i-y+1;
                           okno(i,yr,cyan);end;
        case edit[i][6] of
         'R':begin pp:=pp+1;if pp>1024 then pp:=1;end;
         'r':begin pp:=pp+1;if pp>1024 then pp:=1;end;
         'L':begin pp:=pp-1;if pp<1 then pp:=1024;end;
         'l':begin pp:=pp-1;if pp<1 then pp:=1024;end;
        else paska[pp]:=edit[i][6];
        end;
        farba(blue,yellow);vpaska(pp);akt:=inx[i,2];
        is:=i;if pr=1 then begin delay(150);ss:=ss+55;end;
        if keypressed then ch:=readkey;
        if pr=2 then repeat inicialy(i);
                     ch:=#31;
                     if keypressed then ch:=readkey;
                     until (ch in [#65,#27,#13,#32]);
       end;
    end;
until vykon;
y:=ns;yr:=nsr;
allvypis(y-yr+1);
okno(y,yr,cyan);
vezmi;
farba(lightgray,black);
open_win(16,9,64,12,' Finis ',1);
gotoxy(6,1);write('Program skoncil. Dufam, ze si spokojny.');
window(1,3,80,25);
textcolor(yellow);
repeat until (readkey in [#27,#13]);
poloz;ch:=#31;
end;
 
procedure pisem(y,yr:integer);
var xv,yv,i,p:integer;
    von:boolean;
begin
 if ch=#13 then exit;
 xv:=3+round(13*int((yr-1)/18));yv:=round(yr-18*int(yr/18));
 if yv=0 then yv:=18;
 textbackground(lightgray);
 gotoxy(xv,yv);write(edit[y]);
 von:=false;
 if ch in ['0'..'9'] then begin gotoxy(xv,yv);inx[y,1]:=ord(ch)-48;
          inx[y,2]:=0;
          edit[y]:='q'+ch+'     q   ';write(edit[y]);i:=2;end
     else begin
          if ch in [#32] then begin edit[y]:='           ';
               von:=true;inx[y,1]:=0;inx[y,2]:=0;end
             else begin edit[y]:=chr(16)+ch;
                  gotoxy(xv,yv);write(chr(16),ch,'         ');
                  gotoxy(xv+2,yv);
                  repeat
                   if keypressed then begin ch:=readkey;
                      if ord(ch) in [27,13,32,59..68,72,80,77,75,73,81] then von:=true
                         else begin edit[y]:=edit[y]+ch;
                              write(ch);end;
                      end;
                  until (von or (length(edit[y])>10));
                  von:=true;
                  edit[y]:=edit[y]+copy('           ',1,11-length(edit[y]));
                  end;
                 end;
 repeat
  if keypressed then begin
       ch:=readkey;
       if (ch in ['0'..'9']) and (i<4) then
              begin inx[y,1]:=inx[y,1]*10+ord(ch)-48;
              edit[y]:=copy(edit[y],1,i)+ch+copy(edit[y],i+2,12-i);
              gotoxy(xv,yv);write(edit[y]);i:=i+1;end;
       if ((ch in ['!'..'/',':'..'z']) or (ch in shifz)) and (i<6) then
              begin if i<5 then i:=4;
              if ch in shifz then for p:=0 to 9 do if shiftz[p]=ch then ch:=chr(p+48);
              edit[y]:=copy(edit[y],1,i)+ch+copy(edit[y],i+2,12-i);
              gotoxy(xv,yv);write(edit[y]);i:=i+1;ch:=#31;end;
       if (ch in ['0'..'9']) and (i>5) then
              begin if i<9 then begin i:=8;end;
              inx[y,2]:=inx[y,2]*10+ord(ch)-48;
              edit[y]:=copy(edit[y],1,i)+ch+copy(edit[y],i+2,12-i);
              gotoxy(xv,yv);write(edit[y]);i:=i+1;end;
       if ord(ch) in [27,13,32,59..68,72,80,77,75,73,81] then begin
             if i<9 then edit[y]:='           ';
             von:=true;
             end;
       end;
  inicialy(0);
 until ((i>10) or von);
 farba(cyan,yellow);
 gotoxy(xv,yv);write(edit[y]);
end;
 
procedure anonie(an:boolean);
begin
 if an then textbackground(green)
       else textbackground(lightgray);
 gotoxy(15,2);
 if an then write(chr(16),' Ano ',chr(17))
       else write('  Ano  ');
 if an then textbackground(lightgray)
       else textbackground(green);
 gotoxy(24,2);
 if an then write('  Nie  ')
       else write(chr(16),' Nie ',chr(17));
end;
 
procedure talkend;
var yes:boolean;
    s:string;
begin
 vezmi;
 farba(lightgray,black);
 open_win(16,9,64,12,' A co teraz ??? ',1);
 gotoxy(9,1);write('Chces naozaj ukoncit pracu !?');
 anonie(false);yes:=false;
 repeat
  ch:=readkey;
  if ch=#75 then begin anonie(true); yes:=true;end;
  if (ch=#77) or (ch=#27) then begin anonie(false);yes:=false;end;
 until ((ch=#13) or (ch=#27));
 if yes then begin
    window(1,1,80,25);farba(black,white);
    lowvideo;clrscr;
    s:='xEEEyEwExEjEpEEEExQEyEV]QESpQEuQU]WVW';
    for i:=1 to length(s) do s[i]:=chr(ord(s[i])-37);
    farba(blue,yellow);
    write(s);
    farba(black,white);
    halt(0);end;
 ch:=#31;
 window(1,3,80,25);
 poloz;
end;
 
procedure help;
var ch:char;
begin
 open_win(2,3,78,20,' Help ',1);
 writeln('  Simulator  Turingovho stroja je plne automatizovany.');
 writeln('  Parametre: najvyssi index tzv. q je az 999');
 writeln('          v editore moze byt az 1024 zapisov');
 writeln('          dlzka pasky je 1024 znakov');
 writeln('  Editor: pracuje na principe sipok (vlavo, vpravo, hore,dole,PgUp,PgDn)');
 writeln('          medzi jeho zvlastnosti patri to,ze pre indexovanie treba pisat');
 writeln('          najprv cislo ( q dava automaticky). Potom,  pre  zadanie znaku');
 writeln('          aky ma hladat je  potrebne  pisat  pismeno  "a"  az "z"  alebo ');
 writeln('          shift+"0" az "9" po napisani dvoch znakov je treba znova zadat');
 writeln('          cisla. V pripade spatneho zadania nebude prikaz brany do uvahy.');
 writeln('          Ak zacnete pisat iba  pismena, bude  to povazovat  za komentar');
 writeln('          Stlacenim medzery sa riadok vymaze.');
 writeln('  U moznosti paska je pohyb sipkamy a klavesami Home, End, ESC, Enter.');
 writeln('  Ostatne prikazy su intuitivne jasne zo znamych softwarov (napr. Pascal)');
 writeln('                                           TRSEK Vas rodinny programator.');
 repeat
  if keypressed then ch:=readkey;
 until (ch in [#27,#13]);
 window(2,3,78,20);
 farba(blue,yellow);clrscr;
 window(1,3,80,25);
 allvypis(y);
 okno(y,yr,cyan);
end;
 
function kontrola:boolean;
var dir:searchrec;
begin
 findfirst('*.*',volumeid,dir);
 if length(dir.name)<4 then begin kontrola:=false;exit;end;
 if lock=dir.name then kontrola:=true
                  else kontrola:=false;
end;
 
 
BEGIN
   re:='xEEyEEEEE{EuhE}yTfyESEf_EEx';
re:=re+'SEErEE_EExQEyEV]QESpQEuQEux';
re:=re+'hEU]WVWSE{EEEEEESEEEywxjpE{EE';
re:=re+'EEE';
lock:='';
for i:=1 to 4 do lock[i]:=chr(ord(lock[i])-100);
ok:=false;
for i:=1 to length(re) do re[i]:=chr(ord(re[i])-37);
for i:=1 to 1024 do edit[i]:='           ';
for i:=1 to 1024 do begin inx[i,1]:=0;inx[i,2]:=0;end;
for i:=-15 to 1102 do paska[i]:=' ';
for i:=1 to 1024 do paska[i]:='B';
farba(magenta,yellow);pp:=1;
ok:=kontrola;
clrscr;
uvod;
farba(blue,yellow);
if paramcount>0 then begin meno:=paramstr(1);load(0);end
                else meno:='NONAME.TUR';
if paramcount>1 then if paramstr(2)='/l:'+lock then ok:=true;
for i:=1 to length(meno) do meno[i]:=upcase(meno[i]);
if copy(meno,length(meno)-2,3)<>'TUR' then meno:='NONAME.TUR';
open_win(1,2,80,23,meno,1);
window(1,1,80,25);
gotoxy(1,21);
write(' ',chr(31),'  Paska ͹');
gotoxy(16,22);
for i:=1 to 64 do write(paska[i]);
farba(lightgray,black);
gotoxy(1,1);writec(red,black,'^F1-Help  ^F2-Save  ^F3-Load  ^F4-Paska  ^F5-Run  ^F6-SlowRun  ^F7-Step  ^F10-Exit ',79);
gotoxy(1,25);write('                                                                               ');
gotoxy(1,25);writec(red,black,'^L^i^n^e 1     ^D^a^t^e             ^T^i^m^e            ^F^i^l^e '+meno,78);
window(1,3,80,25);
y:=1;yr:=1;ss:=0;ch:=#12;
inicialy(0);allvypis(y);okno(y,yr,cyan);
{kontrola kraknuta samotnym autorom }
{if not(ok) then krak;}
repeat
 inicialy(0);
 if keypressed then begin ch:=readkey;
  if not (ord(ch) in [0,27,59..68]) then begin pisem(y,yr);
         okno(y,yr,blue);y:=y+1;yr:=yr+1;
         if yr>108 then begin yr:=108;y:=y+8;
                       if y>1024 then y:=1024;
                       allvypis(y-107);end;
         okno(y,yr,cyan);end;
  if ch=#27 then talkend;
  if ch=#0 then case readkey of
    #72:begin okno(y,yr,blue);y:=y-1;yr:=yr-1;
         if yr<1 then begin yr:=1;y:=y-18;
                       if y<1 then y:=1;
                       allvypis(y);end;
         okno(y,yr,cyan);end;
    #80:begin okno(y,yr,blue);y:=y+1;yr:=yr+1;
         if yr>108 then begin yr:=108;y:=y+8;
                       if y>1024 then y:=1024;
                       allvypis(y-107);end;
         okno(y,yr,cyan);end;
    #75:begin okno(y,yr,blue);
         if yr>18 then begin yr:=yr-18;y:=y-18;end;
         okno(y,yr,cyan);end;
    #77:begin okno(y,yr,blue);
         if yr<91 then begin yr:=yr+18;y:=y+18;end;
         okno(y,yr,cyan);end;
    #73:begin okno(y,yr,blue);y:=y-108;
         if y<108 then begin y:=1;yr:=1;end;
         allvypis(y-yr+1);
         okno(y,yr,cyan);end;
    #81:begin okno(y,yr,blue);y:=y+108;
         if (y-yr+1)>916 then begin y:=1024;yr:=108;end;
         allvypis(y-yr+1);
         okno(y,yr,cyan);end;
    #82:begin for i:=1024 downto y+1 do begin edit[i]:=edit[i-1];
                   inx[i,1]:=inx[i-1,1];inx[i,2]:=inx[i-1,2];
                   end;
        edit[y]:='           ';inx[y,1]:=0;inx[y,2]:=0;
        allvypis(y-yr+1);okno(y,yr,cyan);end;
    #83:begin for i:=y to 1023 do begin edit[i]:=edit[i+1];
                   inx[i,1]:=inx[i+1,1];inx[i,2]:=inx[i+1,2];
                   end;
        edit[1024]:='           ';inx[1024,1]:=0;inx[1024,2]:=0;
        if (y-yr+1)>916 then begin y:=1024;yr:=108;end;
        allvypis(y-yr+1);okno(y,yr,cyan);end;
    #59:help;
    #60:save;
    #61:begin load(1);okno(y,yr,blue);y:=1;yr:=1;okno(y,yr,cyan);end;
    #62:edit_paska;
    #63:run(0);
    #64:run(1);
    #65:run(2);
    #68:talkend;
    end;
  end;
until (ch=#27);
END.