Atari BASIC

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 04:59, 17 gru 2005
KMK (Dyskusja | wkład)

← Previous diff
Aktualna wersja
KMK (Dyskusja | wkład)
(Wykonywanie programu)
Linia 1: Linia 1:
-'''Atari BASIC''', właściwie '''Shepardson BASIC''', to wersja języka programowania '''BASIC''' (''Beginners All-purpose Symbolic Instruction Code''), przygotowana na potrzeby komputerów [[Atari 8-bit]]. Zaprogramowany w grudniu 1978 roku przez [http://en.wikipedia.org/wiki/Shepardson_Microsystems Shepardson Microsystems] na zlecenie firmy [[Atari]], był sprzedawany razem z komputerem, a w późniejszych modelach wbudowany. Objętość interpretera wynosi osiem kilobajtów. W późniejszych latach prawa do Atari BASIC-a przejęła firma [[OSS]].+Wersja języka programowania '''BASIC''' (''Beginners All-purpose Symbolic Instruction Code''), przygotowana na potrzeby komputerów [[Atari 8-bit]]. Zaprogramowany w grudniu 1978 roku przez [http://en.wikipedia.org/wiki/Shepardson_Microsystems Shepardson Microsystems] na zlecenie firmy [[Atari]], był sprzedawany razem z komputerem, a w późniejszych modelach wbudowany. Objętość interpretera wynosi osiem kilobajtów. W późniejszych latach prawa do Atari BASIC-a przejęła firma [[OSS]].
-Od innych wersji BASIC-a Atari BASIC już na pierwszy rzut oka odróżnia to, że interpreter dokonuje kontroli składni natychmiast po wpisaniu polecenia lub wiersza programu przez użytkownika (wiele wersji BASIC-a na inne komputery kontroluje składnię dopiero podczas wykonywania programu). Inna jest też obsługa zmiennych tekstowych: brak jest wielowymiarowych tablic tekstowych, a zmienne jednowymiarowe (stringi) należy obowiązkowo deklarować jako tablice właśnie.+== Cechy charakterystyczne ==
-Powód tych różnic jest prosty: Atari BASIC nie jest "klonem" [[Microsoft BASIC]]-a, który zdefiniował najbardziej rozpowszechniony standard tego języka. Zamiast tego Atari BASIC jest implementacją standardu opracowanego przez firmę [http://en.wikipedia.org/wiki/Data_General Data General].+Od innych wersji BASIC-a Atari BASIC już na pierwszy rzut oka odróżnia to, że interpreter dokonuje kontroli składni natychmiast po wpisaniu polecenia lub wiersza programu przez użytkownika (wiele wersji BASIC-a na inne komputery kontroluje składnię dopiero podczas wykonywania programu). Inna jest też obsługa zmiennych tekstowych: brak jest wielowymiarowych tablic tekstowych, a zmienne jednowymiarowe (stringi) należy obowiązkowo deklarować jako tablice właśnie. Nie ma za to obowiązku specjalnego deklarowania zmiennych numerycznych: zmienna jest deklarowana przez fakt jej użycia, a początkową wartością jest zero.
 + 
 +Powód tych różnic jest prosty: Atari BASIC nie jest "klonem" [http://en.wikipedia.org/wiki/Microsoft_Basic Microsoft BASIC]-a, który zdefiniował najbardziej rozpowszechniony standard tego języka. Zamiast tego Atari BASIC jest implementacją standardu opracowanego przez firmę [http://en.wikipedia.org/wiki/Data_General Data General].
 + 
 +== Wersje rozwojowe ==
Dostępne są następujące wersje Atari BASIC-a: Dostępne są następujące wersje Atari BASIC-a:
-* Revision A: sprzedawana jako [[kartridż]] razem z komputerami serii [[400]] i [[800]] lub oddzielnie; ta wersja miała cztery czy pięć poważniejszych błędów utrudniających pracę;+* '''Revision A (C012402/C014502)''': sprzedawana jako [[cartridge]] razem z komputerami serii [[400]] i [[800]] lub oddzielnie; ta wersja miała cztery czy pięć poważniejszych błędów utrudniających pracę;
-* Revision B: w założeniu poprawiona wersja przeznaczona dla [[800XL]] i faktycznie wbudowana w znacznej części modeli XL. Ma poważny błąd w procedurach kopiowania bloków pamięci, co oględnie mówiąc ujemnie wpływa na stabilność interpretera. Wersja B wg niektórych źródeł nie występuje na kartridżu.+* '''Revision B (C060302A)''': w założeniu poprawiona wersja przeznaczona dla [[800XL]] i faktycznie wbudowana w znacznej części modeli [[XL]]. Ma poważny błąd w procedurach kopiowania bloków pamięci, co oględnie mówiąc ujemnie wpływa na stabilność interpretera. Wersja B nie występuje na kartridżu.[http://www.atarimagazines.com/v3n2/explore.html]
-* Revision C: pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów [[Atari XL|XL]] i wszystkich [[Atari XE|XE]]. Wydana także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów).+* '''Revision C (C024947A)''': pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów [[XL]] i wszystkich [[XE]]. Dostępna także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów) co najmniej od czerwca 1984 r.[http://www.atarimagazines.com/v3n2/explore.html]
-Wersje można odróżnić zadając interpreterowi komendę '''? PEEK(43234)'''. Odpowiedź "162" oznacza rewizję A, "96" rewizję B, a "234" rewizję C.+Wersje można odróżnić zadając interpreterowi komendę '''? PEEK(43234)'''. Odpowiedź "162" (LDY #) oznacza rewizję A, "96" (RTS) rewizję B, a "234" (NOP) rewizję C.
 + 
 +== "Klony" Atari BASIC ==
Atari BASIC doczekał się paru ulepszonych (ale kompatybilnych) odmian: Atari BASIC doczekał się paru ulepszonych (ale kompatybilnych) odmian:
-* [[BASIC A Plus]]+* [[Altirra BASIC]]
 +* [[BASIC A Plus|BASIC A+]]
* [[BASIC XL]] * [[BASIC XL]]
* [[BASIC XE]] * [[BASIC XE]]
* [[MultiBASIC]] * [[MultiBASIC]]
* [[Turbo BASIC XL]] * [[Turbo BASIC XL]]
 +* [[U-BASIC]]
Dostępne kompilatory: Dostępne kompilatory:
* [[ABC BASIC Compiler]] * [[ABC BASIC Compiler]]
-* [[JLS BASIC]] 
* [[MMG BASIC Compiler]] * [[MMG BASIC Compiler]]
* [[Turbo BASIC XL Compiler]] * [[Turbo BASIC XL Compiler]]
-Dla ośmiobitowych Atari wydano także [[Microsoft BASIC]], który jednak, ze względu na brak kompatybilności z Atari BASIC, nie zyskał żadnej popularności i jest bardzo rzadki.+Dla ośmiobitowych Atari wydano także [[Atari Microsoft BASIC|Microsoft BASIC]], który jednak, ze względu na brak kompatybilności z Atari BASIC, nie zyskał żadnej popularności i jest bardzo rzadki.
== Błędy w Atari BASIC == == Błędy w Atari BASIC ==
-W Atari BASIC rev. C zostało parę drobnych błędów, z których część dotyczy procedur kontroli składni.+W Atari BASIC rev. C zostało parę niezbyt istotnych błędów, z których część dotyczy procedur kontroli składni.
 +=== Kontrola składni ===
* instrukcja DIM pozwala się wpisać bez parametrów (np.: '''10 DIM: DIM: DIM: DIM'''). Wykonanie czegoś takiego prowadzi na ogół do zawieszenia interpretera. * instrukcja DIM pozwala się wpisać bez parametrów (np.: '''10 DIM: DIM: DIM: DIM'''). Wykonanie czegoś takiego prowadzi na ogół do zawieszenia interpretera.
-* instrukcje NOTE i STATUS przyjmują tablicę numeryczną jako parametr, np. '''10 STATUS #1,A(0)'''; wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej.+* instrukcje NOTE i STATUS przyjmują tablicę numeryczną jako parametr, np. '''10 STATUS #1,A(1)'''; wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej.
-* '''? 1^44''' daje w wyniku dwa. Ale '''? 2^44''' daje już w miarę poprawny wynik "1.75921859E+13" (rzeczywiście jest to 17 592 186 044 416). Dokładność procedury potęgowania wydatnie maleje wraz ze zwiększaniem wykładnika, np. 1^1505150010 = 3, 1^2385606310 = 4, 1^9999999999 = 100 itd.+* kontrola składni akceptuje znak ''Esc'' (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też [[Turbo BASIC XL]].
 +* użycie '''NOT -0''' w programie powoduje podczas listowania wyświetlenie '''NOT -0E-<8''', co jest efektem błędu w tablicy kontroli składni: inaczej niż zazwyczaj '''-0''' parsowane jest w tym wypadku od razu jako liczba FP, a nie jako [[token]] negacji i dodatnia liczba FP. Sam [[pakiet matematyczny|pakiet FP]] też nie jest bez winy, bo potrafi parsować '''-0''', lecz nie potrafi jej już poprawnie przekształcić na ciąg [[ATASCII]].
 + 
 +=== Wykonywanie programu ===
 +* uruchomienie programu: '''10 DIM A(10922)''' nie powoduje błędu, mimo że brakuje pamięci na deklarację tablicy o takich wymiarach (potrzeba na to 65538 bajtów).
* uruchomienie programu: '''10 TRAP 10:GET #1,A''' powoduje całkowite zapełnienie i "zawinięcie" się stosu procesora; instrukcja TRAP wprawdzie zdejmuje ze stosu pewną ilość danych, ale rzadko bywa to ilość właściwa. Ten sam błąd ma też [[Turbo BASIC XL]]. * uruchomienie programu: '''10 TRAP 10:GET #1,A''' powoduje całkowite zapełnienie i "zawinięcie" się stosu procesora; instrukcja TRAP wprawdzie zdejmuje ze stosu pewną ilość danych, ale rzadko bywa to ilość właściwa. Ten sam błąd ma też [[Turbo BASIC XL]].
-* porównanie dwóch funkcji CHR$ w jednym wyrażeniu jest zawsze prawdziwe, np. '''IF CHR$(1)=CHR$(2) THEN STOP''' zawsze spowoduje zatrzymanie programu. Ten sam błąd ma też [[Turbo BASIC XL]].+* porównanie dwóch funkcji CHR$ w jednym wyrażeniu jest zawsze prawdziwe, np. '''IF CHR$(1)=CHR$(2) THEN STOP''' spowoduje zatrzymanie programu. Ten sam błąd ma też [[Turbo BASIC XL]].
 +* instrukcje OPEN, XIO i POINT używają niewłaściwej procedury do pobierania parametrów numerycznych (GLNNUM $ABCD zamiast LETNUM $ABD7). Skutkiem tego jest ograniczenie wartości parametrów do zakresu 0-32767 (co w przypadku POINT ma istotne znaczenie) oraz bezsensowny [[Kody_błędów_Atari_BASIC|komunikat błędu]]: "ERROR- 7" (= bad line number), gdy ten zakres zostanie przekroczony; pojawia się on po zadaniu interpreterowi np. '''OPEN #1,32768,0,"D:FOO.BAR"'''.
 +* instrukcje PUT lub PRINT na pliku otwartym do odczytu nie powodują błędu 135 "OPENED FOR READ ONLY", choć główna procedura CIO przeprowadza odpowiedni test - przyczyną takiego zachowania jest to, że BASIC wysyła dane bezpośrednio przez procedurę o adresie zapisanym w ICPUTB (patrz [[CIO]]). Analogiczne GET i INPUT na pliku otwartym do zapisu poprawnie zwracają błąd 131 "OPENED FOR WRITE ONLY".
 +* '''? 1^44''' daje w wyniku dwa. Ale '''? 2^44''' daje już w miarę poprawny wynik "1.75921859E+13" (rzeczywiście jest to 17 592 186 044 416). Dokładność potęgowania wydatnie maleje wraz ze zwiększaniem wykładnika, np. 1^1505150010 = 3, 1^2385606310 = 4, 1^9999999999 = 100 itd. Zasadniczo nie jest to błąd interpretera Atari BASIC, lecz raczej procedury logarytmowania zawartej w [[pakiet matematyczny|pakiecie matematycznym]].
 +* funkcja ASC nie sprawdza długości swojego parametru i, zamiast zgłaszać błąd, zwraca wynik nawet dla pustego ciągu tekstowego, bezsensowny w tym przypadku.
 + 
 +==Ciekawostki==
 +* W rev. B BASIC-a, pod adresem $BFF3-$BFF9 zapisany jest w [[Kody ekranowe|kodach ekranowych]] ciąg "LWinner", sugerujący, że autorem tej rewizji jest [[Lane Winner]].
 + 
 +== Zobacz też ==
 +* [[Kody błędów Atari BASIC]]
 +* [[Tokeny Atari BASIC]]
 + 
 +==Odnośniki zewnętrzne==
 +*[http://www.atarimania.com/detail_soft.php?MENU=8&VERSION_ID=13284 Atari BASIC] (rewizja A, wraz z instrukcją) na [[Atarimania|Atarimanii]]
 +*[http://members.chello.nl/taf.offenga/basroms.zip Atari BASIC - wszystkie rewizje] ze strony [[Frankenstein|Freddy'ego Offengi]]
 +<!-- * [http://www.strotmann.de/twiki/pub/Infothek/AtBasicReferenceMa/basrefmanen.pdf Atari BASIC Reference Manual] (plik PDF) -->
 +* [http://atarimagazines.com/compute/issue61/323_1_INSIGHT_Atari.php Artykuł o błędach w Atari BASIC], [[Compute!]] nr 61
 +*[http://en.wikipedia.org/wiki/Atari_BASIC Atari BASIC] w Wikipedii
[[Kategoria:Oprogramowanie Atari 8-bit]] [[Kategoria:Oprogramowanie Atari 8-bit]]
[[Kategoria:Języki programowania]] [[Kategoria:Języki programowania]]
 +[[Kategoria:BASIC]]

Aktualna wersja

Wersja języka programowania BASIC (Beginners All-purpose Symbolic Instruction Code), przygotowana na potrzeby komputerów Atari 8-bit. Zaprogramowany w grudniu 1978 roku przez Shepardson Microsystems na zlecenie firmy Atari, był sprzedawany razem z komputerem, a w późniejszych modelach wbudowany. Objętość interpretera wynosi osiem kilobajtów. W późniejszych latach prawa do Atari BASIC-a przejęła firma OSS.

Spis treści

Cechy charakterystyczne

Od innych wersji BASIC-a Atari BASIC już na pierwszy rzut oka odróżnia to, że interpreter dokonuje kontroli składni natychmiast po wpisaniu polecenia lub wiersza programu przez użytkownika (wiele wersji BASIC-a na inne komputery kontroluje składnię dopiero podczas wykonywania programu). Inna jest też obsługa zmiennych tekstowych: brak jest wielowymiarowych tablic tekstowych, a zmienne jednowymiarowe (stringi) należy obowiązkowo deklarować jako tablice właśnie. Nie ma za to obowiązku specjalnego deklarowania zmiennych numerycznych: zmienna jest deklarowana przez fakt jej użycia, a początkową wartością jest zero.

Powód tych różnic jest prosty: Atari BASIC nie jest "klonem" Microsoft BASIC-a, który zdefiniował najbardziej rozpowszechniony standard tego języka. Zamiast tego Atari BASIC jest implementacją standardu opracowanego przez firmę Data General.

Wersje rozwojowe

Dostępne są następujące wersje Atari BASIC-a:

  • Revision A (C012402/C014502): sprzedawana jako cartridge razem z komputerami serii 400 i 800 lub oddzielnie; ta wersja miała cztery czy pięć poważniejszych błędów utrudniających pracę;
  • Revision B (C060302A): w założeniu poprawiona wersja przeznaczona dla 800XL i faktycznie wbudowana w znacznej części modeli XL. Ma poważny błąd w procedurach kopiowania bloków pamięci, co oględnie mówiąc ujemnie wpływa na stabilność interpretera. Wersja B nie występuje na kartridżu.[1]
  • Revision C (C024947A): pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów XL i wszystkich XE. Dostępna także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów) co najmniej od czerwca 1984 r.[2]

Wersje można odróżnić zadając interpreterowi komendę ? PEEK(43234). Odpowiedź "162" (LDY #) oznacza rewizję A, "96" (RTS) rewizję B, a "234" (NOP) rewizję C.

"Klony" Atari BASIC

Atari BASIC doczekał się paru ulepszonych (ale kompatybilnych) odmian:

Dostępne kompilatory:

Dla ośmiobitowych Atari wydano także Microsoft BASIC, który jednak, ze względu na brak kompatybilności z Atari BASIC, nie zyskał żadnej popularności i jest bardzo rzadki.

Błędy w Atari BASIC

W Atari BASIC rev. C zostało parę niezbyt istotnych błędów, z których część dotyczy procedur kontroli składni.

Kontrola składni

  • instrukcja DIM pozwala się wpisać bez parametrów (np.: 10 DIM: DIM: DIM: DIM). Wykonanie czegoś takiego prowadzi na ogół do zawieszenia interpretera.
  • instrukcje NOTE i STATUS przyjmują tablicę numeryczną jako parametr, np. 10 STATUS #1,A(1); wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej.
  • kontrola składni akceptuje znak Esc (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też Turbo BASIC XL.
  • użycie NOT -0 w programie powoduje podczas listowania wyświetlenie NOT -0E-<8, co jest efektem błędu w tablicy kontroli składni: inaczej niż zazwyczaj -0 parsowane jest w tym wypadku od razu jako liczba FP, a nie jako token negacji i dodatnia liczba FP. Sam pakiet FP też nie jest bez winy, bo potrafi parsować -0, lecz nie potrafi jej już poprawnie przekształcić na ciąg ATASCII.

Wykonywanie programu

  • uruchomienie programu: 10 DIM A(10922) nie powoduje błędu, mimo że brakuje pamięci na deklarację tablicy o takich wymiarach (potrzeba na to 65538 bajtów).
  • uruchomienie programu: 10 TRAP 10:GET #1,A powoduje całkowite zapełnienie i "zawinięcie" się stosu procesora; instrukcja TRAP wprawdzie zdejmuje ze stosu pewną ilość danych, ale rzadko bywa to ilość właściwa. Ten sam błąd ma też Turbo BASIC XL.
  • porównanie dwóch funkcji CHR$ w jednym wyrażeniu jest zawsze prawdziwe, np. IF CHR$(1)=CHR$(2) THEN STOP spowoduje zatrzymanie programu. Ten sam błąd ma też Turbo BASIC XL.
  • instrukcje OPEN, XIO i POINT używają niewłaściwej procedury do pobierania parametrów numerycznych (GLNNUM $ABCD zamiast LETNUM $ABD7). Skutkiem tego jest ograniczenie wartości parametrów do zakresu 0-32767 (co w przypadku POINT ma istotne znaczenie) oraz bezsensowny komunikat błędu: "ERROR- 7" (= bad line number), gdy ten zakres zostanie przekroczony; pojawia się on po zadaniu interpreterowi np. OPEN #1,32768,0,"D:FOO.BAR".
  • instrukcje PUT lub PRINT na pliku otwartym do odczytu nie powodują błędu 135 "OPENED FOR READ ONLY", choć główna procedura CIO przeprowadza odpowiedni test - przyczyną takiego zachowania jest to, że BASIC wysyła dane bezpośrednio przez procedurę o adresie zapisanym w ICPUTB (patrz CIO). Analogiczne GET i INPUT na pliku otwartym do zapisu poprawnie zwracają błąd 131 "OPENED FOR WRITE ONLY".
  • ? 1^44 daje w wyniku dwa. Ale ? 2^44 daje już w miarę poprawny wynik "1.75921859E+13" (rzeczywiście jest to 17 592 186 044 416). Dokładność potęgowania wydatnie maleje wraz ze zwiększaniem wykładnika, np. 1^1505150010 = 3, 1^2385606310 = 4, 1^9999999999 = 100 itd. Zasadniczo nie jest to błąd interpretera Atari BASIC, lecz raczej procedury logarytmowania zawartej w pakiecie matematycznym.
  • funkcja ASC nie sprawdza długości swojego parametru i, zamiast zgłaszać błąd, zwraca wynik nawet dla pustego ciągu tekstowego, bezsensowny w tym przypadku.

Ciekawostki

  • W rev. B BASIC-a, pod adresem $BFF3-$BFF9 zapisany jest w kodach ekranowych ciąg "LWinner", sugerujący, że autorem tej rewizji jest Lane Winner.

Zobacz też

Odnośniki zewnętrzne

Personal tools