Atari BASIC

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:53, 7 lip 2006
KMK (Dyskusja | wkład)
(Tokeny Atari BASIC)
← Previous diff
Wersja z dnia 23:59, 7 lip 2006
KMK (Dyskusja | wkład)

Next diff →
Linia 4: Linia 4:
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]. 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].
 +
 +== Wersje rozwojowe ==
Dostępne są następujące wersje Atari BASIC-a: Dostępne są następujące wersje Atari BASIC-a:
Linia 12: Linia 14:
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. 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:
Linia 29: Linia 33:
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 [[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ę drobnych błędów, z których część dotyczy procedur kontroli 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(0)'''; wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej. 
-* 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]]. 
-* '''? 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]]. 
== Tokeny Atari BASIC == == Tokeny Atari BASIC ==
Linia 195: Linia 189:
<tr><td>$54</td><td>84</td><td>STRIG</td></tr> <tr><td>$54</td><td>84</td><td>STRIG</td></tr>
</table> </table>
 +
 +== 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.
 +
 +* 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.
 +* 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]].
 +* '''? 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]].
[[Kategoria:Oprogramowanie Atari 8-bit]] [[Kategoria:Oprogramowanie Atari 8-bit]]
[[Kategoria:Języki programowania]] [[Kategoria:Języki programowania]]

Wersja z dnia 23:59, 7 lip 2006

Właściwie Shepardson BASIC - 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.

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.

Spis treści

Wersje rozwojowe

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

  • Revision A (CO12402/CO14502): 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 (CO60302A): 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 C (CO24947A): pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów XL i wszystkich XE. Wydana także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów).

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.

Tokeny Atari BASIC

Program w BASIC-u przechowywany jest w pamięci oraz w plikach BAS jako zbiór symboli, tak zwanych tokenów. Dzielą się one na kilka grup w zależności od połozenia w programie. Grupy te to:

  • Numery wierszy programu. Numer oznaczający początek wiersza jest zakodowany w postaci dwubajtowej wartości całkowitej z zakresu od 0 do 32767. Wartość ta znajduje się na początku każdej linii programu. W pozostałych miejscach programu (np. jako numer po instrukcji GOTO) wartość ta zapisana jest w postaci zmiennoprzecinkowej.
  • Offset do następnej linii programu. Jest to bajt występujący zaraz po numerze wiersza.
  • Offset do następnej instrukcji - jest to jeden bajt występujący na początku każdej instrukcji.
  • Tokeny instrukcji
  • Tokeny operatorów i funkcji
  • Tokeny zmiennych

Tokeny instrukcji

Token instrukcji to ośmiobitowa liczba o wartości z zakresu teoretycznie od 0 do 255, w praktyce od 0 do 55; konstrukcja interpretera wyklucza zastosowanie tokenów instrukcji o wartości ponad 127. Ich wartości przedstawia poniższa tabela:

HexDecInstrukcja
$000REM
$011DATA
$022INPUT
$033COLOR
$044LIST
$055ENTER
$066LET
$077IF
$088FOR
$099NEXT
$0a10GOTO
$0b11GO TO
$0c12GOSUB
$0d13TRAP
$0e14BYE
$0f15CONT
$1016COM
$1117CLOSE
$1218CLR
$1319DEG
$1420DIM
$1521END
$1622NEW
$1723OPEN
$1824LOAD
$1925SAVE
$1a26STATUS
$1b27NOTE
$1c28POINT
$1d29XIO
$1e30ON
$1f31POKE
$2032PRINT
$2133RAD
$2234READ
$2335RESTORE
$2436RETURN
$2537RUN
$2638STOP
$2739POP
$2840?
$2941GET
$2a42PUT
$2b43GRAPHICS
$2c44PLOT
$2d45POSITION
$2e46DOS
$2f47DRAWTO
$3048SETCOLOR
$3149LOCATE
$3250SOUND
$3351LPRINT
$3452CSAVE
$3553CLOAD
$3654"domyślne" LET
$3755ERROR- (błąd składni)

Tokeny o wartościach wyższych nie są zdefiniowane, napotkanie ich przez interpreter w trakcie wykonywania programu powoduje przeważnie zawieszenie komputera.

Tokeny operatorów, funkcji i zmiennych

Taki token to ośmiobitowa liczba z zakresu od 0 do 255, oznaczająca operator, funkcję lub zmienną. Tokeny operatorów i funkcji mają wartości od 0 do 127 (z czego Atari BASIC używa zakresu od 14 do 84), natomiast tokeny zmiennych - wartości od 128 do 255. Jest to główny powód, dla którego program w Atari BASIC nie może mieć więcej niż 128 zmiennych. Token zmiennej to oczywiście jej numer kolejny w tabeli wartości zmiennych, powiekszony o 128.

HexDecOperator lub funkcja
$0e14stała liczbowa
$0f15stała tekstowa
$1016niewykorzystany
$1117niewykorzystany
$1218przecinek
$1319znak $
$1420koniec instrukcji
$1521średnik
$1622koniec linii
$1723GOTO w instrukcji ON
$1824GOSUB w instrukcji ON
$1925TO
$1a26STEP
$1b27THEN
$1c28znak #
$1d29liczbowe "mniejszy lub równy"
$1e30liczbowe "różny"
$1f31liczbowe "większy lub równy"
$2032liczbowe "mniejszy"
$2133liczbowe "większy"
$2234liczbowe "równy"
$2335operator potęgowania ^
$2436operator mnożenia *
$2537operator dodawania +
$2638operator odejmowania -
$2739operator dzielenia
$2840NOT
$2941OR
$2a42AND
$2b43nawias otwierający wyrażenie liczbowe
$2c44nawias zamykający wyrażenie liczbowe
$2d45operator przypisania wartości liczbowej =
$2e46operator przypisania wartości tekstowej =
$2f47tekstowe "mniejszy lub równy"
$3048tekstowe "różny"
$3149tekstowe "większy lub równy"
$3250tekstowe "mniejszy"
$3351tekstowe "większy"
$3452tekstowe "równy"
$3553+ znak liczby
$3654- znak liczby
$3755zm. tekstowa
$3856zm. tablicowa
$3957wymiar zm. tablicowej
$3a58funkcja
$3b59wymiar zm. tekstowej
$3c60przecinek w zm. tablicowej
$3d61STR$
$3e62CHR$
$3f63USR
$4064ASC
$4165VAL
$4266LEN
$4367ADR
$4468ATN
$4569COS
$4670PEEK
$4771SIN
$4872RND
$4973FRE
$4a74EXP
$4b75LOG
$4c76CLOG
$4d77SQR
$4e78SGN
$4f79ABS
$5080INT
$5181PADDLE
$5282STICK
$5383PTRIG
$5484STRIG

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.

  • 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.
  • 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.
  • ? 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.
Personal tools