1 Ostatnio edytowany przez Cosi (2008-07-13 11:31:42)

Moja pierwsza wprawka w CC65 - interpreter języka Brainfuck. Ciekawe, że nikt dotąd nie przeniósł tego niezwykłego języka na Atari ;)

Interpreter z kilkoma przykładami (.atr)

A tutaj źródła programu. Będę niezmiernie wdzięczny za wszelką konstruktywną krytykę, bo w C na razie mocno raczkuję.
Pozdrowienia

// uaktualnienie: 10.07.2008
* zagnieżdżanie pętli
// uaktualnienie: 13.07.2008
* "case-insensitivity" przy pobieraniu nazwy pliku

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

2

Ja mam jedną uwagę. Zamiast otwierać "K:" po prostu czytaj z stdin.

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

3

Racja, też można. Tylko wtedy pobierane znaki będą się wyświetlały na ekranie :( No chyba że masz na myśli coś innego niż getchar()
Na pewno czytanie z stdin pozwoliłoby łatwiej przenieść program na inną platformę.

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

4

Ale to przecież nic złego, że będą się wyświetlać.

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

5 Ostatnio edytowany przez Cosi (2008-06-16 11:00:02)

Nie wiem czy to będzie zgodne z konwencją Brainfucka ;) Na przykład program PRINTER.BF nie będzie działał prawidłowo. Pomyślałem, że można by zrobić funkcję getkey(), która domyślnie by pobierała znak z K:, a w razie np. przenoszenia kodu można by ją łatwo podmienić.
W każdym razie wielkie dzięki epi za radę.
PS. Można by też zrobić to za pomocą PEEK'a, odczytującego kod naciśniętego klawisza. Chyba najbardziej optymalne rozwiązanie.

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

6

Super język. :) Niestety ta implementacja jest niepełna - nie umożliwia zagnieżdżania pętli [ ].
Poza tym "% 255" generuje sporo zupełnie niepotrzebnego kodu.

https://www.youtube.com/watch?v=jofNR_WkoCE

7

Podobnych, dziwnych jezykow jest wiecej: http://pl.wikipedia.org/wiki/Ezoteryczn … gramowania
Czasem mam wrazenie, ze duza ich czesc jest wymyslona przez studentow na zaliczenie.

8

Od razu mówię że ja z nimi nie mam nic wspólnego! :)

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

9 Ostatnio edytowany przez Cosi (2008-06-17 08:11:45)

Fox: a czy (bp & 255) będzie bardziej optymalne?
PS. Nie wiedziałem, że Brainfuck dopuszcza zagnieżdżanie. Zrobi się :) Wystarczy jedna tablica jako "stos".

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

10

Nie tylko dużo bardziej optymalne, ale znaczy też coś innego, tj. to co "bp % 256".
Jednak przy zapisie do typu "char" żadne z nich nie jest potrzebne, bo i tak zostanie zapisane tylko najmłodsze 8 bitów. Można natomiast dać "(char) bp", aby uniknąć ewentualnych ostrzeżeń kompilatora.

Można się obejść bez stosu - przy przesuwaniu "i" omijać pary "[ ]". Jednak ze stosem powinno działać szybciej.

https://www.youtube.com/watch?v=jofNR_WkoCE

11

Dzięki, Fox. Jeżeli (char) bp obetnie starszy bajt i uniknie się śmiecenia w tej tablicy, to to chyba będzie najlepsze rozwiązanie (maszynowo to chyba będzie operacja na jednym bajcie). Przed dodaniem tego modulo na końcu tablicy miałem jeden albo dwa bajty śmieci.
bp % 255 to oczywiście pomyłka, miało być % 256 ;)

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio

12

Z czy bez "(char)" powinno działać tak samo. Ustawiasz element tablicy bajtów, a więc jeden bajt.

Jeśli chodzi o śmiecenie, to śmieci tutaj gets(nazwa) i to z dwóch powodów:
1. Oczekuje ona adresu bufora, a nie niezainicjalizowanego wskaźnika.
2. Funkcji tej wcale nie powinno się używać, bo nie przyjmuje ona długości bufora. Należy używać fgets().

https://www.youtube.com/watch?v=jofNR_WkoCE

13

Faktycznie, działa bez problemów. Jeszcze raz dziękuję.
Chyba generalnie na Atari lepiej nie używać dynamicznych tablic. Ech, przyzwyczaił się człowiek do wygodnego programowania... ;)

800 XE + CA 2001; Portfolio; 1040 STfm; Lynx II
Psion Organiser II XP, LZ64; Series 3a, 3c, 5mx; Siena; Workabout; HP 95LX, 200LX, 620LX; Amiga 1200; Amstrad NC100, NC200; Game Boy Color
http://palmtop.cosi.com.pl -- nie tylko o Atari Portfolio