Autor Wątek: Kompilator Pascala pod CP/J  (Przeczytany 5453 razy)

pgru

  • *****
  • Wiadomości: 638
Kompilator Pascala pod CP/J
« dnia: 2018.01.18, 21:51:15 »
Hmm właśnie próbuję skompilować starą, prostą dosową grę tekstową. Skompilowała się pod Linuxem przy użyciu FreePascala. Po poprawieniu ostrzeżeń pod CP/J widzę włąsnie różnokolorowe kwadraciki na zmianę z ekranem nieco pomieszanym kompilatora. Może to głupie ale czy to oznacza, że kompilator "kompiluje" i po prostu jest to dość wolne na tym komputerze czy błąd?

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #1 dnia: 2018.01.18, 21:54:48 »
A mógłbyś załączyć screenshot oraz listing tego programu? Byłoby łatwiej zdiagnozować problem.

pgru

  • *****
  • Wiadomości: 638
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #2 dnia: 2018.01.18, 22:21:54 »
Trochę się wstydzę jeśli chodzi o kod źródłowy (stary odkopany program), ale załączę:
program wisielec;
VAR n,li_zbior,li_slow,num_slo,z,blad,punkty:INTEGER;
    znak:CHAR;
    zbior:TEXT;
    linia,hasloOdg,odgadn:STRING[41];
    literaOdg,literaZna,kodok:STRING[2];
    r,m,d,dt :REAL;
procedure ustawienia;
begin
assign(zbior,'USTAWI.WIS');
reset(zbior);
readln(zbior,linia);
readln(zbior,linia);
readln(zbior,linia);
kodok:=Copy(linia,1,1);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_zbior,n);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_slow,n);
close(zbior);
n:=0;
end;
procedure punkciak;
begin
assign(zbior,'PUNKTY.WIS');
{rewrite(zbior);
GetDate(r,m,d,dt);
n:=d;
blad:=m;
Str(n,odgadn);
Str(blad,hasloOdg);
linia:=Concat(odgadn,'-',hasloOdg);
n:=r;
Str(n,odgadn);
linia:=Concat(linia,'-',odgadn);
writeln(zbior,linia);
Str(punkty,linia);}
writeln(zbior,linia);
close(zbior);
end;
procedure bledy;
begin
ClrScr;
Case blad of
0:
begin
writeln(' ');
writeln(' ');
writeln(' ');
end;
1:
begin
writeln(' ');
writeln('|');
writeln('|');
end;
2:
begin
writeln('___');
writeln('|  ');
writeln('|  ');
end;
3:
begin
writeln('___');
writeln('| |');
writeln('|  ');
end;
4:
begin
writeln('___');
writeln('| |');
writeln('| O');
writeln;
writeln('Niestety to juù koniec...');
punkty:=punkty-1;
odgadn:=linia
end;
end;
Writeln;
Writeln(odgadn);
Writeln;
end;
procedure litera;
begin
writeln('Podaj literå');
repeat until keypressed  ;
znak:=readkey;
literaOdg:=znak;
znak:=' ';
num_slo:=0;
for n:=1 to z DO
begin
literaZna:=Copy(linia,n,1);
if literaZna=literaOdg THEN
begin
Delete(odgadn,n,1);
Insert(literaOdg,odgadn,n);
num_slo:=num_slo+1
end;
end;
if num_slo=0 then blad:=blad+1;
end;
procedure haslo;
begin
Writeln('Podaj hasìo:');
readln(hasloOdg);
If hasloOdg=linia then odgadn:=linia else blad:=blad+1;
end;
procedure kodow_ODG;
begin
z:=length(linia);
odgadn:='';
for n:=1 to z DO
begin
Insert(kodok,odgadn,n);
end;
end;
procedure menu_wyboru;
begin
repeat
bledy;
If blad=4 then Exit;
IF odgadn=linia THEN
begin
punkty:=punkty+1;
Exit;
end;
writeln('[L] - Podajå literå [H] - Podajå hasìo [K] - Koniec');
repeat until keypressed;
repeat znak:=readkey until (znak='K') or (znak='H') or (znak='L');
CASE znak OF
'L': litera;
'H' : haslo;
end;
until znak='K'
end;
begin
znak:=' ';
blad:=0;
Punkty:=0;
ClrSCR;
Gotoxy(0,0);
writeln('Kompilacja - pgru 2018 dla Elwro 800 Jr');
writeln(' ');
writeln('Wisielec');
writeln(' ');
writeln('Informacja:');
writeln('Np. [a] - Start oznacza, ùe trzeba nacisnáã');
writeln('a, aby wykonaá operacjå, opisaná po myólniku');
writeln(' ');
ustawienia;
assign(zbior,'PUNKTY.WIS');
reset(zbior);
readln(zbior,linia);
Writeln('Ostatni wynik:');
Writeln('Data: ',linia);
readln(zbior,linia);
Writeln('Punkty: ',linia);
Val(linia,punkty,n);
close(zbior);
Writeln('Naciónij P aby zaczáã grå.');
repeat until keypressed;
repeat
Randomize;
repeat num_slo:=random(li_slow+1) until num_slo>0;
Randomize;
repeat n:=random(li_zbior+1) until n>0;
Str(n,linia);
linia:=Concat(linia,'.WIS');
 assign(zbior,linia);
 reset(zbior);
for n:=1 to num_slo DO readln(zbior,linia);
close(zbior);
kodow_ODG;
menu_wyboru;
punkciak;
blad:=0;
Writeln('Punkty: ', punkty);
Writeln('[S] - Grasz jeszcze raz, [W] - Wyjócie z gry');
repeat until keypressed;
repeat znak:=readkey until (znak='W') or (znak='S');
until (znak='W');
end.
Przełączyłem w opcjach kompilatora na kompilację pliku COM i w tej chwili nie ma błędów, ale zatrzymał się(znaczy miga kursorem) na(załączam scrn):

pgru

  • *****
  • Wiadomości: 638
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #3 dnia: 2018.01.19, 00:15:45 »
Hmm chyba doszedłem częściowo gdzie leży problem.
Zmodyfikowany program:
program wisielec;
VAR n,li_zbior,li_slow,num_slo,z,blad,punkty:INTEGER;
    znak:CHAR;
    zbior:TEXT;
    linia,hasloOdg,odgadn:STRING[41];
    literaOdg,literaZna,kodok:STRING[2];
    r,m,d,dt :REAL;
    klaw:text;
procedure ustawienia;
begin
Writeln('Procedura Ustawienia');
assign(klaw,'KBD:');
Writeln('Przypisano klawiature');
assign(zbior,'USTAWI.WIS');
Writeln('Przypisano USTAWI.WIS');
reset(zbior);
readln(zbior,linia);
readln(zbior,linia);
readln(zbior,linia);
kodok:=Copy(linia,1,1);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_zbior,n);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_slow,n);
close(zbior);
Writeln('Zamknieto USTAWI.WIS');
n:=1;
end;
procedure readkey2;
begin
{writeln('Poczatek procedury readkey2');}
read(klaw,znak);{wersja dla starszego Pascala}
{znak:=readkey;}{wersja dla nowszego Pascala(co najmniej od Turbo Pascala 5.0, wymaga uzywania na poczatku uses crt;}
{writeln('Koniec procedury readkey2');}
end;
procedure punkciak;
begin
writeln('procedura punkciak');
assign(zbior,'PUNKTY.WIS');
rewrite(zbior);
{GetDate(r,m,d,dt);
n:=d;
blad:=m;
Str(n,odgadn);
Str(blad,hasloOdg);
linia:=Concat(odgadn,'-',hasloOdg);
n:=r;
Str(n,odgadn);
linia:=Concat(linia,'-',odgadn);
writeln(zbior,linia);}
Str(punkty,linia);
writeln(zbior,linia);
close(zbior);
writeln('Koniec procedury punkciak');
end;
procedure bledy;
begin
{ClrSCR;}
Case blad of
0:
begin
writeln(' ');
writeln(' ');
writeln(' ');
end;
1:
begin
writeln(' ');
writeln('|');
writeln('|');
end;
2:
begin
writeln('___');
writeln('|  ');
writeln('|  ');
end;
3:
begin
writeln('___');
writeln('| |');
writeln('|  ');
end;
4:
begin
writeln('___');
writeln('| |');
writeln('| O');
writeln;
writeln('Niestety to juù koniec...');
punkty:=punkty-1;
odgadn:=linia
end;
end;
Writeln;
Writeln(odgadn);
Writeln;
end;
procedure litera;
begin
writeln('Podaj literå');
{repeat until KeyPressed  ;}
readkey2;
literaOdg:=znak;
znak:=' ';
num_slo:=0;
for n:=1 to z DO
begin
literaZna:=Copy(linia,n,1);
if literaZna=literaOdg THEN
begin
Delete(odgadn,n,1);
Insert(literaOdg,odgadn,n);
num_slo:=num_slo+1
end;
end;
if num_slo=0 then blad:=blad+1;
end;
procedure haslo;
begin
Writeln('Podaj hasìo:');
readln(hasloOdg);
If hasloOdg=linia then odgadn:=linia else blad:=blad+1;
end;
procedure kodow_ODG;
begin
z:=length(linia);
odgadn:='';
for n:=1 to z DO
begin
Insert(kodok,odgadn,n);
end;
end;
procedure menu_wyboru;
begin
repeat
bledy;
If blad=4 then Exit;
IF odgadn=linia THEN
begin
punkty:=punkty+1;
Exit;
end;
writeln('[L] - Podajå literå [H] - Podajå hasìo [K] - Koniec');
{repeat until KeyPressed;}
repeat
begin

readkey2;

end;
until (znak='K') or (znak='H') or (znak='L');

CASE znak OF
'L': litera;
'H' : haslo;
end;
until znak='K'
end;
begin
znak:=' ';
blad:=0;
Punkty:=0;
{ClrSCR;}
{Gotoxy(0,0);}
writeln('Kompilacja - pgru 2018 dla Elwro 800 Jr');
writeln(' ');
writeln('Wisielec');
writeln(' ');
writeln('Informacja:');
writeln('Np. [a] - Start oznacza, ùe trzeba nacisnáã');
writeln('a, aby wykonaá operacjå, opisaná po myólniku');
writeln(' ');
ustawienia;{xy}
writeln('Wczytano ustawienia');
assign(zbior,'PUNKTY.WIS');
reset(zbior);
readln(zbior,linia);
Writeln('Ostatni wynik:');
Writeln('Data: ',linia);
readln(zbior,linia);
Writeln('Punkty: ',linia);
Val(linia,punkty,n);
close(zbior);
Writeln('Naciónij P aby zaczáã grå.');
{repeat until KeyPressed;}
repeat
Randomize;
repeat num_slo:=random(li_slow+1) until num_slo>0;
Randomize;
repeat n:=random(li_zbior+1) until n>0;
Str(n,linia);
linia:=Concat(linia,'.WIS');
 assign(zbior,linia);
 reset(zbior);
for n:=1 to num_slo DO readln(zbior,linia);
close(zbior);
kodow_ODG;
menu_wyboru;
punkciak;
blad:=0;
Writeln('Punkty: ', punkty);
Writeln('[S] - Grasz jeszcze raz, [W] - Wyjócie z gry');
{repeat until KeyPressed;}
repeat readkey2 until (znak='W') or (znak='S');
until (znak='W');
end.
Teraz po ustawieniu odpowienio kompilacji(na .com) kompiluje się dość szybko ale nie podoba mu się linia read(klaw,znak);
Wygląda więc na to, że nie da się użyć jak w nowszych Pascalach(podobno od TurboPascala 5.0 co najmniej w górę) znak:=readkey; tylko trzeba to uzyskać w archaiczny sposób.


pgru

  • *****
  • Wiadomości: 638
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #4 dnia: 2018.01.19, 01:08:56 »
Przeszukałem co się dało, popróbowałem  - łącznie z książka Jana Bieleckiego TurboPascal i Reference Manual Turbo Pascal Version 3.0 i sposobem na uzyskanie znaku z klawiatury powinna być funkcja Read(c) , gdzie c to zmienna znakowa(CHAR). Dlaczego zwraca Błąd 66: operacje we/wy nie są tu dozwolone to nie wiem...

pgru

  • *****
  • Wiadomości: 638
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #5 dnia: 2018.01.19, 02:04:48 »
Po małych zmianach dochodzi do 48 i się zatrzymuje :-( .  Czyżby to było jakieś przepełnienie kompilatora? W sumie to chyba by pokazywało braki w Ramie skoro taki prosty program się nie chce skompilować. Kod programu:
program wisielec;
VAR n,li_zbior,li_slow,num_slo,z,blad,punkty:INTEGER;
    znak:CHAR;
    zbior:TEXT;
    linia,hasloOdg,odgadn:STRING[41];
    literaOdg,literaZna,kodok:STRING[2];
    r,m,d,dt :REAL;
    klaw:text;
procedure ustawienia;
begin
Writeln('Procedura Ustawienia');
{assign(klaw,'KBD:');
Writeln('Przypisano klawiature');}
assign(zbior,'USTAWI.WIS');
Writeln('Przypisano USTAWI.WIS');
reset(zbior);
readln(zbior,linia);
readln(zbior,linia);
readln(zbior,linia);
kodok:=Copy(linia,1,1);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_zbior,n);
readln(zbior,linia);
readln(zbior,linia);
Val(linia,li_slow,n);
close(zbior);
Writeln('Zamknieto USTAWI.WIS');
n:=1;
end;
{procedure readkey2;
begin}
{writeln('Poczatek procedury Read(znak)');}
{Write(Output,'Hello World');
Read(znak);}{wersja dla starszego Pascala}
{znak:=readkey;}{wersja dla nowszego Pascala(co najmniej od Turbo Pascala 5.0, wymaga uzywania na poczatku uses crt;}
{writeln('Koniec procedury Read(znak)');}
{end;}
procedure punkciak;
begin
{punkciak uproszczony - przepelnienie kompilatora}
n:=1;
blad:=1;
Str(n,odgadn);
Str(blad,hasloOdg);
linia:=Concat(odgadn,'-',hasloOdg);
{n:=1;
Str(n,odgadn);
linia:=Concat(linia,'-',odgadn);}
end;
procedure bledy;
begin
{ClrSCR;}
Case blad of
0:
begin
writeln(' ');
writeln(' ');
writeln(' ');
end;
1:
begin
writeln(' ');
writeln('|');
writeln('|');
end;
2:
begin
writeln('___');
writeln('|  ');
writeln('|  ');
end;
3:
begin
writeln('___');
writeln('| |');
writeln('|  ');
end;
4:
begin
writeln('___');
writeln('| |');
writeln('| O');
writeln;
writeln('Niestety to juù koniec...');
punkty:=punkty-1;
odgadn:=linia
end;
end;
Writeln;
Writeln(odgadn);
Writeln;
end;
procedure litera;
begin
writeln('Podaj literå');
{repeat until KeyPressed  ;}
Read(znak);
literaOdg:=znak;
znak:=' ';
num_slo:=0;
for n:=1 to z DO
begin
literaZna:=Copy(linia,n,1);
if literaZna=literaOdg THEN
begin
Delete(odgadn,n,1);
Insert(literaOdg,odgadn,n);
num_slo:=num_slo+1
end;
end;
if num_slo=0 then blad:=blad+1;
end;
procedure haslo;
begin
Writeln('Podaj hasìo:');
readln(hasloOdg);
If hasloOdg=linia then odgadn:=linia else blad:=blad+1;
end;
procedure kodow_ODG;
begin
z:=length(linia);
odgadn:='';
for n:=1 to z DO
begin
Insert(kodok,odgadn,n);
end;
end;
procedure menu_wyboru;
begin
repeat
bledy;
If blad=4 then Exit;
IF odgadn=linia THEN
begin
punkty:=punkty+1;
Exit;
end;
writeln('[L] - Podajå literå [H] - Podajå hasìo [K] - Koniec');
{repeat until KeyPressed;}
repeat
begin

Read(znak);

end;
until (znak='K') or (znak='H') or (znak='L');

CASE znak OF
'L': litera;
'H' : haslo;
end;
until znak='K'
end;
begin
znak:=' ';
blad:=0;
Punkty:=0;
{ClrSCR;}
{Gotoxy(0,0);}
writeln('Kompilacja - pgru 2018 dla Elwro 800 Jr');
writeln(' ');
writeln('Wisielec');
writeln(' ');
writeln('Informacja:');
writeln('Np. [a] - Start oznacza, ùe trzeba nacisnáã');
writeln('a, aby wykonaá operacjå, opisaná po myólniku');
writeln(' ');
ustawienia;{xy}
writeln('Wczytano ustawienia');
assign(zbior,'PUNKTY.WIS');
reset(zbior);
readln(zbior,linia);
Writeln('Ostatni wynik:');
Writeln('Data: ',linia);
readln(zbior,linia);
Writeln('Punkty: ',linia);
Val(linia,punkty,n);
close(zbior);
Writeln('Naciónij P aby zaczáã grå.');
{repeat until KeyPressed;}
repeat
Randomize;
repeat num_slo:=random(li_slow+1) until num_slo>0;
Randomize;
repeat n:=random(li_zbior+1) until n>0;
Str(n,linia);
linia:=Concat(linia,'.WIS');
 assign(zbior,linia);
 reset(zbior);
for n:=1 to num_slo DO readln(zbior,linia);
close(zbior);
kodow_ODG;
menu_wyboru;
punkciak;
blad:=0;
Writeln('Punkty: ', punkty);
Writeln('[S] - Grasz jeszcze raz, [W] - Wyjócie z gry');
{repeat until KeyPressed;}
repeat Read(znak) until (znak='W') or (znak='S');
until (znak='W');
end.

pgru

  • *****
  • Wiadomości: 638
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #6 dnia: 2018.01.19, 02:17:29 »
Pod TurboPascalem 3.01A przy ustawionych 64 KB Ram program się bez problemu(202 linie) skompilował i działa. TurboPascal 3.01A jest zaskakująco podobny do kompilatora Pascala dla Elwro :-), aczkolwiek wynikowy jest chyba tylko dla DOSa...

Pod TurboPascalem dla CP/M (konkretnie wersja dla jakiegoś Kaypro), turbo Pascal uruchamia się pod CP/J, poprawnie kompiluje cały program. Uruchamia się tylko poprzez kompilację do pamięci(oczywiście brak znaków Elwro), plik wynikowy "com"  uruchamia się pod CP/J tylko nie ma najważniejszego - PL znaków :-(
« Ostatnia zmiana: 2018.01.19, 02:50:23 wysłana przez pgru »

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Kompilator Pascala pod CP/J
« Odpowiedź #7 dnia: 2018.01.19, 09:11:00 »
Gratuluje wytrwałości i finalnym skompilowaniu swojej gry!