1 Ostatnio edytowany przez UnDead (2022-05-30 12:25:25)

Hej!

Bawiąc się Atarynką, postanowiłem wklepać kilka przykładów w BASIC-u z jakiejś starej książki... i... uległem stanowi sporego zdziwienia, tym bardziej, że nigdy wcześniej o tym nie czytałem. Otóż, w przykładach tych znajdują się bloki danych w DATA, część z nich z komentarzami, np.:

130 READ A
[...]
1010 DATA 19,207,36:REM NUMBER OF SMTH....

i.. uruchomienie programu z :REM w linii zaczynającej się od DATA, kończy się błędem 8!
(Sprawdzałem w BASIC-u wersja B i C - w obu jest dokładnie tak samo).

Jestem w podwójnym szoku, gdyż:
- w innych odmianach BASIC-a, którymi się bawiłem, takie coś przechodzi bez problemu,
- jest to nieco niezgodne z ogólną definicją języka, wszak dwukropek rozdziela polecenia w linii - zawsze. A tu.. zonk. :(
- skoro taka konstrukcja pojawia się w wielu drukowanych przykładach, to co? Należy założyć, że autorzy tych publikacji nie sprawdzali czy ten kod działa?

Choć to drobiazg, ponieważ nigdzie o tym nie czytałem, a w Google też nie znalazłem nic ciekawego na ten temat, postanowiłem o tym napisać na forum - może się komuś przyda.

-U.

Co to jest? Co to jest?.... To przecież... Atari! :)

2 Ostatnio edytowany przez maw (2022-05-30 12:53:42)

Zrób w lini 130:

130 READ A$ 

zamiast READ A (nie zapomnij o rezerwacji miejsca dla A$) - zrozumiesz, co się stało.

Zachowanie odpowiada interpretacji bloku DATA dla Atari Basic.

Narzuca się inne pytanie: jak w liniach DATA przemycić do zmiennej PRZECINEK?

___
Press play on tape...

3 Ostatnio edytowany przez seban (2022-05-30 13:46:37)

w liniach data mogą być również kodowane ciągi znaków:

10 DIM S$(32)
20 DATA OZON,BOZON,DEUTER,TRYT
30 DATA 3:4,5:8,9:16,25:8
31 DATA ALA MA KOTA: REM -- OH NO!
40 TRAP 60
50 READ S$:? S$:GOTO 50
60 END

EDIT: dodałem screen-shot:
http://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=9197&download=0

W związku z tym na jakiej podstawie interpreter BASIC-a miałby decydować do jest daną tekstową a co komentarzem? na podstawi dwukropka? wtedy dwukropek byłbym zakazanym symbolem w ciągu danych, a to byłoby bezsensowne ograniczenie.

Prawdę mówiąc jestem zdziwiony tym iż mówisz ze są interpretery które dopuszczają coś takiego. No chyba że dana implementacja BASIC w liniach data nie dopuszcza stringów, to wtedy coś takiego mogło by być akceptowalne.

Post's attachments

ata_data_bas.png 3.96 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.

4

maw napisał/a:

Narzuca się inne pytanie: jak w liniach DATA przemycić do zmiennej PRZECINEK?

Ja robię to tak, że inny znak w foncie przypisuję jako przecinek - jakiś mało używany lub mi niepotrzebny (często jest to średnik, aby mi się nie myliło).

Sikor umarł...

5

seban napisał/a:

w liniach data mogą być również kodowane ciągi znaków:

[...]

W związku z tym na jakiej podstawie interpreter BASIC-a miałby decydować do jest daną tekstową a co komentarzem? na podstawi dwukropka? wtedy dwukropek byłbym zakazanym symbolem w ciągu danych, a to byłoby bezsensowne ograniczenie.

Ależ odpowiedź na to pytanie jest niezwykle prosta! Stringi w BASIC-u muszą znajdować się w "". Słowem, ":" to string, a : - już nie. I nie ma z tym żadnego problemu, nawet gdybyśmy napisali:

1010 DATA 200,"HERE:":REM COS TAM...

... to wszystko jest jasne i proste dla interpretera.

seban napisał/a:

Prawdę mówiąc jestem zdziwiony tym iż mówisz ze są interpretery które dopuszczają coś takiego. No chyba że dana implementacja BASIC w liniach data nie dopuszcza stringów, to wtedy coś takiego mogło by być akceptowalne.

No dobra... to weźmy takiego "wrażego" C64 i sprawdźmy, co zrobi z tym jego ubogi (w stosunku do ATARI BASIC-a) interpreter (załączam zrzucik).

-U

Post's attachments

data-c64.png 143.37 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
Co to jest? Co to jest?.... To przecież... Atari! :)

6 Ostatnio edytowany przez seban (2022-05-30 13:59:44)

Wiesz, wszystko ma swoje "zady i walety"... (screen-shot poniżej, widać go jak jesteś zalogowany)

http://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=9196&download=0

EDIT: ^^^ może doprecyzuję wypowiedź... bo zaraz jakiś flame-war się nam rozpęta, a nie o to mi chodzi... wiem że mogłem użyć cudzysłowów, ale chodziło mi o pokazanie niezgodności w obie strony. To że jedna implementacja języka różni się od tej na innej platformie jest całkiem zrozumiałe :) A ponieważ ja na BASIC-u C64 nie znam się kompletnie, to dla mnie zdziwienie budzi niemożność używania ":" lub konieczność używania " w przypadku zmiennych tekstowych :D Ciebie zdziwiła niemożliwość komentowania czy użycia ":" w liniach DATA ... a dla mnie to zupełnie naturalne :)


UnDead napisał/a:

Ależ odpowiedź na to pytanie jest niezwykle prosta! Stringi w BASIC-u muszą znajdować się w "". Słowem, ":" to string, a : - już nie. I nie ma z tym żadnego problemu, nawet gdybyśmy napisali:

Pamiętaj o tym że w tamtych czasach BASIC musiał się zmieścić w 8KB kości ROM, więc wszystkie te "smaczki" i różnice, wynikają z różnego podejścia autorów różnych interpreterów, to optymalizacji i skracania ich kodu. Dodatkowo użycie " powoduje że oprócz przecinków nie możesz używać znaku cudzysłowu. A więc znowu coś kosztem czegoś.

Prawdę mówiąc wolę tak jak jest w Atari BASIC, ponieważ nie bardzo rozumiem po komentować coś na końcu linii DATA, to jest po prostu mało czytelne, nie lepiej pisać po prostu:

10 REM --- dane wyssane z palca ---
20 DATA 10,20,30,OZON, BOZON, 1,2,3,4,8,-16,-32,3.14519

EDIT2: Ale ta cała dyskusja to jest czysto akademicka i nie ma wydaje się że teoretycznie najmniejszego sensu :) Bo skoro znasz dany dialekt/interpreter to będziesz widział co zrobić w razie napotkania takich kwiatków przy przenoszeniu programów z innych platform. A jeżeli ktoś nie wiedział (np. tak jak ja że w C64 BASIC tak można) to już wie... właśnie dzięki temu że poruszyłeś ten temat na forum! :)

Post's attachments

c64_data.png 12.27 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.

7

seban napisał/a:

Ale ta cała dyskusja to jest czysto akademicka i nie ma najmniejszego sensu :) Bo skoro znasz dany dialekt/interpreter to będziesz widział co zrobić w razie napotkania takich kwiatków przy przenoszeniu programów z innych platform.

Owszem - ogólnie - True. :)

Niemniej, na Amstradzie też działa, Spectrum nie chce mi się odpalać (emulatora chwilowo nie mam), ale założę się, że też zadziała.

Generalnie są przypadki kiedy takie coś się przydaje i to właśnie komentarz w każdej linii DADA (np. wpisywanie w DATA kodu maszynowego i umieszczanie jako komentarza np REM LDA #65 - bardzo przydatne w celach edukacyjnych...

Po prostu naprawdę się zdziwiłem, że nasz BASIC tego nie umie oraz, że w zasadzie nie znam innego, na którym to nie działa (ok, sprawdzę jeszcze na Apple II, bo tam są IMHO spore szanse. :)

Co to jest? Co to jest?.... To przecież... Atari! :)

8

No jak widzisz takie dinozaury jak ja które żyły długo w jaskini gdzie było tylko Atari... to się na starość dziwią że inne interpretery takie rzeczy dopuszczają. Zresztą przyznaję ze nie wiem jak jest w innych dostępnych dla Atari BASIC-ach... jest tego przecież trochę, i pewnie jeszcze parę innych.

Prawdę mówiąc "otworzyłeś mi oczy", i dlatego prze-edytowałem swój wcześniejszy post... bo jak zwykle chcąc szybko odpowiedzieć dokonałem zbytnich uproszczeń i wyszło dość grubiańsko, co nie było moim celem. Cieszę się ze pojawiają się takie posty jak Twój bo człowiek może dowiedzieć się czegoś nowego, a nie żyć w błędnym przeświadczeniu ze gdzie indziej jest tak samo! :)

Dzięki za te informacje!

Moja ignorancja i nieznajomość różnic tego typu może wynikać również z tego że dość szybko skierowałem swoje kroki w stronę assemblera i przestałem się interesować światem BASIC-ów... chociaż Turbo Basic XL, długo służył mi do wykonywania jakichś pomocniczych obliczeń bazujących na liczbach FP :)

9 Ostatnio edytowany przez seban (2022-05-30 14:34:31)

sprawdziłem tak na szybko Basic XL, Basic XE oraz "Microsoft BASIC I":

http://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=9198&download=0   http://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=9199&download=0

http://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=9200&download=0

^^^ wychodzi więc na to że wszystkie typowo "Atarowskie" interpretery trzymają się konwencji Atari BASIC, natomiast Microsoft BASIC jest zgodny z Twoimi oczekiwaniami i właściwie zachowuje się dokładnie tak samo jak C64 BASIC. ale C64 BASIC z tego co pamiętam bazuje na MS Basic w jakimś stopniu więc zgodność na tym poziomie nie powinna dziwić.

Tych Basiców jest naprawdę sporo do sprawdzenia jeżeli kogoś to interesuje, to tutaj jest trochę bardziej rozbudowany (w porównaniu z Atariki) spis: BASIC w Atari Wiki V3.

Post's attachments

basic_xe_data.png 2.47 kb, nikt jeszcze nie pobierał tego pliku. 

basic_xl_data.png 2.65 kb, nikt jeszcze nie pobierał tego pliku. 

ms_basic_data.png 2.8 kb, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.

10

seban napisał/a:

Moja ignorancja i nieznajomość różnic tego typu może wynikać również z tego że dość szybko skierowałem swoje kroki w stronę assemblera i przestałem się interesować światem BASIC-ów... chociaż Turbo Basic XL, długo służył mi do wykonywania jakichś pomocniczych obliczeń bazujących na liczbach FP :)

Spoko, choć temat jest pozornie mało istotny, na tyle mnie zaintrygował, że mam zamiar:
- w wolnej chwili sprawdzić to zagadnienie na wszystkich posiadanych platformach retro,
- sprawdzić to samo na innych BASIC-ach dla Atari,
- zrobić z tego jakiś wpis, albo nawet  filmik na YT (w zasadzie kiedyś trzeba :)).

Generalnie wydaje mi się, że problem w ATARI BASIC może wynikać z "niechęci" jego twórców do zmiennych tekstowych. Jest to jedyny, znany mi dialekt, gdzie trzeba używać do tego deklaracji DIM (wszędzie indziej tak się deklaruje jedynie tablice - w tym liczbowe i tekstowe) oraz.. gdzie można łańcuchy znaków umieszczać w bloku DATA bez cudzysłowów - i pewnie tu jest "pies pogrzebany":

1000 DATA ARBUZ, KOTEK, GRZYB, 114, 12

W innych dialektach byłoby:

1000 DATA "ARBUZ", "KOTEK", "GRZYB", 114. 12

... i wówczas nie ma żadnego problemu z odróżnieniem stringu od innych danych w linii.

Co to jest? Co to jest?.... To przecież... Atari! :)

11 Ostatnio edytowany przez Sikor (2022-05-30 17:37:09)

Panowie, PAX!!!
1. Basic dla firmy Commodore był kradzionym Basiciem od małej, mikrej firmy - czym się sam Tramiel w jakimś wywiadzie chwalił, jak to wyrolował niejakiego Billa G. (złapał go za słówko i wyszla garść moniaków)
2. Basic dla Spectrum i Amstrada to też implementacja MS BASIC (podobnioe jak dla TRS 80, o ile dobrze pamiętam), oczywiście wszystkie mają drobne różnice, ale te wynikają ze sprzętu
3. Atari Basic i jego pochodne w locie sprawdzają składnię, czego nie robi prawie żaden inny Basic, więc wiecie, wklepywanie 200+ linii kodu, aby potem mieć ERROR po RUN... Ale taka była polityka innych Basiców i jedno z wymagań ówczesnego Atari
Niedużo brakowało, a w Atari byśmy mieli też w standardzie MS Basic, ale... Ten ni w cholerę nie chciał się zmieścić w 8KB, w dodatku był potrzebny na targi, więc stąd Atari zleciło to innej firmie (o ile pamiętam - Shepard Electronics, to jest w sumie łatwo sprawdzić). Jak dla mnie - Atari Basic ma więcej zalet od MS Basica, ale ma też masę ograniczeń. Tym niemniej na nim się wychowałem - i podobnie, jak widzę, jak dla Sebana - w jego odpowiednikach pisze mi się najlepiej.
==========================
Edyta:

UnDead napisał/a:

. i wówczas nie ma żadnego problemu z odróżnieniem stringu od innych danych w linii.

Hmm, a tak się zastanawiam, jak w innych dialektach Basica jest z wstawianiem kodu maszynowego w linie data? Bo w Atari można zarówno jako ciągi tekstowe, jak i liczbowe? Serio pytam, bo po prostu nie wiem? A takie "kawałki kodu" komputer wtedy zupełnie inaczej interpretuje (chociażby X=USR(adres) kontra relokowalny kod maszynowy)?

Sikor umarł...

12 Ostatnio edytowany przez UnDead (2022-05-30 18:13:02)

Sikor napisał/a:

Panowie, PAX!!!
1. Basic dla firmy Commodore był kradzionym Basiciem od małej, mikrej firmy - czym się sam Tramiel w jakimś wywiadzie chwalił, jak to wyrolował niejakiego Billa G. (złapał go za słówko i wyszla garść moniaków)

Jest to o tyle ciekawe, że jakby w tym momencie zamknęło się pewne koło. ;-) Wszak wcześniej Bill G. pracował przez rok dla Atari, a jego zadaniem było... znalezienie bugów w BASIC-u i przekazanie raportu firmie. Efekt ponoć był taki, że Bill G. dostał kod źródłowy od Atari do analizy, przez rok nic nie zrobił i.. nawet jakąś kasę wziął, a kilka miesięcy potem, ukazał się... MS BASIC. :)

UnDead napisał/a:

. i wówczas nie ma żadnego problemu z odróżnieniem stringu od innych danych w linii.

Sikor napisał/a:

Hmm, a tak się zastanawiam, jak w innych dialektach Basica jest z wstawianiem kodu maszynowego w linie data? Bo w Atari można zarówno jako ciągi tekstowe, jak i liczbowe? Serio pytam, bo po prostu nie wiem? A takie "kawałki kodu" komputer wtedy zupełnie inaczej interpretuje (chociażby X=USR(adres) kontra relokowalny kod maszynowy)?

Szczerze mówiąc, w pozostałych dialektach spotkałem się tylko z użyciem DATA i mozolnym wstawianiem liczb 8-mio bitowych (ok, niekiedy można użyć liczb w hex, ale to tyle). Z umieszczaniem kodu w stringu i użyciem A=USR(ADR(A$)) spotkałem się tylko w ATARI BASIC jak dotąd.

Co to jest? Co to jest?.... To przecież... Atari! :)

13

UnDead napisał/a:

Jest to o tyle ciekawe, że jakby w tym momencie zamknęło się pewne koło. ;-) Wszak wcześniej Bill G. pracował przez rok dla Atari, a jego zadaniem było... znalezienie bugów w BASIC-u i przekazanie raportu firmie. Efekt ponoć był taki, że Bill G. dostał kod źródłowy od Atari do analizy, przez rok nic nie zrobił i.. nawet jakąś kasę wziął, a kilka miesięcy potem, ukazał się... MS BASIC. :)

Historię o tym że MS miało zrobić Basic dla Atari ale nie zmieściło się w 8KB to słyszałem.
Ale historia że Gates był zatrudniony i zwolniony z Atari to nowość dla mnie. No ale faktycznie to się wydarzyło:

https://www.gamedeveloper.com/business/ … -1978-1981

"There is a period at Atari when there were no games coming from Larry Kaplan, Alan Miller, Bob Whitehead, and myself. As the most senior designers at Atari, we were tasked with creating the 800 operating system. This group, plus two others, wrote the entire operating system in about 8 months. A funny story from this time that Al Miller likes to tell has to do with the Atari BASIC cartridge that was to ship with the system. Atari had contracted with a young programmer named Bill Gates to modify a BASIC compiler that he had for another system to be used on the 800. After that project stalled for over a year Al was called upon to replace him with another developer. So, while Al is the only person I know ever to have fired Bill Gates, I suspect that rather than work on Atari BASIC, Gates was spending all his time on DOS for IBM. Probably not a bad career choice for him, do you think?" xxxviii

- David Crane

https://www.mentalfloss.com/article/316 … bout-atari

In a million dollar deal, Atari contracted a company called Microsoft to port the BASIC programming language to the Atari 800. A young developer named Bill Gates was responsible for the project. One year later, the software had yet to be completed, and Alan Miller, an Atari game designer and programmer, took over the project. This very likely makes him the only person to have fired Bill Gates.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

14

Ale na pewno nie było tak, że Atari BASIC był napisany przed MS BASICiem. Ten drugi był kilka lat wcześniej hitem na ALTAIR 8800. Bill miał go tylko portować na Atari. Tak jak napisał Sikor, nie udało mu się go zmieścić w 8kB, bo miał mieć jakieś rozszerzenia graficzne i muzyczne, których chciało Atari.

Co do zmiennych tekstowych, to w Atari BASIC trzeba je deklarować, bo Atari BASIC powstał na bazie innego BASICa (https://en.wikipedia.org/wiki/Data_Gene … ness_Basic). Na pewno jest to trochę kłopotliwe, ale za to nie mają ograniczenia długości. Zmienne tekstowe w MS Basic mogą mieć max 256 znaków.