Moja przygoda z Atari BASIC by Kaz 2008-11-02 19:59:30

Dzisiejszy odcinek wspomnień z dzieciństwa należy do Adama "Golem XIV" Milewskiego. Adam miał nieodpartą chęć zrealizowania pewnego programu w Turbo Basicu i ta sprawa męczyła go przez wiele lat. Ponieważ my się tu zajmujemy rozwiązywaniem męczących spraw z przeszłości :), artykuł Adama znalazł należne sobie miejsce. Dalej już niech snuje swoją opowieść sam autor:

Chciałbym tu opowiedzieć historię mojej fascynacji Atari oraz niebudzącym poważania językiem programowania – Atari BASIC. Przygoda rozpoczęta wiele lat temu znalazła swój epilog dopiero niedawno i to w chwili, kiedy nie spodziewałem się, że do niej wrócę. Zacznijmy od początku.

Historia

W roku 1994, w trakcie moich studiów na Wydziale Fizyki UMK w Toruniu, poznałem faceta o ksywie Olo, który posiadał komputer Atari 800 XL ze stacją dyskietek LDW2000. Pochodziliśmy z tego samego miasta, przy czym ja na uczelnię dojeżdżałem, a on mieszkał na stancji. Co jakiś czas jednak pakował Atarynkę, stację i zielony monitor do wielkiej torby i przywoził do domu rodzinnego. Dzięki temu udało mi się parę razy wypożyczyć ten sprzęt na dłuższy czas. Mając mikrokomputer Atari można było bawić się grami do zanudzenia, jak i próbować wykorzystać go w bardziej ambitny sposób, w czym doskonale pomagała stacja dysków. Ponadto Olo, oprócz masy gier, miał również spory zapas branżowych czasopism oraz książkę o Atari BASIC.

BASIC i wykresy 3D

Początki moich zabaw w programowanie związane były z przepisywaniem programów z książki oraz "Tajemnic Atari". Irytowało mnie jednak, gdy po kilkudziesięciu minutach wklepywania tysięcy liczb i liter, mogłem sobie jedynie pograć w prostą odwracankę w trybie znakowym. Bardziej podobały mi się wszelkie perełki w rodzaju konkursu „5 linii” czy „szósta strona”, gdzie w oszczędnej formie ludzie robili niesamowite rzeczy z komputerem. Ja też postanowiłem napisać coś fajnego. Wybór padł na program do rysowania wykresów 3D w oparciu o równania typu: z=sin(x)+cos(y); w różnych wariacjach.

Mój program bazował na przykładzie, który znalazłem bodajże w "Bajtku", dla komputera Commodore. Właściwie należy powiedzieć, iż był to program do rysowania jednego konkretnego wykresu - zaszytego w algorytmie wyliczającym. Stworzenie programu, w którym podawałoby się własny wzór, było dla mnie zbyt ambitne. Mimo to praca nad nim dostarczyła mi wiele frajdy. Niestety jego główną wadą był czas wykonywania, który wahał się w okolicy 20 minut. Oczywiście w w tamtym czasie normą było powiedzenie: "Uruchom program komendą RUN i idź zaparzyć sobie herbatę/kawę lub wyskocz na piwo".

Bez wątpienia program wymagał dodatkowych poprawek. Zacząłem więc kombinować z jego przyśpieszeniem w ramach wiedzy, jaką posiadałem na temat Atari BASIC oraz funkcji trygonometrycznych. Oj, było tego sporo... między innymi:
W ostateczności listing się skomplikował - ale program działał szybciej. Jedyną jego wadą był już tylko włączony przez kilka minut obraz, kiedy obliczały się sinusy i cosinusy. Ostateczne circa 9 minut to był sukces!

Pożegnanie z Atari

Moje studia skończyły się po pierwszym semestrze, choć znajomość z Olo przetrwała jeszcze jakiś czas. Kiedy zacząłem pracować, a Olo przeniósł się na inne studia, nasze kontakty ustały. Parę razy spotkaliśmy się jeszcze „na mieście”. W trakcie jednego z tych spotkań okazało się, że Olo przekazał młodszym kuzynom komputer wraz z dyskietkami i w ten sposób efekty moich prac przepadły. Był to oczywiście ów program "Wykresy 3D", ale także prosta gra (o której chciałbym kiedyś napisać - może ktoś ją przełoży na kod maszynowy).

W trakcie użytkowania Atari oraz później, męczyło mnie jedno pytanie: jak szybko mój program działałby napisany w innym języku programowania? Interesowały mnie zwłaszcza Pascal, assembler oraz inne odmiany BASICa (szczególnie Turbo BASIC). Kod maszynowy wydawał mi się zbyt trudny, zaś Pascal i Turbo BASIC były dla mnie niedostępne w okresie użytkowania Atari. Jednakże przez wszystkie te lata odczuwałem wielką potrzebę by sprawdzić, jak szybko mój program działałby chociażby w mitycznym i „4 razy szybszym” Turbo BASIC'u.

Zaspokojenie ;)

Mimo korzystania z emulatora Atari pod Windows i Linux nigdy nie pokusiłem się o zaspokojenie mojej ciekawości, głównie z powodu braku oryginalnego programu i konieczności odtworzenia go na nowo. Jednakże pod koniec 2007 roku trafiłem na opis programu "Wykresy 3D" z "Bajtka" (Marcin Borowski, Trójwymiarowe wykresy, Bajtek nr 8/88, strony 24-25). Postanowiłem więc, że zrealizuję moje marzenie sprzed lat - sprawdzę, jak bardzo szybszy od Atari BASIC jest Turbo BASIC, czyli ile czasu zaoszczędziłbym kiedyś stosując ten drugi, zamiast pierwszego.



Stało się – przepisałem program - nie jest on dokładnie tym sprzed lat, ale robi to samo, tylko na nieco prostszym równaniu. Program, przetestowałem w różnych wariacjach na emulatorze Atari800Win 4.0 ze standardowymi ROM'ami i pamięcią ustawioną na 320 KB (compy) na Atari BASIC'u i Turbo BASIC'u XL 2.0.

Pierwotny, nieoptymalizowany listing programu wygląda następująco:
5 POKE 18,0:POKE 19,0:POKE 20,0
10 PI=3.14159
15 A=COS(PI/4)
20 DIM M(255)
25 GRAPHICS 8
30 COLOR 1
35 REM POKE 559,0:REM WYLACZENIE OBRAZU
40 FOR Y=1 TO 141 STEP 5
45 E=A*Y
50 C=(Y-70)*(Y-70)
55 FOR X=1 TO 141
60 D=X-70
65 Z=60*EXP(-1.0E-03*(C+D*D))
70 X1=X+E
75 Y1=Z+E
80 IF Y1>=M(X1) THEN M(X1)=Y1:PLOT X1,160-Y1
85 NEXT X
90 NEXT Y
95 PRINT INT((PEEK(18)*65536+PEEK(19)*256+PEEK(20))/50)
100 REM POKE 559,34:REM WLACZENIE OBRAZU
105 FOR S=0 TO 254:M(S)=0:NEXT S:REM LINIA 105 ZBEDNA W TURBO BASIC


Program zoptymalizowany wygląda zaś tak:
5 POKE 18,0:POKE 19,0:POKE 20,0
10 A=COS(3.14159/4)
15 DIM M(255)
20 GRAPHICS 8:COLOR 1
25 REM POKE 559,0:REM WYLACZENIE OBRAZU
30 FOR Y=1 TO 141 STEP 5:E=A*Y:C=(Y-70)*(Y-70)
35 FOR X=1 TO 141:D=X-70:Y1=E+60*EXP(-1.0E-03*(C+D*D)):X1=X+E
40 IF Y1>=M(X1) THEN M(X1)=Y1:PLOT X1,160-Y1
45 NEXT X:NEXT Y
50 PRINT INT((PEEK(18)*65536+PEEK(19)*256+PEEK(20))/50)
55 REM POKE 559,34:REM WLACZENIE OBRAZU
60 FOR S=0 TO 254:M(S)=0:NEXT S:REM LINIA 60 ZBEDNA W TURBO BASIC


Jak widać, nie było tu dużo do „optymalizowania”, a to ze względu na małą złożoność obliczeń w pętli głównej oraz brak skomplikowanych obliczeń sinusów i cosinusów. Ponadto w Turbo BASIC'u nie trzeba stosować czyszczenia tablicy M(), co robione jest odpowiednio w liniach 105 i 60 (konieczne w Atari BASIC'u jeśli chcemy uruchamiać program wielokrotnie). Jak widać w listingu dodano też rozkazy POKE 559,0 i POKE 559,34 odpowiedzialne za wyłączenie obrazu i włączenie go w celu prezentacji wyników. Wyniki testów prezentuje poniższa tabela:

język programowania optymalizacja wyłączony ekran czas
1. Atari BASIC nie nie 9m 29s
2. Atari BASIC nie tak 7m 07s
3. Atari BASIC tak nie 9m 19s
4. Atari BASIC tak tak 7m 00s
5. Turbo BASIC 2.0 XL nie nie 2m 48s
6. Turbo BASIC 2.0 XL nie tak 2m 06s
7. Turbo BASIC 2.0 XL tak nie 2m 44s
8. Turbo BASIC 2.0 XL tak tak 2m 03s


Wnioski

Istnieje przepaść pomiędzy czasem wykonywania się programu pomiędzy dwoma testowanymi odmianami tego samego języka. Sam za siebie mówi fakt, iż zoptymalizowany program uruchomiony na Atari BASIC (przy wyłączonym obrazie) nawet nie zbliża się do prędkości wykonywania programu w Turbo BASIC XL (bez optymalizacji i zabaw z ANTIC'em). Jak można było się spodziewać, wyłączenie obrazu daje spory przyrost prędkości, jednakże kosztem pozbawienia się przyjemności z oglądania powstającego rysunku. Natomiast optymalizacja kodu nie daje wiele w tym konkretnym przypadku. Wygląda na to, iż kilkanaście lat temu „straciłem” sporo czasu bawiąc się Atari BASIC, różnica pomiędzy 9 minutami 29 sekundami i 2 minutami 48 sekundami w wersji nieoptymalizowanej jest dość spora. Szkoda, wielka szkoda, że nie miałem wtedy Turbo BASIC'a.

Epilog

Dziś odczuwam wielką ulgę patrząc na te wyniki. Ta sentymentalna zadra zniknęła z mojego życia, pozostawiając już tylko same dobre wspomnienia. Pewnie chciałbym odtworzyć mój pierwotny program, który rysował bardziej skomplikowane wykresy, pewnie chciałbym wiedzieć jak szybko zadziałałby przepisany na PASCAL'a i po kompilacji – ale nie jest to już tak ważne. Gdzieś we mnie natomiast drzemie jeszcze potrzeba odtworzenia gry, która była na bardzo zaawansowanym etapie. Może kiedyś...
Kaz 2008-11-02 20:33:46

Krotko mowiac - jak ktos chce pisac gry, a czuje sie za slaby na assembler - niech probuje w Turbo Basicu XL. Pewnie TDC bedzie jeszcze polecal Action! :).

golem14 2008-11-02 21:02:25

Cóż tworzenie gier w Turbo Basicu czy nawet w Basicu lepsze jest niż nie tworzenie ich wcale. Pamiętam, iż mój brat uczył się Informatyki na komputerach Elwro Junior za pomocą LOGO - ja mialem BASIC'a. Dobrze napisany program w Atari BASIC'u z ciekawą ideą, to też jakieś dzieło. Poza tym niedoskonałości tego języka skłaniają do szukania lepszych rozwiązań - innych platform do tworzenia programów. Ciekawe jakby ten program skompilować (o ile się nie mylę są jakieś kompilatory dla BASIC'owych programów?).
BTW. Pracowałem kiedyś u inżyniera elektryka, który sporo programów do swoich obliczeń miał napisanych na ATARI i to w BASIC'u. Podówczas korzystał już z pieca a ja niestety byłem zbyt biedny by odkupić od niego Atarynkę z jego dziełami. Szkoda.

zilq 2008-11-02 21:27:09

hehe... w swoim czasie bardzo dużo pisałem w Turbo Basic. W Action! też próbowałem, ale wtedy trochę nie rozumiałem zasad "Prawdziwego" programowania. Dopiero czasy Turbo Pascal-a to zmieniły, a to już było trochę za późno (szkoda). Ale... wracając do meritum :) Z niewielkimi wstawkami w assemblerze (USR RuleZ :D) można było w TB uzyskać całkiem sporo. Szkoda, że nie mam już dostępu do swoich "wypocin" (pewnie dyskietki już wyzionęły ostatni bit z siebie - to już prawie 15 lat :/ ) ech... łezka się kręci w oku. Cóż... życie toczy się dalej. Tak od siebie mogę powiedzieć, że chyba jedynym mankamentem w TB było/jest to, że nie wprowadzono przekazywania parametrów do procedur, niesamowicie zmienia to styl programowania.
Pozdrawiam wszystkich programujących.

bob_er 2008-11-02 21:42:10

http://atariarea.krap.pl/forum/viewtopic.php?id=6070

Kaz 2008-11-02 21:57:00

A ja dodam link do kompilatorow Basica, bo sa w dziale dla poczatkujacych: http://tiny.pl/sl77

Adam Mowny 2008-11-02 21:59:15

zilog -- "(pewnie dyskietki już wyzionęły ostatni bit z siebie - to już prawie 15 lat :/ )" <-- Dyskietki (a nawet kasety) znoszą upływ czasu zaskakująco dobrze. Kupuję sporo z różnych miejsc i czasem dochodzą do mnie 20-paro-letnie, śmierdzące stęchłą piwnicą lub strychem, ale ładują się zwykle bez problemów jeżeli tylko nie są mechanicznie uszkodzone - np. zgięte.

Kaz 2008-11-02 22:09:43

Mam wrazenie, ze zapis na tasmie ma dluzsza zywotnosc niz na dyskietkach. Wiele starych dyskietek Atari nie daje sie odczytac, podczas gdy tasmy jak najbardziej. Pewnie obiektywne przyczyny tego stanu sa wielorakie:
- dyskietka ma mniej materialu magnetycznego na swojej powierzchni niz jest na powierzchni tasmy,
- dane na powierzchni dyskietki sa upakowane gesciej niz na tasmie, wiec rozmagnesowanie robi wieksze zniszczenia,
- do powierzchni dyskietki 5.25 czynniki zewnetrzne (np. wilgoc) maja wiekszy dostep niz do zawinietej w klebek tasmy.

Cobra/Samar 2008-11-02 23:06:20

A czym różni się Basic XL od XE?

golem14 2008-11-02 23:19:33

BASIC jest fajny, jeszcze nie bawiłem się w kompilacje ale udało mi się uruchomić program z listingu pierwszego w QBasicu (po drobnych modyfikacjach). Trzeba by jeszcze poprawić deklarację tablicy i było by super! Niestety program rysuje tak szybko, że nie sposób tego zauważyć - robi się F5 i od razu wyskakuje gotowy rysunek. Atari jednak rulez - zawsze można było zaparzyć tą herbatę.

zaxon 2008-11-02 23:35:47

hehe, Turbobasic XL wstawilem sobie do Atarki wewnetrznie, fajna sprawa.

Kaz 2008-11-02 23:35:57

golem - zaraz Cie ktos scignie za "tą herbatę" zamiast "tę herbatę". Bron sie, jesli wiesz jak :P.

Cobra - Basic XL, Basic XE i Turbo Basic XL to trzy zupelnie inne implementacje: http://atariki.krap.pl/index.php/BASIC
Polecam tez zajrzec do Biblioteki Atarowca: http://tiny.pl/sl94
Jest tam pozycja o nazwie "Co nowego w Basic XE?".

mono 2008-11-03 08:00:40

@Cobra: Poszukaj w Bajtkach albo w Moje Atari - tam były opisy implementacji BASIC XL i XE. Języki oidp dosyć się od siebie różniły.

Cobra/Samar 2008-11-03 08:17:19

Ok.Dzięki. Jedyną przygodę z basic na Atari to pamiętam z Forever 5:) Pozdrawiam.

Suggestion for a compo? 2008-11-03 15:38:31

How about preparing a similar unoptimized BASIC or TBASIC graphics routine and make a compo for the best optimizer? :-)
In this little example I was only able to cut 3 more seconds from the optimized version (TBASIC, screen on)

Monsof 2008-11-03 17:35:59

Ja jakos nie mialem za duzego doczynienia z basickiem na male atari, jakos od razu zaczalem od assembler'a (QA). Za to na duze atari to lubialem pisac w GFA Basicku.

Adam Mowny 2008-11-03 19:22:35

A ja trochę się tego napisałem, tylko wszystko przepadło w mrokach 15-lecia bez atarynki. W BASICu napisałem swoje "demo" wyświetlane na giełdzie w czasie gdy akurat nic nie kopiowałem. To był napis POKESOFT (eeech te nazwy :-))) w takiej "przeplatanej" ramce u góry i dołu. Pamiętam też program do nauki stopni wojskowych... (no co, taka była akurat potrzeba :-))))
Odnaleźć to po latach... bezcenne.

Suggestion for a compo <-- good idea!

Wolfman 2008-11-03 20:19:19

... ja również coś próbowałem stworzyć w BASIC/u ,pamiętam jak przez mgłę te nielogiczne współrzędne przy rysowaniu w trybie graficznym bodajże 10 siątym (kartka z ustalonymi współrzędnymi RULEZ),niestety (właściwie wtedy to się cieszyłem) w końcu odebrałem magnetofon z naprawy ........

Monsoft 2008-11-03 21:26:12

Ja kiedys cos probowalem, ale to byly raczej przepisywane zeczy z ksiazki Atari Basic (takiej niebieskiej). W GFA Basicku to juz sam pisalem (no moze probowalem pisac). Efekty tego mozna zobaczyc tutaj http://aim.pelech.net/mojep.htm

ZAJAC 2008-11-03 23:12:15

Ja tylko dodam ze w TB powstała wiekszosc produkcji SWORD ... ot co :))))...

szary 2008-11-03 23:40:38

hmmm.. zaxon ,też bym sobie chętnie wstawił tbxl, choć bardziej wolałbym mieć go formie carta. Da się takowego jakoś zmajstrować..? ;)

maly_swd 2008-11-04 08:19:19

Zajec, wiekszosz? mnie sie wydaje ze wszystko;)

Kaz-> a moze konkursik np 6 lini;) tematyka dowolna

MDW 2008-11-04 09:11:51

maly_swd:
Konkurs 5 linii to byloby cos! Az mnie korci. :) Konkurs taki jak w czasach Tajemnic Atari. Tylko trzeba byloby sprawdzic czy ktos takiego programu po prostu nie podciagnal z Tajemnic Atari. :) Trzeba byloby spisac sobie wszystkie te programy z opisami co ktory robi.

grzeniu 2008-11-04 12:46:24

Hehe, panowie fizycy :D

andygroo 2008-11-04 12:57:22

Z ciekawosci zrobilem tez testy na czystym basicu w spectrum.
Przystosowalem programik, aby dzialal na speccy i okazało sie, ze trzeba jedna instrukcje wprowadzic dodatkowa w glownej petli poniewaz warunek IF nie odczytuje bezposrednio tablicy. Mimo wszystko czysty basic okazal sie szybszy od tego w atari.
8min20sek normalnie
7.49 po optymalizacji.
Roznica czasu pomiedzy optymalizacja a bez jest wieksza niz u was co tez jest ciekawe.
Optymalizacje robilem oczywiscie w ten sam sposob co kolega, aby porownac czasy identycznych programow w basicu. Bo ogolnie optymalizowac program to mozna w nieskonczonosc. Z duzym prawdopodobienstwem napewno przyspieszy program jak mu sie wylaczy sprawdzanie klawisza break, potablicowanie tego itd.. itd...
Poszukam jeszcze jakis kompilatorow na spectrum i porownam wplyw na ten programik. A moze sie pokusze o sprawdzenie tego jeszcze na innych platformach bo samego mnie to zaciekawilo;p

MDW 2008-11-04 13:33:23

andygroo:
Dzięki za porównanie. Ciekawe. Ja się zastanawiam jak liczone są funkcje trygonometryczne na ZX Spectrum. Czy aby to nie są jakieś stablicowane gdzieś wartości? :) To by tłumaczyło znacznie lepsze wyniki. Po komputerach tamtych lat można się wszystkiego spodziewać. Tym bardziej jak się wie jak działał generator liczb pseudolosowych na ZX-sprzęcie. ;)

Kaz 2008-11-04 16:44:08

Andygroo - dane przedstaw w tabelce (wersja Basic, platforma) to dolacze do artykulu.

xxl 2008-11-04 19:04:21

http://www.e-service.net.pl/sumpirowicz/nfsk/benchmark.html

tu jest porownanie kilku interpreterow na rozne kompy 8bitowe

andygroo 2008-11-05 05:59:19

xxl...
test jest denny poniewaz nie odwoluje sie w ogole do procedur graficznych danego kompa.a jak wiadomo to spowalnia wiecej niz jakies funkcje. z testu wynika ze c64 jest o wiele szybszy co jest calkowita bzdura w tym momencie, pomijajac ze w czystym basicu c64 w ogole nie nadaje sie. cokolwiek tam mozna zrobic to instrukcjami poke w stosunku do ekranu. zapraszam kolegow z c64 tez do przepisania programu i porownaniu predkosci.

Tdc 2008-11-07 01:25:16

Kaz: tak ja polecam Action! choć w tym wypadku warto dodać że język ten nie ma funkcji trygonometrycznych itp. więc może to sprawić nieco kłopotu. Inna sprawa że język ten jest bardzo wydajny - jednak całą moc wykazuje po świadomym wykorzystywaniu jego cech, kiedyś do AM napisałem gigantyczny tekst na ten temat, teraz zastanawiam się nad tym czy nie opisać tego jeszcze solidniej - może kogoś to zachęci.