Atari BASIC
From Atariki
Wersja z dnia 10:02, 30 cze 2006 Mikey (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 23:23, 7 lip 2006 KMK (Dyskusja | wkład) Next diff → |
||
Linia 39: | Linia 39: | ||
* 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]]. | * 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]]. | * '''? 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 == | ||
+ | |||
+ | 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. ch wartości przedstawia poniższa tabela: | ||
+ | |||
+ | <table border = 1 cellpadding = 5> | ||
+ | <tr><td><b>Hex</b></td><td><b>Dec</b></td><td><b>Instrukcja</b></td></tr> | ||
+ | <tr><td>$00</td><td>0</td><td>REM</td></tr> | ||
+ | <tr><td>$01</td><td>1</td><td>DATA</td></tr> | ||
+ | <tr><td>$02</td><td>2</td><td>INPUT</td></tr> | ||
+ | <tr><td>$03</td><td>3</td><td>COLOR</td></tr> | ||
+ | <tr><td>$04</td><td>4</td><td>LIST</td></tr> | ||
+ | <tr><td>$05</td><td>5</td><td>ENTER</td></tr> | ||
+ | <tr><td>$06</td><td>6</td><td>LET</td></tr> | ||
+ | <tr><td>$07</td><td>7</td><td>IF</td></tr> | ||
+ | <tr><td>$08</td><td>8</td><td>FOR</td></tr> | ||
+ | <tr><td>$09</td><td>9</td><td>NEXT</td></tr> | ||
+ | <tr><td>$0a</td><td>10</td><td>GOTO</td></tr> | ||
+ | <tr><td>$0b</td><td>11</td><td>GO TO</td></tr> | ||
+ | <tr><td>$0c</td><td>12</td><td>GOSUB</td></tr> | ||
+ | <tr><td>$0d</td><td>13</td><td>TRAP</td></tr> | ||
+ | <tr><td>$0e</td><td>14</td><td>BYE</td></tr> | ||
+ | <tr><td>$0f</td><td>15</td><td>CONT</td></tr> | ||
+ | <tr><td>$10</td><td>16</td><td>COM</td></tr> | ||
+ | <tr><td>$11</td><td>17</td><td>CLOSE</td></tr> | ||
+ | <tr><td>$12</td><td>18</td><td>CLR</td></tr> | ||
+ | <tr><td>$13</td><td>19</td><td>DEG</td></tr> | ||
+ | <tr><td>$14</td><td>20</td><td>DIM</td></tr> | ||
+ | <tr><td>$15</td><td>21</td><td>END</td></tr> | ||
+ | <tr><td>$16</td><td>22</td><td>NEW</td></tr> | ||
+ | <tr><td>$17</td><td>23</td><td>OPEN</td></tr> | ||
+ | <tr><td>$18</td><td>24</td><td>LOAD</td></tr> | ||
+ | <tr><td>$19</td><td>25</td><td>SAVE</td></tr> | ||
+ | <tr><td>$1a</td><td>26</td><td>STATUS</td></tr> | ||
+ | <tr><td>$1b</td><td>27</td><td>NOTE</td></tr> | ||
+ | <tr><td>$1c</td><td>28</td><td>POINT</td></tr> | ||
+ | <tr><td>$1d</td><td>29</td><td>XIO</td></tr> | ||
+ | <tr><td>$1e</td><td>30</td><td>ON</td></tr> | ||
+ | <tr><td>$1f</td><td>31</td><td>POKE</td></tr> | ||
+ | <tr><td>$20</td><td>32</td><td>PRINT</td></tr> | ||
+ | <tr><td>$21</td><td>33</td><td>RAD</td></tr> | ||
+ | <tr><td>$22</td><td>34</td><td>READ</td></tr> | ||
+ | <tr><td>$23</td><td>35</td><td>RESTORE</td></tr> | ||
+ | <tr><td>$24</td><td>36</td><td>RETURN</td></tr> | ||
+ | <tr><td>$25</td><td>37</td><td>RUN</td></tr> | ||
+ | <tr><td>$26</td><td>38</td><td>STOP</td></tr> | ||
+ | <tr><td>$27</td><td>39</td><td>POP</td></tr> | ||
+ | <tr><td>$28</td><td>40</td><td>?</td></tr> | ||
+ | <tr><td>$29</td><td>41</td><td>GET</td></tr> | ||
+ | <tr><td>$2a</td><td>42</td><td>PUT</td></tr> | ||
+ | <tr><td>$2b</td><td>43</td><td>GRAPHICS</td></tr> | ||
+ | <tr><td>$2c</td><td>44</td><td>PLOT</td></tr> | ||
+ | <tr><td>$2d</td><td>45</td><td>POSITION</td></tr> | ||
+ | <tr><td>$2e</td><td>46</td><td>DOS</td></tr> | ||
+ | <tr><td>$2f</td><td>47</td><td>DRAWTO</td></tr> | ||
+ | <tr><td>$30</td><td>48</td><td>SETCOLOR</td></tr> | ||
+ | <tr><td>$31</td><td>49</td><td>LOCATE</td></tr> | ||
+ | <tr><td>$32</td><td>50</td><td>SOUND</td></tr> | ||
+ | <tr><td>$33</td><td>51</td><td>LPRINT</td></tr> | ||
+ | <tr><td>$34</td><td>52</td><td>CSAVE</td></tr> | ||
+ | <tr><td>$35</td><td>53</td><td>CLOAD</td></tr> | ||
+ | <tr><td>$36</td><td>54</td><td>"domyślne" LET</td></tr> | ||
+ | <tr><td>$37</td><td>55</td><td>ERROR- (błąd składni)</td></tr> | ||
+ | </table> | ||
[[Kategoria:Oprogramowanie Atari 8-bit]] | [[Kategoria:Oprogramowanie Atari 8-bit]] | ||
[[Kategoria:Języki programowania]] | [[Kategoria:Języki programowania]] |
Wersja z dnia 23:23, 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.
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.
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ę 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.
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. ch 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) |