Atari BASIC: Różnice pomiędzy wersjami
→"Klony" Atari BASIC: link again... |
m →Tokeny Atari BASIC: Odlinkowanie "tokenów" - wyjaśnione w dalszej części artykułu... |
||
| Linia 36: | Linia 36: | ||
== Tokeny Atari BASIC == | == Tokeny Atari BASIC == | ||
Program w BASIC-u przechowywany jest w pamięci oraz w plikach BAS jako zbiór symboli, tak zwanych | 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. | * 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. | ||
Wersja z 24 sie 2006, 10:20
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.
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:
| Hex | Dec | Instrukcja |
| $00 | 0 | REM |
| $01 | 1 | DATA |
| $02 | 2 | INPUT |
| $03 | 3 | COLOR |
| $04 | 4 | LIST |
| $05 | 5 | ENTER |
| $06 | 6 | LET |
| $07 | 7 | IF |
| $08 | 8 | FOR |
| $09 | 9 | NEXT |
| $0a | 10 | GOTO |
| $0b | 11 | GO TO |
| $0c | 12 | GOSUB |
| $0d | 13 | TRAP |
| $0e | 14 | BYE |
| $0f | 15 | CONT |
| $10 | 16 | COM |
| $11 | 17 | CLOSE |
| $12 | 18 | CLR |
| $13 | 19 | DEG |
| $14 | 20 | DIM |
| $15 | 21 | END |
| $16 | 22 | NEW |
| $17 | 23 | OPEN |
| $18 | 24 | LOAD |
| $19 | 25 | SAVE |
| $1a | 26 | STATUS |
| $1b | 27 | NOTE |
| $1c | 28 | POINT |
| $1d | 29 | XIO |
| $1e | 30 | ON |
| $1f | 31 | POKE |
| $20 | 32 | |
| $21 | 33 | RAD |
| $22 | 34 | READ |
| $23 | 35 | RESTORE |
| $24 | 36 | RETURN |
| $25 | 37 | RUN |
| $26 | 38 | STOP |
| $27 | 39 | POP |
| $28 | 40 | ? |
| $29 | 41 | GET |
| $2a | 42 | PUT |
| $2b | 43 | GRAPHICS |
| $2c | 44 | PLOT |
| $2d | 45 | POSITION |
| $2e | 46 | DOS |
| $2f | 47 | DRAWTO |
| $30 | 48 | SETCOLOR |
| $31 | 49 | LOCATE |
| $32 | 50 | SOUND |
| $33 | 51 | LPRINT |
| $34 | 52 | CSAVE |
| $35 | 53 | CLOAD |
| $36 | 54 | "domyślne" LET |
| $37 | 55 | ERROR- (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.
| Hex | Dec | Operator lub funkcja |
| $0e | 14 | stała liczbowa |
| $0f | 15 | stała tekstowa |
| $10 | 16 | niewykorzystany |
| $11 | 17 | niewykorzystany |
| $12 | 18 | przecinek |
| $13 | 19 | znak $ |
| $14 | 20 | koniec instrukcji |
| $15 | 21 | średnik |
| $16 | 22 | koniec linii |
| $17 | 23 | GOTO w instrukcji ON |
| $18 | 24 | GOSUB w instrukcji ON |
| $19 | 25 | TO |
| $1a | 26 | STEP |
| $1b | 27 | THEN |
| $1c | 28 | znak # |
| $1d | 29 | liczbowe "mniejszy lub równy" |
| $1e | 30 | liczbowe "różny" |
| $1f | 31 | liczbowe "większy lub równy" |
| $20 | 32 | liczbowe "mniejszy" |
| $21 | 33 | liczbowe "większy" |
| $22 | 34 | liczbowe "równy" |
| $23 | 35 | operator potęgowania ^ |
| $24 | 36 | operator mnożenia * |
| $25 | 37 | operator dodawania + |
| $26 | 38 | operator odejmowania - |
| $27 | 39 | operator dzielenia |
| $28 | 40 | NOT |
| $29 | 41 | OR |
| $2a | 42 | AND |
| $2b | 43 | nawias otwierający wyrażenie liczbowe |
| $2c | 44 | nawias zamykający wyrażenie liczbowe |
| $2d | 45 | operator przypisania wartości liczbowej = |
| $2e | 46 | operator przypisania wartości tekstowej = |
| $2f | 47 | tekstowe "mniejszy lub równy" |
| $30 | 48 | tekstowe "różny" |
| $31 | 49 | tekstowe "większy lub równy" |
| $32 | 50 | tekstowe "mniejszy" |
| $33 | 51 | tekstowe "większy" |
| $34 | 52 | tekstowe "równy" |
| $35 | 53 | + znak liczby |
| $36 | 54 | - znak liczby |
| $37 | 55 | nawias otwierający indeks w zmiennej tekstowej |
| $38 | 56 | nawias otwierający indeks w zmiennej tablicowej |
| $39 | 57 | nawias otwierający wymiar zmiennej tablicowej |
| $3a | 58 | nawias otwierający argumenty funkcji |
| $3b | 59 | nawiast otwierający wymiar zmiennej tekstowej |
| $3c | 60 | przecinek w zmiennej tablicowej |
| $3d | 61 | STR$ |
| $3e | 62 | CHR$ |
| $3f | 63 | USR |
| $40 | 64 | ASC |
| $41 | 65 | VAL |
| $42 | 66 | LEN |
| $43 | 67 | ADR |
| $44 | 68 | ATN |
| $45 | 69 | COS |
| $46 | 70 | PEEK |
| $47 | 71 | SIN |
| $48 | 72 | RND |
| $49 | 73 | FRE |
| $4a | 74 | EXP |
| $4b | 75 | LOG |
| $4c | 76 | CLOG |
| $4d | 77 | SQR |
| $4e | 78 | SGN |
| $4f | 79 | ABS |
| $50 | 80 | INT |
| $51 | 81 | PADDLE |
| $52 | 82 | STICK |
| $53 | 83 | PTRIG |
| $54 | 84 | STRIG |
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.