Atari BASIC
From Atariki
Wersja z dnia 11:18, 8 lip 2006 KMK (Dyskusja | wkład) (→Tokeny operatorów, funkcji i zmiennych) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (→Wykonywanie programu) |
||
Linia 1: | Linia 1: | ||
- | 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 [http://en.wikipedia.org/wiki/Shepardson_Microsystems 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]]. | + | 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 [http://en.wikipedia.org/wiki/Shepardson_Microsystems 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]]. |
+ | |||
+ | == Cechy charakterystyczne == | ||
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. | 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ę [http://en.wikipedia.org/wiki/Data_General Data General]. | + | Powód tych różnic jest prosty: Atari BASIC nie jest "klonem" [http://en.wikipedia.org/wiki/Microsoft_Basic 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 == | == Wersje rozwojowe == | ||
Linia 9: | Linia 11: | ||
Dostępne są następujące wersje Atari BASIC-a: | 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 A (C012402/C014502)''': 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 B (C060302A)''': 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 nie występuje na kartridżu.[http://www.atarimagazines.com/v3n2/explore.html] |
- | * '''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). | + | * '''Revision C (C024947A)''': pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów [[XL]] i wszystkich [[XE]]. Dostępna także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów) co najmniej od czerwca 1984 r.[http://www.atarimagazines.com/v3n2/explore.html] |
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. | ||
Linia 19: | Linia 21: | ||
Atari BASIC doczekał się paru ulepszonych (ale kompatybilnych) odmian: | Atari BASIC doczekał się paru ulepszonych (ale kompatybilnych) odmian: | ||
- | * [[BASIC A Plus]] | + | * [[Altirra BASIC]] |
+ | * [[BASIC A Plus|BASIC A+]] | ||
* [[BASIC XL]] | * [[BASIC XL]] | ||
* [[BASIC XE]] | * [[BASIC XE]] | ||
* [[MultiBASIC]] | * [[MultiBASIC]] | ||
* [[Turbo BASIC XL]] | * [[Turbo BASIC XL]] | ||
+ | * [[U-BASIC]] | ||
Dostępne kompilatory: | Dostępne kompilatory: | ||
* [[ABC BASIC Compiler]] | * [[ABC BASIC Compiler]] | ||
- | * [[JLS BASIC]] | ||
* [[MMG BASIC Compiler]] | * [[MMG BASIC Compiler]] | ||
* [[Turbo BASIC XL Compiler]] | * [[Turbo BASIC XL Compiler]] | ||
- | 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 [[Atari Microsoft BASIC|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|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: | + | |
- | + | ||
- | <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> | + | |
- | + | ||
- | 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. | + | |
- | + | ||
- | <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>nawias otwierający indeks w zmiennej tekstowej</td></tr> | + | |
- | <tr><td>$38</td><td>56</td><td>nawias otwierający indeks w zmiennej tablicowej</td></tr> | + | |
- | <tr><td>$39</td><td>57</td><td>nawias otwierający wymiar zmiennej tablicowej</td></tr> | + | |
- | <tr><td>$3a</td><td>58</td><td>nawias otwierający argumenty funkcji</td></tr> | + | |
- | <tr><td>$3b</td><td>59</td><td>nawiast otwierający wymiar zmiennej tekstowej</td></tr> | + | |
- | <tr><td>$3c</td><td>60</td><td>przecinek w zmiennej 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> | + | |
== Błędy w Atari BASIC == | == 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. | + | W Atari BASIC rev. C zostało parę niezbyt istotnych błędów, z których część dotyczy procedur kontroli składni. |
+ | === Kontrola 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. | * 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. | + | * instrukcje NOTE i STATUS przyjmują tablicę numeryczną jako parametr, np. '''10 STATUS #1,A(1)'''; wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej. |
+ | * kontrola składni akceptuje znak ''Esc'' (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też [[Turbo BASIC XL]]. | ||
+ | * użycie '''NOT -0''' w programie powoduje podczas listowania wyświetlenie '''NOT -0E-<8''', co jest efektem błędu w tablicy kontroli składni: inaczej niż zazwyczaj '''-0''' parsowane jest w tym wypadku od razu jako liczba FP, a nie jako [[token]] negacji i dodatnia liczba FP. Sam [[pakiet matematyczny|pakiet FP]] też nie jest bez winy, bo potrafi parsować '''-0''', lecz nie potrafi jej już poprawnie przekształcić na ciąg [[ATASCII]]. | ||
+ | |||
+ | === Wykonywanie programu === | ||
+ | * uruchomienie programu: '''10 DIM A(10922)''' nie powoduje błędu, mimo że brakuje pamięci na deklarację tablicy o takich wymiarach (potrzeba na to 65538 bajtów). | ||
* 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]]. | * 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]]. | * 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]]. | ||
+ | * instrukcje OPEN, XIO i POINT używają niewłaściwej procedury do pobierania parametrów numerycznych (GLNNUM $ABCD zamiast LETNUM $ABD7). Skutkiem tego jest ograniczenie wartości parametrów do zakresu 0-32767 (co w przypadku POINT ma istotne znaczenie) oraz bezsensowny [[Kody_błędów_Atari_BASIC|komunikat błędu]]: "ERROR- 7" (= bad line number), gdy ten zakres zostanie przekroczony; pojawia się on po zadaniu interpreterowi np. '''OPEN #1,32768,0,"D:FOO.BAR"'''. | ||
+ | * instrukcje PUT lub PRINT na pliku otwartym do odczytu nie powodują błędu 135 "OPENED FOR READ ONLY", choć główna procedura CIO przeprowadza odpowiedni test - przyczyną takiego zachowania jest to, że BASIC wysyła dane bezpośrednio przez procedurę o adresie zapisanym w ICPUTB (patrz [[CIO]]). Analogiczne GET i INPUT na pliku otwartym do zapisu poprawnie zwracają błąd 131 "OPENED FOR WRITE ONLY". | ||
* '''? 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]]. | ||
+ | * funkcja ASC nie sprawdza długości swojego parametru i, zamiast zgłaszać błąd, zwraca wynik nawet dla pustego ciągu tekstowego, bezsensowny w tym przypadku. | ||
+ | |||
+ | ==Ciekawostki== | ||
+ | * W rev. B BASIC-a, pod adresem $BFF3-$BFF9 zapisany jest w [[Kody ekranowe|kodach ekranowych]] ciąg "LWinner", sugerujący, że autorem tej rewizji jest [[Lane Winner]]. | ||
+ | |||
+ | == Zobacz też == | ||
+ | * [[Kody błędów Atari BASIC]] | ||
+ | * [[Tokeny Atari BASIC]] | ||
+ | |||
+ | ==Odnośniki zewnętrzne== | ||
+ | *[http://www.atarimania.com/detail_soft.php?MENU=8&VERSION_ID=13284 Atari BASIC] (rewizja A, wraz z instrukcją) na [[Atarimania|Atarimanii]] | ||
+ | *[http://members.chello.nl/taf.offenga/basroms.zip Atari BASIC - wszystkie rewizje] ze strony [[Frankenstein|Freddy'ego Offengi]] | ||
+ | <!-- * [http://www.strotmann.de/twiki/pub/Infothek/AtBasicReferenceMa/basrefmanen.pdf Atari BASIC Reference Manual] (plik PDF) --> | ||
+ | * [http://atarimagazines.com/compute/issue61/323_1_INSIGHT_Atari.php Artykuł o błędach w Atari BASIC], [[Compute!]] nr 61 | ||
+ | *[http://en.wikipedia.org/wiki/Atari_BASIC Atari BASIC] w Wikipedii | ||
[[Kategoria:Oprogramowanie Atari 8-bit]] | [[Kategoria:Oprogramowanie Atari 8-bit]] | ||
[[Kategoria:Języki programowania]] | [[Kategoria:Języki programowania]] | ||
+ | [[Kategoria:BASIC]] |
Aktualna wersja
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.
Spis treści |
Cechy charakterystyczne
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.
Wersje rozwojowe
Dostępne są następujące wersje Atari BASIC-a:
- Revision A (C012402/C014502): 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 (C060302A): 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 nie występuje na kartridżu.[1]
- Revision C (C024947A): pozbawiona najgorszych błędów rewizji B, wbudowana w ostatnich partiach komputerów XL i wszystkich XE. Dostępna także w niewielkiej ilości na kartridżach (dla posiadaczy starszych komputerów) co najmniej od czerwca 1984 r.[2]
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.
Błędy w Atari BASIC
W Atari BASIC rev. C zostało parę niezbyt istotnych błędów, z których część dotyczy procedur kontroli składni.
Kontrola 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(1); wykonanie powoduje przypisanie wartości Bóg wie do czego, ale na pewno nie do wskazanej zmiennej.
- kontrola składni akceptuje znak Esc (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też Turbo BASIC XL.
- użycie NOT -0 w programie powoduje podczas listowania wyświetlenie NOT -0E-<8, co jest efektem błędu w tablicy kontroli składni: inaczej niż zazwyczaj -0 parsowane jest w tym wypadku od razu jako liczba FP, a nie jako token negacji i dodatnia liczba FP. Sam pakiet FP też nie jest bez winy, bo potrafi parsować -0, lecz nie potrafi jej już poprawnie przekształcić na ciąg ATASCII.
Wykonywanie programu
- uruchomienie programu: 10 DIM A(10922) nie powoduje błędu, mimo że brakuje pamięci na deklarację tablicy o takich wymiarach (potrzeba na to 65538 bajtów).
- 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.
- instrukcje OPEN, XIO i POINT używają niewłaściwej procedury do pobierania parametrów numerycznych (GLNNUM $ABCD zamiast LETNUM $ABD7). Skutkiem tego jest ograniczenie wartości parametrów do zakresu 0-32767 (co w przypadku POINT ma istotne znaczenie) oraz bezsensowny komunikat błędu: "ERROR- 7" (= bad line number), gdy ten zakres zostanie przekroczony; pojawia się on po zadaniu interpreterowi np. OPEN #1,32768,0,"D:FOO.BAR".
- instrukcje PUT lub PRINT na pliku otwartym do odczytu nie powodują błędu 135 "OPENED FOR READ ONLY", choć główna procedura CIO przeprowadza odpowiedni test - przyczyną takiego zachowania jest to, że BASIC wysyła dane bezpośrednio przez procedurę o adresie zapisanym w ICPUTB (patrz CIO). Analogiczne GET i INPUT na pliku otwartym do zapisu poprawnie zwracają błąd 131 "OPENED FOR WRITE ONLY".
- ? 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.
- funkcja ASC nie sprawdza długości swojego parametru i, zamiast zgłaszać błąd, zwraca wynik nawet dla pustego ciągu tekstowego, bezsensowny w tym przypadku.
Ciekawostki
- W rev. B BASIC-a, pod adresem $BFF3-$BFF9 zapisany jest w kodach ekranowych ciąg "LWinner", sugerujący, że autorem tej rewizji jest Lane Winner.
Zobacz też
Odnośniki zewnętrzne
- Atari BASIC (rewizja A, wraz z instrukcją) na Atarimanii
- Atari BASIC - wszystkie rewizje ze strony Freddy'ego Offengi
- Artykuł o błędach w Atari BASIC, Compute! nr 61
- Atari BASIC w Wikipedii