Turbo BASIC XL
From Atariki
Wersja z dnia 14:43, 8 lip 2006 KMK (Dyskusja | wkład) (→Tokeny operatorów i funkcji) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (ups) |
||
Linia 1: | Linia 1: | ||
{{grafr|tbxl.png}} | {{grafr|tbxl.png}} | ||
- | Odmiana języka [[BASIC]] dla komputera Atari [[XL]]/[[XE]], stworzona w 1985 roku przez niemieckiego programistę [[Frank Ostrowski|Franka Ostrowskiego]] i rozpowszechniona jako program public domain przez czasopismo "Happy Computer". Oprócz wersji XL istnieje też odmiana przeznaczona dla komputerów serii [[400/800]]. | + | Odmiana języka [[BASIC]] dla [[Atari 8-bit|małego Atari]], stworzona w 1985 roku przez niemieckiego programistę [[Frank Ostrowski|Franka Ostrowskiego]] i rozpowszechniona jako program public domain przez czasopismo "Happy Computer". Istnieją dwie oficjalne wersje: |
+ | * Turbo-BASIC 1.4 - dla komputerów [[400/800]] z min. 32 KB [[RAM]]. Ta wersja ma wbudowany [[DOS 2.0]] - interpreter jest "doklejony" do pliku DOS.SYS. | ||
+ | * Turbo-BASIC XL 1.5 - dla komputerów [[XL]]/[[XE]]. Ta wersja ładuje się częściowo do [[RAM]]-u pod [[ROM]] systemu operacyjnego, przez co udostępnia więcej pamięci na program użytkownika (nieco ponad 33k - instrukcja ''? FRE(0)'' podaje wynik 34021 bajtów). | ||
- | Turbo BASIC wgrywa się do pamięci [[RAM]] komputera z dysku lub taśmy. Interpreter charakteryzuje się dużą ilością rozszerzeń w stosunku do oryginalnego [[Atari BASIC]]-a, istnieje też kompilator [[Turbo BASIC XL Compiler]]. | + | Oprócz tego powstało kilka nieoficjalnych modyfikacji: |
- | Pierwszorzędną zaletą Turbo BASIC-a XL jest jego szybkość, programy wykonywane są od trzech do pięciu razy szybciej niż w interpreterze Atari BASIC, co jest w sporej mierze wynikiem tego, iż Turbo BASIC ma własny, bardzo szybki [[pakiet matematyczny|pakiet procedur zmiennoprzecinkowych]], który sprawdza się świetnie w większości zastosowań. | + | * Turbo-BASIC XL 2.0 - hack wersji 1.5 ze zmienionym tekstem tytułowym, o treści "(c) 1990 LASER software". Inne różnice nieznane. |
+ | * Turbo-BASIC XL 2.0 & Turbo 2000 System (występuje też pod tytułem TT-Basic XL 2.11) - modyfikacja wersji 1.5 dokonana przez [[Jiří Richter|Jiříego Richtera]], autora [[Turbo 2000 (czechosłowackie)|czeskiego Turbo 2000]], w 1988 roku. Zawiera zintegrowany mini-DOS do systemu turbo oraz handler urządzenia [[T:]]. | ||
+ | * Turbo BASIC 3.2q - wersja 1.4 przystosowana do współpracy ze [[SpartaDOS]]-em 3.2, autorstwa [[Tom Hunt|Toma Hunta]] z 1992 roku. Brakuje w niej komend BPUT i BGET, aczkolwiek można je zastąpić odpowiednimi wywołaniami XIO. W pakiecie z interpreterem jest handler do obsługi [[P:R: Connection]] wraz z programikiem do ładowania tegoż handlera z poziomu BASIC-a. | ||
- | == Tokeny Turbo BASIC-a == | + | Turbo BASIC wgrywa się do pamięci [[RAM]] komputera z dysku lub taśmy. Interpreter charakteryzuje się większą ilością instrukcji w stosunku do oryginalnego [[Atari BASIC]]-a, istnieje też kompilator [[Turbo BASIC XL Compiler]]. |
- | Zasadnicza struktura programu w Turbo BASIC-u XL jest taka sama, jak w [[Atari BASIC]] - zmiany polegają wyłącznie na dodaniu nowych instrukcji, funkcji i operatorów do listy tychże znanych interpreterowi Atari BASIC. | + | Pierwszorzędną zaletą Turbo BASIC-a XL jest jego szybkość, programy wykonywane są od trzech do pięciu razy szybciej niż w interpreterze Atari BASIC, co jest w dużej mierze wynikiem tego, że Turbo BASIC ma własny, bardzo szybki [[pakiet matematyczny|pakiet procedur zmiennoprzecinkowych]], który sprawdza się świetnie w większości zastosowań. |
- | === Tokeny instrukcji === | + | Inną istotną zaletą interpretera jest wsteczna kompatybilność z [[Atari BASIC]]-iem, dzięki czemu nieomal wszystkie programy napisane w tym ostatnim uruchomią się pod Turbo BASIC-iem XL (z nielicznymi wyjątkami). |
- | Tokeny o kodach poniżej 56 są takie same jak w Atari BASIC, patrz [[Atari BASIC#Tokeny instrukcji|Tokeny instrukcji Atari BASIC]]. | + | W roku 2021 powstała wersja "relokowalna" Turbo-BASIC-a 1.5, charakteryzująca się większą ilością dostępnej pamięci (w zależności od tego, ile miejsca zajmuje DOS) oraz poprawkami niektórych błędów. Autorem modyfikacji jest [[dmsc]]. |
- | + | ||
- | <table border = 1 cellpadding = 5> | + | |
- | <tr><td><b>Hex</b></td><td><b>Dec</b></td><td><b>Instrukcja</b></td></tr> | + | |
- | <tr><td>$38</td><td>56</td><td>DPOKE</td></tr> | + | |
- | <tr><td>$39</td><td>57</td><td>MOVE</td></tr> | + | |
- | <tr><td>$3a</td><td>58</td><td>-MOVE</td></tr> | + | |
- | <tr><td>$3b</td><td>59</td><td>*F</td></tr> | + | |
- | <tr><td>$3c</td><td>60</td><td>REPEAT</td></tr> | + | |
- | <tr><td>$3d</td><td>61</td><td>UNTIL</td></tr> | + | |
- | <tr><td>$3e</td><td>62</td><td>WHILE</td></tr> | + | |
- | <tr><td>$3f</td><td>63</td><td>WEND</td></tr> | + | |
- | <tr><td>$40</td><td>64</td><td>ELSE</td></tr> | + | |
- | <tr><td>$41</td><td>65</td><td>ENDIF</td></tr> | + | |
- | <tr><td>$42</td><td>66</td><td>BPUT</td></tr> | + | |
- | <tr><td>$43</td><td>67</td><td>BGET</td></tr> | + | |
- | <tr><td>$44</td><td>68</td><td>FILLTO</td></tr> | + | |
- | <tr><td>$45</td><td>69</td><td>DO</td></tr> | + | |
- | <tr><td>$46</td><td>70</td><td>LOOP</td></tr> | + | |
- | <tr><td>$47</td><td>71</td><td>EXIT</td></tr> | + | |
- | <tr><td>$48</td><td>72</td><td>DIR</td></tr> | + | |
- | <tr><td>$49</td><td>73</td><td>LOCK</td></tr> | + | |
- | <tr><td>$4a</td><td>74</td><td>UNLOCK</td></tr> | + | |
- | <tr><td>$4b</td><td>75</td><td>RENAME</td></tr> | + | |
- | <tr><td>$4c</td><td>76</td><td>DELETE</td></tr> | + | |
- | <tr><td>$4d</td><td>77</td><td>PAUSE</td></tr> | + | |
- | <tr><td>$4e</td><td>78</td><td>TIME$=</td></tr> | + | |
- | <tr><td>$4f</td><td>79</td><td>PROC</td></tr> | + | |
- | <tr><td>$50</td><td>80</td><td>EXEC</td></tr> | + | |
- | <tr><td>$51</td><td>81</td><td>ENDPROC</td></tr> | + | |
- | <tr><td>$52</td><td>82</td><td>FCOLOR</td></tr> | + | |
- | <tr><td>$53</td><td>83</td><td>*L</td></tr> | + | |
- | <tr><td>$54</td><td>84</td><td>--</td></tr> | + | |
- | <tr><td>$55</td><td>85</td><td>RENUM</td></tr> | + | |
- | <tr><td>$56</td><td>86</td><td>DEL</td></tr> | + | |
- | <tr><td>$57</td><td>87</td><td>DUMP</td></tr> | + | |
- | <tr><td>$58</td><td>88</td><td>TRACE</td></tr> | + | |
- | <tr><td>$59</td><td>89</td><td>TEXT</td></tr> | + | |
- | <tr><td>$5a</td><td>90</td><td>BLOAD</td></tr> | + | |
- | <tr><td>$5b</td><td>91</td><td>BRUN</td></tr> | + | |
- | <tr><td>$5c</td><td>92</td><td>GO#</td></tr> | + | |
- | <tr><td>$5d</td><td>93</td><td># (etykieta)</td></tr> | + | |
- | <tr><td>$5e</td><td>94</td><td>*B</td></tr> | + | |
- | <tr><td>$5f</td><td>95</td><td>PAINT</td></tr> | + | |
- | <tr><td>$60</td><td>96</td><td>CLS</td></tr> | + | |
- | <tr><td>$61</td><td>97</td><td>DSOUND</td></tr> | + | |
- | <tr><td>$62</td><td>98</td><td>CIRCLE</td></tr> | + | |
- | <tr><td>$63</td><td>99</td><td>%PUT</td></tr> | + | |
- | <tr><td>$64</td><td>100</td><td>%GET</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | Tokeny o kodach powyżej 100 sa niezdefiniowane. | + | |
- | + | ||
- | === Tokeny operatorów i funkcji === | + | |
- | + | ||
- | Tokeny o kodach od 14 do 84 są takie same jak w Atari BASIC, patrz [[Atari BASIC#Tokeny operatorów, funkcji i zmiennych|Tokeny operatorów, funkcji i zmiennych Atari BASIC]]. | + | |
- | + | ||
- | <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>$00</td><td>0</td><td>prefiks tokenu zmiennej</td></tr> | + | |
- | <tr><td>$01-$0C</td><td>1-12</td><td>niezdefiniowane</td></tr> | + | |
- | <tr><td>$0d</td><td>13</td><td>stała szesnastkowa</td></tr> | + | |
- | <tr><td>$0e</td><td>14</td><td>stała dziesiętna</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> | + | |
- | <tr><td>$55</td><td>85</td><td>DPEEK</td></tr> | + | |
- | <tr><td>$56</td><td>86</td><td>binarne AND</td></tr> | + | |
- | <tr><td>$57</td><td>87</td><td>binarne OR</td></tr> | + | |
- | <tr><td>$58</td><td>88</td><td>INSTR</td></tr> | + | |
- | <tr><td>$59</td><td>89</td><td>INKEY$</td></tr> | + | |
- | <tr><td>$5a</td><td>90</td><td>EXOR</td></tr> | + | |
- | <tr><td>$5b</td><td>91</td><td>HEX$</td></tr> | + | |
- | <tr><td>$5c</td><td>92</td><td>DEC</td></tr> | + | |
- | <tr><td>$5d</td><td>93</td><td>DIV</td></tr> | + | |
- | <tr><td>$5e</td><td>94</td><td>FRAC</td></tr> | + | |
- | <tr><td>$5f</td><td>95</td><td>TIME$</td></tr> | + | |
- | <tr><td>$60</td><td>96</td><td>TIME</td></tr> | + | |
- | <tr><td>$61</td><td>97</td><td>MOD</td></tr> | + | |
- | <tr><td>$62</td><td>98</td><td>EXEC w ON</td></tr> | + | |
- | <tr><td>$63</td><td>99</td><td>RND</td></tr> | + | |
- | <tr><td>$64</td><td>100</td><td>RAND</td></tr> | + | |
- | <tr><td>$65</td><td>101</td><td>TRUNC</td></tr> | + | |
- | <tr><td>$66</td><td>102</td><td>%0</td></tr> | + | |
- | <tr><td>$67</td><td>103</td><td>%1</td></tr> | + | |
- | <tr><td>$68</td><td>104</td><td>%2</td></tr> | + | |
- | <tr><td>$69</td><td>105</td><td>%3</td></tr> | + | |
- | <tr><td>$6a</td><td>106</td><td>GO# w ON</td></tr> | + | |
- | <tr><td>$6b</td><td>107</td><td>UINSTR</td></tr> | + | |
- | <tr><td>$6c</td><td>108</td><td>ERR</td></tr> | + | |
- | <tr><td>$6d</td><td>109</td><td>ERL</td></tr> | + | |
- | </table> | + | |
- | + | ||
- | Tokeny po kodach ponad 109 są niezdefiniowane. | + | |
- | + | ||
- | === Tokeny zmiennych === | + | |
- | + | ||
- | Tokeny zmiennych są zasadniczo takie same jak w Atari BASIC, tj. token jest to ośmiobitowy numer kolejny zmiennej w tablicy wartości zmiennych, zwiększony o 128. System ten ogranicza liczbę zmiennych w Atari BASIC do 128. Turbo BASIC XL jednak pozwala na użycie większej liczby zmiennych przez zastosowanie prefiksu o kodzie $00, wykazanego w powyższej tabeli jako "prefiks tokenu zmiennej". | + | |
- | + | ||
- | Napotkanie go w miejscu oczekiwanego tokenu operatora, funkcji lub zmiennej oznacza, że następny bajt zawiera właściwy token zmiennej z zestawu powyżej pierwszych 128 zmiennych. Token ten jest to numer zmiennej w tabeli wartości zmiennych, zmniejszony o 128 - a więc następująca po prefiksie liczba $00 oznacza zmienną numer 128 (licząc, że pierwsza ma numer 0), $01 - numer 129 i tak dalej. | + | |
- | + | ||
- | Prefiks zwiększa zakres tokenów zmiennych o 256 ponad podstawowe 128, a więc razem "pojemność systemu" wynosi w tym wypadku 384 zmienne. Wydaje się jednak, że Turbo BASIC XL nie pozwala zdefiniować więcej niż 256 zmiennych. | + | |
== Błędy w Turbo BASIC-u == | == Błędy w Turbo BASIC-u == | ||
+ | * kontrola składni nie przyjmuje słów kluczowych '''%GET''', '''%PUT''' i '''-MOVE''', jeśli są wpisane małymi literami. | ||
+ | * kontrola składni przyjmuje zmienne tekstowe jako argumenty instrukcji '''GET''', chociaż ta może zapisywać wartości tylko do zmiennych numerycznych. | ||
+ | * kontrola składni akceptuje znak ''Esc'' (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też [[Atari BASIC]]. | ||
* 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ż [[Atari BASIC]]. | * 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ż [[Atari BASIC]]. | ||
* 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ż [[Atari BASIC]]. | * 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ż [[Atari BASIC]]. | ||
- | * kontrola składni nie przyjmuje słów kluczowych '''%GET''', '''%PUT''' i '''-MOVE''' jeśli są wpisane małymi literami. | ||
- | * kontrola składni przyjmuje zmienne tekstowe jako argumenty instrukcji '''GET''', chociaż ta może zapisywać wartości tylko do zmiennych numerycznych. | ||
* funkcja '''DEC''' źle działa, jeśli przekazana jej liczba szesnastkowa zawiera małe litery. | * funkcja '''DEC''' źle działa, jeśli przekazana jej liczba szesnastkowa zawiera małe litery. | ||
+ | * zakończenie łańcucha tekstowego znakiem Ctrl/R (ASCII 18) powoduje takie zachowanie interpretera, jakby po cudzysłowie zamykającym łańcuch znajdował się średnik (np. '''? "NATENCZAS ^R":? "WOJSKI"''' zachowuje się jak '''? "NATENCZAS ^R";:? "WOJSKI"'''). Ten sam błąd ma Atari BASIC rev. A. | ||
+ | * interpreter w wersji 1.5 po uruchomieniu się ustawia wskaźnik MEMLO na adres $3629 i nigdy nie przywraca poprzedniej wartości: żeby ustawić sensowną wartość MEMLO pod np. [[MyDOS]]-em, trzeba po wyjściu z interpretera wcisnąć klawisz RESET. | ||
+ | |||
+ | ==Zobacz też== | ||
+ | * [[Kody błędów Turbo BASIC-a XL]] | ||
+ | * [[Tokeny Turbo BASIC XL]] | ||
+ | |||
+ | ==Linki zewnętrzne== | ||
+ | <!-- * [http://users.htcomp.net/tbelding/misc/turbobasic_xl.html Turbo-BASIC XL manual] --> | ||
+ | * [http://www.tmeyer.de/atari/index.html Strona z oryginalnym artykułem o Turbo-Basicu XL] wraz z kompilatorem (pliki pdf z Happy Computera) | ||
+ | * [http://ftp.pigwa.net/stuff/mirror/turbobasicxlandaction.com/ Mirror strony o Turbo Basicu i Action! prowadzonej kiedyś przez Sikora] | ||
+ | * [http://atariage.com/forums/topic/266070-turbobasic-xl-v15-mads-source-disassembly/ Pełny kod źródłowy TBXL w formacie cross-asemblera MADS] | ||
+ | * [https://atariwiki.org/wiki/Wiki.jsp?page=TURBO-BASIC%20XL Dużo informacji o TBXL i jego autorze] | ||
+ | * [https://github.com/dmsc/turbo-dis Kod źródłowy (i binaria) wersji relokowalnej z 2021 roku] | ||
- | {{stub}} | ||
[[Kategoria:Oprogramowanie Atari 8-bit]] | [[Kategoria:Oprogramowanie Atari 8-bit]] | ||
[[Kategoria:Języki programowania]] | [[Kategoria:Języki programowania]] | ||
+ | [[Kategoria:BASIC]] |
Aktualna wersja
Odmiana języka BASIC dla małego Atari, stworzona w 1985 roku przez niemieckiego programistę Franka Ostrowskiego i rozpowszechniona jako program public domain przez czasopismo "Happy Computer". Istnieją dwie oficjalne wersje:
- Turbo-BASIC 1.4 - dla komputerów 400/800 z min. 32 KB RAM. Ta wersja ma wbudowany DOS 2.0 - interpreter jest "doklejony" do pliku DOS.SYS.
- Turbo-BASIC XL 1.5 - dla komputerów XL/XE. Ta wersja ładuje się częściowo do RAM-u pod ROM systemu operacyjnego, przez co udostępnia więcej pamięci na program użytkownika (nieco ponad 33k - instrukcja ? FRE(0) podaje wynik 34021 bajtów).
Oprócz tego powstało kilka nieoficjalnych modyfikacji:
- Turbo-BASIC XL 2.0 - hack wersji 1.5 ze zmienionym tekstem tytułowym, o treści "(c) 1990 LASER software". Inne różnice nieznane.
- Turbo-BASIC XL 2.0 & Turbo 2000 System (występuje też pod tytułem TT-Basic XL 2.11) - modyfikacja wersji 1.5 dokonana przez Jiříego Richtera, autora czeskiego Turbo 2000, w 1988 roku. Zawiera zintegrowany mini-DOS do systemu turbo oraz handler urządzenia T:.
- Turbo BASIC 3.2q - wersja 1.4 przystosowana do współpracy ze SpartaDOS-em 3.2, autorstwa Toma Hunta z 1992 roku. Brakuje w niej komend BPUT i BGET, aczkolwiek można je zastąpić odpowiednimi wywołaniami XIO. W pakiecie z interpreterem jest handler do obsługi P:R: Connection wraz z programikiem do ładowania tegoż handlera z poziomu BASIC-a.
Turbo BASIC wgrywa się do pamięci RAM komputera z dysku lub taśmy. Interpreter charakteryzuje się większą ilością instrukcji w stosunku do oryginalnego Atari BASIC-a, istnieje też kompilator Turbo BASIC XL Compiler.
Pierwszorzędną zaletą Turbo BASIC-a XL jest jego szybkość, programy wykonywane są od trzech do pięciu razy szybciej niż w interpreterze Atari BASIC, co jest w dużej mierze wynikiem tego, że Turbo BASIC ma własny, bardzo szybki pakiet procedur zmiennoprzecinkowych, który sprawdza się świetnie w większości zastosowań.
Inną istotną zaletą interpretera jest wsteczna kompatybilność z Atari BASIC-iem, dzięki czemu nieomal wszystkie programy napisane w tym ostatnim uruchomią się pod Turbo BASIC-iem XL (z nielicznymi wyjątkami).
W roku 2021 powstała wersja "relokowalna" Turbo-BASIC-a 1.5, charakteryzująca się większą ilością dostępnej pamięci (w zależności od tego, ile miejsca zajmuje DOS) oraz poprawkami niektórych błędów. Autorem modyfikacji jest dmsc.
Błędy w Turbo BASIC-u
- kontrola składni nie przyjmuje słów kluczowych %GET, %PUT i -MOVE, jeśli są wpisane małymi literami.
- kontrola składni przyjmuje zmienne tekstowe jako argumenty instrukcji GET, chociaż ta może zapisywać wartości tylko do zmiennych numerycznych.
- kontrola składni akceptuje znak Esc (ASCII 27) w miejsce dwukropka jako separatora instrukcji. Ten sam błąd ma też Atari BASIC.
- 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ż Atari BASIC.
- 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ż Atari BASIC.
- funkcja DEC źle działa, jeśli przekazana jej liczba szesnastkowa zawiera małe litery.
- zakończenie łańcucha tekstowego znakiem Ctrl/R (ASCII 18) powoduje takie zachowanie interpretera, jakby po cudzysłowie zamykającym łańcuch znajdował się średnik (np. ? "NATENCZAS ^R":? "WOJSKI" zachowuje się jak ? "NATENCZAS ^R";:? "WOJSKI"). Ten sam błąd ma Atari BASIC rev. A.
- interpreter w wersji 1.5 po uruchomieniu się ustawia wskaźnik MEMLO na adres $3629 i nigdy nie przywraca poprzedniej wartości: żeby ustawić sensowną wartość MEMLO pod np. MyDOS-em, trzeba po wyjściu z interpretera wcisnąć klawisz RESET.
Zobacz też
Linki zewnętrzne
- Strona z oryginalnym artykułem o Turbo-Basicu XL wraz z kompilatorem (pliki pdf z Happy Computera)
- Mirror strony o Turbo Basicu i Action! prowadzonej kiedyś przez Sikora
- Pełny kod źródłowy TBXL w formacie cross-asemblera MADS
- Dużo informacji o TBXL i jego autorze
- Kod źródłowy (i binaria) wersji relokowalnej z 2021 roku