Atari BASIC

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:25, 7 lip 2006
KMK (Dyskusja | wkład)
(Tokeny instrukcji)
← Previous diff
Wersja z dnia 23:53, 7 lip 2006
KMK (Dyskusja | wkład)
(Tokeny Atari BASIC)
Next diff →
Linia 116: Linia 116:
Tokeny o wartościach wyższych nie są zdefiniowane, napotkanie ich przez interpreter w trakcie wykonywania programu powoduje przeważnie zawieszenie komputera. 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.
 +
 +<table border = 1 cellpadding = 5>
 +<tr><td><b>Hex</b></td><td><b>Dec</b></td><td><b>Operator lub funkcja</b></td></tr>
 +<tr><td>$0e</td><td>14</td><td>stała liczbowa</td></tr>
 +<tr><td>$0f</td><td>15</td><td>stała tekstowa</td></tr>
 +<tr><td>$10</td><td>16</td><td>niewykorzystany</td></tr>
 +<tr><td>$11</td><td>17</td><td>niewykorzystany</td></tr>
 +<tr><td>$12</td><td>18</td><td>przecinek</td></tr>
 +<tr><td>$13</td><td>19</td><td>znak $</td></tr>
 +<tr><td>$14</td><td>20</td><td>koniec instrukcji</td></tr>
 +<tr><td>$15</td><td>21</td><td>średnik</td></tr>
 +<tr><td>$16</td><td>22</td><td>koniec linii</td></tr>
 +<tr><td>$17</td><td>23</td><td>GOTO w instrukcji ON</td></tr>
 +<tr><td>$18</td><td>24</td><td>GOSUB w instrukcji ON</td></tr>
 +<tr><td>$19</td><td>25</td><td>TO</td></tr>
 +<tr><td>$1a</td><td>26</td><td>STEP</td></tr>
 +<tr><td>$1b</td><td>27</td><td>THEN</td></tr>
 +<tr><td>$1c</td><td>28</td><td>znak #</td></tr>
 +<tr><td>$1d</td><td>29</td><td>liczbowe "mniejszy lub równy"</td></tr>
 +<tr><td>$1e</td><td>30</td><td>liczbowe "różny"</td></tr>
 +<tr><td>$1f</td><td>31</td><td>liczbowe "większy lub równy"</td></tr>
 +<tr><td>$20</td><td>32</td><td>liczbowe "mniejszy"</td></tr>
 +<tr><td>$21</td><td>33</td><td>liczbowe "większy"</td></tr>
 +<tr><td>$22</td><td>34</td><td>liczbowe "równy"</td></tr>
 +<tr><td>$23</td><td>35</td><td>operator potęgowania ^</td></tr>
 +<tr><td>$24</td><td>36</td><td>operator mnożenia *</td></tr>
 +<tr><td>$25</td><td>37</td><td>operator dodawania +</td></tr>
 +<tr><td>$26</td><td>38</td><td>operator odejmowania -</td></tr>
 +<tr><td>$27</td><td>39</td><td>operator dzielenia</td></tr>
 +<tr><td>$28</td><td>40</td><td>NOT</td></tr>
 +<tr><td>$29</td><td>41</td><td>OR</td></tr>
 +<tr><td>$2a</td><td>42</td><td>AND</td></tr>
 +<tr><td>$2b</td><td>43</td><td>nawias otwierający wyrażenie liczbowe</td></tr>
 +<tr><td>$2c</td><td>44</td><td>nawias zamykający wyrażenie liczbowe</td></tr>
 +<tr><td>$2d</td><td>45</td><td>operator przypisania wartości liczbowej =</td></tr>
 +<tr><td>$2e</td><td>46</td><td>operator przypisania wartości tekstowej =</td></tr>
 +<tr><td>$2f</td><td>47</td><td>tekstowe "mniejszy lub równy"</td></tr>
 +<tr><td>$30</td><td>48</td><td>tekstowe "różny"</td></tr>
 +<tr><td>$31</td><td>49</td><td>tekstowe "większy lub równy"</td></tr>
 +<tr><td>$32</td><td>50</td><td>tekstowe "mniejszy"</td></tr>
 +<tr><td>$33</td><td>51</td><td>tekstowe "większy"</td></tr>
 +<tr><td>$34</td><td>52</td><td>tekstowe "równy"</td></tr>
 +<tr><td>$35</td><td>53</td><td>+ znak liczby</td></tr>
 +<tr><td>$36</td><td>54</td><td>- znak liczby</td></tr>
 +<tr><td>$37</td><td>55</td><td>zm. tekstowa</td></tr>
 +<tr><td>$38</td><td>56</td><td>zm. tablicowa</td></tr>
 +<tr><td>$39</td><td>57</td><td>wymiar zm. tablicowej</td></tr>
 +<tr><td>$3a</td><td>58</td><td>funkcja</td></tr>
 +<tr><td>$3b</td><td>59</td><td>wymiar zm. tekstowej</td></tr>
 +<tr><td>$3c</td><td>60</td><td>przecinek w zm. tablicowej</td></tr>
 +<tr><td>$3d</td><td>61</td><td>STR$</td></tr>
 +<tr><td>$3e</td><td>62</td><td>CHR$</td></tr>
 +<tr><td>$3f</td><td>63</td><td>USR</td></tr>
 +<tr><td>$40</td><td>64</td><td>ASC</td></tr>
 +<tr><td>$41</td><td>65</td><td>VAL</td></tr>
 +<tr><td>$42</td><td>66</td><td>LEN</td></tr>
 +<tr><td>$43</td><td>67</td><td>ADR</td></tr>
 +<tr><td>$44</td><td>68</td><td>ATN</td></tr>
 +<tr><td>$45</td><td>69</td><td>COS</td></tr>
 +<tr><td>$46</td><td>70</td><td>PEEK</td></tr>
 +<tr><td>$47</td><td>71</td><td>SIN</td></tr>
 +<tr><td>$48</td><td>72</td><td>RND</td></tr>
 +<tr><td>$49</td><td>73</td><td>FRE</td></tr>
 +<tr><td>$4a</td><td>74</td><td>EXP</td></tr>
 +<tr><td>$4b</td><td>75</td><td>LOG</td></tr>
 +<tr><td>$4c</td><td>76</td><td>CLOG</td></tr>
 +<tr><td>$4d</td><td>77</td><td>SQR</td></tr>
 +<tr><td>$4e</td><td>78</td><td>SGN</td></tr>
 +<tr><td>$4f</td><td>79</td><td>ABS</td></tr>
 +<tr><td>$50</td><td>80</td><td>INT</td></tr>
 +<tr><td>$51</td><td>81</td><td>PADDLE</td></tr>
 +<tr><td>$52</td><td>82</td><td>STICK</td></tr>
 +<tr><td>$53</td><td>83</td><td>PTRIG</td></tr>
 +<tr><td>$54</td><td>84</td><td>STRIG</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:53, 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.

Spis treści

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