Atari BASIC

From Atariki

Revision as of 08:16, 24 sie 2006; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

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 (tutaj opis wersji na małe Atari), 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. Token zmiennej to oczywiście jej numer kolejny w tabeli wartości zmiennych, powiększony o 128. Jest to główny powód, dla którego program w Atari BASIC nie może mieć więcej niż 128 zmiennych.

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
$3755nawias otwierający indeks w zmiennej tekstowej
$3856nawias otwierający indeks w zmiennej tablicowej
$3957nawias otwierający wymiar zmiennej tablicowej
$3a58nawias otwierający argumenty funkcji
$3b59nawiast otwierający wymiar zmiennej tekstowej
$3c60przecinek w zmiennej 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