Atari BASIC

Atari BASIC
AtariBasicExample.png
Program gotowy do uruchomienia
Rodzina PODSTAWOWY
Zaprojektowany przez
Paula Laughtona Kathleen O'Brien
Deweloper Mikrosystemy Shepardsona
Po raz pierwszy pojawiły się 1979 ; 44 lata temu ( 1979 )
Wersja stabilna
Wersja C/1983 ; 40 lat temu ( 1983 )
Platforma Rodzina 8-bitowych Atari
Licencja Komercyjne oprogramowanie własnościowe
Pod wpływem
danych General Business Basic
Pod wpływem
BASIC A+ , BASIC XL , BASIC XE, Turbo-Basic XL

Atari BASIC jest interpreterem języka programowania BASIC , który był dostarczany z 8-bitową rodziną komputerów domowych Atari 6502 . W przeciwieństwie do większości amerykańskich BASIC-ów z ery komputerów domowych, Atari BASIC nie jest pochodną Microsoft BASIC i różni się w znaczący sposób. Zawiera słowa kluczowe dla funkcji specyficznych dla Atari i nie obsługuje na przykład tablic ciągów znaków.

Język był dystrybuowany jako kaseta ROM o pojemności 8 KB do użytku z komputerami Atari 400 i 800 z 1979 roku. Począwszy od 600XL i 800XL w 1983 r., BASIC jest wbudowany w system.

Pomimo tego, że 8-bitowe komputery Atari działały z większą szybkością niż większość jego współczesnych, kilka decyzji technicznych umieściło Atari BASIC blisko dna w testach wydajności. Oryginalni autorzy zajęli się większością tych problemów w serii ulepszonych wersji: BASIC A+ (1981), BASIC XL (1983) i BASIC XE (1985). Pojawiło się również mnóstwo zewnętrznych tłumaczy i kompilatorów, takich jak Turbo-Basic XL .

Kompletny, opatrzony adnotacjami kod źródłowy i specyfikacje projektowe Atari BASIC zostały opublikowane jako The Atari BASIC Source Book w 1983 roku.

Rozwój

Maszyny, które miały stać się rodziną 8-bitowych Atari, zostały pierwotnie opracowane jako konsole do gier wideo drugiej generacji , które miały zastąpić Atari VCS . Ray Kassar , nowy prezes Atari, postanowił rzucić wyzwanie Apple Computer , budując komputer domowy.

Oznaczało to, że projekty musiały zawierać język programowania BASIC , standard dla komputerów domowych. Na początku 1978 roku Atari udzieliło licencji na kod źródłowy dla wersji MOS 6502 Microsoft BASIC . Był oferowany w dwóch wersjach: jedna używała 32-bitowego formatu zmiennoprzecinkowego, który po kompilacji miał około 7800 bajtów, a druga używała rozszerzonego formatu 40-bitowego, który był bliski 9 KB.

kasety ROM urządzenia . Atari czuło również, że musi rozszerzyć język, aby obsługiwał funkcje sprzętowe swoich komputerów, podobnie jak Apple zrobił z Applesoft BASIC . Zwiększyło to rozmiar wersji Atari do około 11 KB; AppleSoft BASIC na Apple II+ miał długość 10 240 bajtów. Po sześciu miesiącach kod został zmniejszony, aby prawie zmieścił się w 8 KB ROM, ale Atari musiało stawić czoła ostatecznemu terminowi na styczeń 1979 r. Na targach Consumer Electronics Show (CES), na których maszyny miały zostać zademonstrowane. Postanowili poprosić o pomoc w przygotowaniu wersji BASIC-a na czas pokazu.

Mikrosystemy Shepardsona

Kartridż 8K Atari BASIC

We wrześniu 1978 roku firma Shepardson Microsystems wygrała przetarg na ukończenie języka BASIC. W tym czasie kończyli Cromemco 16K Structured BASIC dla Cromemco S-100 opartych na Z80 . Deweloperzy Kathleen O'Brien i Paul Laughton wykorzystali Data General Business Basic , implementację zawierającą wyłącznie liczby całkowite, jako inspirację dla swojego BASIC-a, biorąc pod uwagę doświadczenie Laughtona z Data General w systemie z podziałem czasu .

Cromemco BASIC zawierał rozszerzoną implementację zmiennoprzecinkową wykorzystującą 14-cyfrowy format dziesiętny kodowany binarnie (BCD), co było możliwe przy użyciu wszystkich 16 rejestrów procesora Zilog Z80 . Ponieważ konwertował wszystkie dane do formatu wewnętrznego w czasie edycji, małe stałe, takie jak „1”, zajmowałyby znaczną ilość pamięci, co może stanowić szczególny problem podczas przechowywania tablic liczb. Aby temu zaradzić, język obsługiwał również 6-cyfrowy format BCD. Zawierał również oddzielny 16-bitowy format liczb całkowitych do przechowywania wartości wewnętrznych, takich jak numery linii i podobne wartości systemowe.

Nawet najmniejsze BASIC-y na 6502 generalnie używały około 10 KB, na przykład Commodore BASIC używał 9 KB, ale także polegał na wsparciu ze strony KERNAL , podczas gdy Applesoft BASIC wykorzystywał 10 780 bajtów. Aby osiągnąć cel, jakim jest dopasowanie do 8K ROM, nowy BASIC składałby się z dwóch części, samego języka na kasecie i oddzielnej biblioteki FP wykorzystującej 2K w 10K ROM systemu. Aby zmieścić się w 2k, system zmiennoprzecinkowy obsługiwał tylko format 6-cyfrowy.

Atari zaakceptowało propozycję, a kiedy specyfikacje zostały sfinalizowane w październiku 1978 roku, Laughton i O'Brien rozpoczęli pracę nad nowym językiem. Umowa określała datę dostawy do 6 kwietnia 1979 r. lub wcześniej i obejmowała również system zarządzania plikami (później znany jako DOS 1.0). Plany Atari zakładały przeniesienie wczesnej wersji Microsoft BASIC 8K na CES 1979, a następnie przejście na Atari BASIC do produkcji. Rozwój przebiegał szybko, czemu sprzyjała klauzula premii w umowie, która doprowadziła do dostarczenia wstępnej wersji w październiku. Atari zabrało wersję kartridża 8K na CES zamiast Microsoftu. Atari Microsoft BASIC później stał się dostępny jako osobny produkt.

Wydania

Wersja, którą Shepardson przekazał Atari na potrzeby demonstracji CES, nie miała być ostateczna, a Shepardson nadal naprawiał błędy. Nieznane Shepardsonowi, Atari wysłało już wersję CES do produkcji.

Ta wersja była później znana jako wersja A. Zawiera poważny błąd w procedurze, która kopiuje pamięć: usuwanie wierszy kodu o długości dokładnie 256 bajtów powoduje blokadę po wprowadzeniu następnego polecenia. Klawisz Reset tego nie naprawia.

Wersja B próbowała naprawić główne błędy w wersji A i została wydana w 1983 roku jako wbudowana pamięć ROM w modelach 600XL i 800XL. Podczas naprawiania błędu kopiowania pamięci programista zauważył ten sam wzór kodu w sekcji dotyczącej wstawiania wierszy i zastosował tę samą poprawkę. To zamiast tego wprowadziło oryginalny błąd do tego kodu. Wstawianie nowych linii jest znacznie częstsze niż usuwanie starych, więc zmiana radykalnie zwiększyła liczbę awarii. Wersja B dodaje również 16 bajtów do programu za każdym razem, gdy jest on SAVE d i LOAD ed, ostatecznie powodując, że maszynie zabraknie pamięci nawet dla najmniejszych programów. Mapowanie Atari opisał je jako „niesamowite błędy” i doradził właścicielom wersji B: „Nie wygłupiaj się; zdobądź nową pamięć ROM, która jest dostępna na kartridżu” od Atari. Książka zawiera program do wpisywania poprawek do wersji B do wersji C dla osób bez kasety.

Wersja C eliminuje wycieki pamięci w wersji B. Jest wbudowana w późniejsze wersje 800XL i wszystkie modele XE, w tym XEGS. Wersja C była również dostępna jako nabój.

Wersję można określić, wpisując PRINT PEEK(43234) w wierszu polecenia READY. Wynik to 162 dla Rewizji A, 96 dla Rewizji B i 234 dla Rewizji C.

Opis

Edycja programu

Błędy składniowe są zgłaszane natychmiast po wprowadzeniu wiersza.

Podobnie jak większość BASIC-ów na komputery domowe, Atari BASIC jest zakotwiczony wokół swojego edytora liniowego . Linie programu mogą składać się z maksymalnie trzech fizycznych linii ekranu po 40 znaków, łącznie 120 znaków. Kursor można swobodnie przesuwać, a edytor automatycznie śledzi, do której linii programu BASIC należy bieżąca linia ekranu. Na przykład, jeśli kursor znajduje się obecnie w linii 30, a użytkownik użyje kursora w górę do linii 20, wszelkie zmiany od tego punktu zostaną przeprowadzone w linii 20.

Edytor Atari BASIC wyłapuje wiele błędów, które nie zostałyby zauważone w wersjach pochodzących z MS. Jeśli zostanie znaleziony błąd, edytor ponownie wyświetla linię, podświetlając tekst w pobliżu błędu w odwróconym wideo . Błędy są wyświetlane w postaci kodów numerycznych, z opisami wydrukowanymi w instrukcji. Ze względu na sposób działania edytora linii, użytkownik może natychmiast naprawić błąd. W powyższym przykładzie (z PRUNT ) błąd można naprawić, przesuwając kursor nad U , wpisując I (edytor ma tylko tryb nadpisywania) i naciskając RETURN .

Linia wprowadzona z liczbą wiodącą od 0 do 32767 jest wstawiana do bieżącego programu lub zastępuje istniejącą linię. Jeśli nie ma numeru linii, interpreter przypisuje jej numer -1 (8000 16 ) i polecenia są wykonywane natychmiast, w „trybie natychmiastowym”. Polecenie RUN wykonuje zapisany program od wiersza o najniższym numerze. Atari BASIC umożliwia wykonywanie wszystkich poleceń w obu trybach. Na przykład LISTA może być używana wewnątrz programu, podczas gdy w wielu interpreterach byłaby dostępna tylko w trybie natychmiastowym.

Podczas wprowadzania słowa kluczowe można skracać przy użyciu wzorca ustalonego przez Palo Alto Tiny BASIC , wpisując kropkę w dowolnym miejscu słowa. Więc L. jest rozszerzane do LIST , podobnie jak LI. . Wystarczy wpisać tylko tyle liter, aby skrót był unikalny, więc PLOT wymaga PL. ponieważ pojedyncza litera P nie jest unikalna. Aby rozszerzyć skrót, tokenizator przeszukuje swoją listę zarezerwowanych słów, aby znaleźć pierwsze, które pasuje do dostarczonej części. Częściej używane polecenia pojawiają się na początku listy słów zastrzeżonych, z REM na początku (można je wpisać jako . ). Kiedy program jest później jako LISTA , zawsze wypisze pełne słowa z trzema wyjątkami: PRINT ma synonim, ? ; GOTO ma synonim GO TO ; a LET ma synonim, który jest pustym łańcuchem (więc 10 LET A = 10 i 10 A = 10 oznaczają to samo). Są to oddzielne tokeny i jako takie pozostaną na liście programów. MS BASIC również dozwolone ? jako skrót dla PRINT , ale używał tego samego tokena, więc rozszerzył się z powrotem do PRINT , gdy LIST ed, traktując to jako skrót, a nie synonim.

Tokenizator

Kiedy użytkownik naciśnie RETURN podczas edycji, bieżąca linia jest kopiowana do BASIC Input Line Buffer w pamięci pomiędzy 580 a 5FF 16 . Tokenizer Atari BASIC skanuje tekst, konwertując każde słowo kluczowe na jednobajtowy token (na przykład PRINT to 20 16 ), każdą liczbę na sześciobajtową wartość zmiennoprzecinkową, każdą nazwę zmiennej na indeks w tabeli i tak dalej , aż wiersz zostanie całkowicie przekształcony w łatwy do interpretacji format. Wynik jest zapisywany w buforze wyjściowym znajdującym się na pierwszych 256 bajtach najniższej dostępnej wolnej pamięci, na którą wskazuje wskaźnik LOMEM zapisany pod adresem 80, 81 16 . Dane wyjściowe z tokenizera są następnie przenoszone. Program jest przechowywany jako drzewo parsowania .

Shepardson odniósł się do tej koncepcji pełnej tokenizacji jako „prekompilującego interpretera”. Wynikowy tokenizowany kod eliminuje jakiekolwiek parsowanie w czasie wykonywania, dzięki czemu działa szybciej. Ma tę wadę, że małe stałe, takie jak 0 lub 1, mają po sześć bajtów i są dłuższe niż oryginalny tekst.

Zestaw wskaźników (adresów) wskazuje różne dane: nazwy zmiennych są przechowywane w tabeli nazw zmiennych (VNTP – 82, 83 16 ), a ich wartości są przechowywane w tabeli wartości zmiennych (wskazanych na VVTP – 86, 87 16 ). Dzięki pośredniczeniu nazw zmiennych w ten sposób odwołanie do zmiennej wymaga tylko jednego bajtu, aby zaadresować jego wpis do odpowiedniej tabeli. Zmienne łańcuchowe mają swój własny obszar (wskazany na STARP – 8C, 8D 16 ), podobnie jak stos czasu wykonywania (wskazany na RUNSTK – 8E, 8F 16 ) używany do przechowywania numerów linii zapętlonych instrukcji ( FOR...NEXT ) i podprogramy ( GOSUB...RETURN ). Ostatecznie koniec użycia pamięci BASIC-a jest wskazywany przez adres zapisany w MEMTOP – wskaźnik 90, 91 16 ).

Funkcje matematyczne

Atari BASIC zawiera trzy funkcje trygonometryczne: sinus, cosinus i arc tangens. DEG i RAD określają, czy te funkcje używają radianów, czy stopni, domyślnie radiany. Osiem dodatkowych funkcji obejmuje zaokrąglanie, logarytmy i pierwiastki kwadratowe. Funkcja losowa RND generuje liczbę z przedziału od 0 do 1; parametr nie jest używany.

Obsługa ciągów

Atari BASIC skopiował system obsługi ciągów znaków firmy Hewlett-Packard BASIC , w którym podstawowym typem danych jest pojedynczy znak, a ciągi znaków to tablice znaków. Wewnętrznie ciąg jest reprezentowany przez wskaźnik do pierwszego znaku w ciągu i jego długości. Aby zainicjować ciąg znaków, należy go wyspecyfikować z maksymalną długością. Na przykład:

  
  
  
   10  DIM  A$  (  20  )  20  PRINT  "WPROWADŹ KOMUNIKAT: "  ;  30  WPROWADŹ  A$  40  DRUKUJ  A$ 

W tym programie zarezerwowany jest ciąg 20 znaków, a wszelkie znaki przekraczające długość łańcucha zostaną obcięte. Maksymalna długość łańcucha wynosi 32 768 znaków. Nie ma obsługi tablic ciągów znaków.

Ciąg jest dostępny za pomocą funkcji indeksowania tablicy lub krojenia . A$(1,10) zwraca ciąg pierwszych 10 znaków A$ . Tablice są indeksowane 1, więc łańcuch o długości 10 zaczyna się od 1 i kończy na 10. Funkcje dzielenia po prostu ustawiają wskaźniki do punktów początkowych i końcowych w istniejącej przydzielonej pamięci.

Tablice nie są inicjowane, więc tablica liczbowa lub łańcuch zawiera wszelkie dane, które znajdowały się w pamięci, kiedy zostały przydzielone. Poniższa sztuczka umożliwia szybką inicjalizację łańcucha i jest również przydatna do czyszczenia dużych obszarów pamięci z niechcianych śmieci. Tablice numeryczne można wyczyścić tylko za pomocą pętli FOR...NEXT:

 
  
  10  REM Inicjalizacja A$ za pomocą 1000 znaków X  20  DIM  A$  (  1000  )  30  A$  =  "X"  :  A$  (  1000  )  =  A$  :  A$  (  2  )  =  A$ 

Łączenie łańcuchów działa tak, jak w poniższym przykładzie. Ciąg docelowy musi być wystarczająco duży, aby pomieścić połączony ciąg, w przeciwnym razie wystąpi błąd:

  
 
 
   10  DIM  A$  (  12  ),  B$  (  6  )  20  A$  =  "Cześć "  :  B$  =  "tutaj!"  30  A$  (  LEN  (  A$  )  +  1  )  =  B$  40  DRUKUJ  A$ 

Wartości w instrukcjach DATA są rozdzielone przecinkami i nie mają typu. W związku z tym ciągi znaków w instrukcjach DATA nie są zwykle ujęte w cudzysłowy. W rezultacie elementy danych nie mogą zawierać przecinka, ale mogą zawierać podwójne cudzysłowy. Wartości liczbowe w instrukcjach DATA są odczytywane jako łańcuchy znaków lub jako liczby, w zależności od typu zmiennej, do której są wczytywane. Instrukcja READ nie może być używana ze zmiennymi tablicowymi.

Wejście wyjście

Atari OS zawiera podsystem wejścia/wyjścia urządzenia peryferyjnego (I/O) znany jako CIO (Central Input/Output). Większość programów można pisać niezależnie od używanego urządzenia, ponieważ wszystkie są zgodne ze wspólnym interfejsem; w tamtych czasach było to rzadkością na komputerach domowych. Można dość łatwo napisać nowe sterowniki urządzeń, które byłyby automatycznie dostępne dla Atari BASIC i każdego innego programu korzystającego z systemu operacyjnego Atari, a istniejące sterowniki można by zastąpić lub rozszerzyć o nowe. Zamiennik E: , na przykład, mógłby zastąpić ten w pamięci ROM, aby zapewnić 80-kolumnowy wyświetlacz lub podłączyć go w celu wygenerowania sumy kontrolnej za każdym razem, gdy zwracany jest wiersz (na przykład używany do weryfikacji listy programów do wpisania).

Atari BASIC obsługuje dostęp CIO z zastrzeżonymi słowami OPEN #, CLOSE #, PRINT #, INPUT #, GET #, PUT #, NOTE #, POINT # i XIO # . Istnieją procedury w systemie operacyjnym dla prostych funkcji rysowania grafiki, ale nie wszystkie są dostępne jako określone słowa kluczowe BASIC. PLOT i DRAWTO do rysowania linii, natomiast polecenie zapewniające wypełnienie obszaru dla prymitywnych liniowych kształtów geometrycznych nie jest obsługiwane. Funkcja wypełniania może być używana przez ogólny punkt wejścia CIO, który jest wywoływany za pomocą polecenia BASIC XIO .

Instrukcja BASIC OPEN # przygotowuje urządzenie do dostępu I/O:

 
  0 10  REM Otwiera urządzenie kasetowe na kanale 1 w celu wczytania BASIC  20  OPEN  #  1  ,  4  ,  ,  "C:MYPROG.DAT" 

Tutaj OPEN # oznacza „upewnij się, że kanał 1 jest wolny”, wezwij kierowcę C:, aby przygotował urządzenie (spowoduje to naprężenie szpul z kasetą i przesunięcie głowic, utrzymując odtwarzacz kasetowy „zatrzymany”. 4 oznacza „odczyt " (inne kody to 8 dla zapisu i 12 = 8 + 4 dla "odczytu i zapisu"). Trzecia liczba to informacja pomocnicza, ustawiana na 0, gdy nie jest potrzebna. C :MYPROG.DAT to nazwa urządzenia i nazwa pliku; nazwa pliku jest ignorowana przez sterownik kasety. Urządzenia fizyczne mogą mieć numery (głównie dyski, drukarki i urządzenia szeregowe), więc „ P1: ” może być ploterem, a „ P2: ” drukarką stokrotką lub „ D1: " może być jednym dyskiem, a " D2: " i tak dalej. Jeśli nie występuje, przyjmuje się 1.

Instrukcja LPRINT wysyła łańcuch znaków do drukarki.

A jest odczytywane przez PEEKing lokacji pamięci utrzymywanych przez sterownik klawiatury lub otwierając je jako plik (np. 0 OPEN 1 , 4 , , "K:" : GET # 1 , A$ ). Ten ostatni czeka na naciśnięcie klawisza.

Wpisanie DOS z języka BASIC powoduje wyjście do menu poleceń Atari DOS . Wszystkie niezapisane programy zostaną utracone, chyba że na bieżącym dysku została włączona funkcja wymiany plików pamięci. Nie ma polecenia, aby wyświetlić katalog dysku z poziomu BASICa; należy to zrobić, wychodząc do DOS.

Grafika i dźwięk

Atari BASIC obsługuje dźwięk (poprzez instrukcję SOUND ), grafikę ( GRAPHICS, SETCOLOR, COLOR, PLOT, DRAWTO ) i kontrolery ( STICK, STRIG, PADDLE, PTRIG ). Instrukcja SOUND ustawia jeden z 4 sprzętowych kanałów fal prostokątnych z parametrami głośności, tonu i zniekształceń.

Zaawansowane możliwości sprzętu, takie jak wyższa rozdzielczość tonu, filtry górnoprzepustowe, cyfrowy dźwięk i kształty fal, grafika odtwarzacza/pocisku ( sprite'y ), przedefiniowane zestawy znaków, przewijanie i niestandardowe tryby graficzne nie są obsługiwane przez język BASIC; będą one wymagały procedur języka maszynowego lub instrukcji PEEK/POKE. Kilka z 17 podstawowych trybów znakowych/graficznych obsługiwanych przez sprzęt nie może być łatwo dostępnych z BASIC-a na Atari 400/800, ponieważ ROM-y systemu operacyjnego ich nie obsługują. Należą do nich niektóre tryby znaków wielokolorowych (tryby ANTIC 4 i 5), tryb znaków w dół (tryb ANTIC 3) oraz tryby 2 i 4-kolorowe o najwyższej rozdzielczości (tryby ANTIC C i E, 160x192 piksele). Jedynym sposobem uzyskania do nich dostępu jest PEEK/POKE lub język maszynowy, ręczne ustawienie rejestrów ANTIC i listy wyświetlania. Pamięci ROM systemu operacyjnego w XL / XE dodały obsługę tych trybów, z wyjątkiem trybu ANTIC 3, który wymaga przedefiniowania zestawu znaków w pamięci RAM do prawidłowego działania.

Tryby mapy bitowej w języku BASIC są zwykle ustawione tak, aby okno tekstowe zajmowało ostatnie cztery wiersze u dołu ekranu, dzięki czemu użytkownik może wyświetlać monity i wprowadzać dane do programu. Jeśli do numeru trybu wywołanego instrukcją GRAPHICS zostanie dodana 16, cały ekran będzie w trybie mapy bitowej (np. GRAPHICS 8+16). Jeśli zostanie wywołany tryb mapy bitowej na pełnym ekranie, Atari BASIC z wdziękiem przełączy się z powrotem do trybu tekstowego po zakończeniu wykonywania programu, unikając pozostawienia użytkownika z niereagującym ekranem, który należy opuścić, wpisując ślepe polecenie lub resetując komputer.

Współrzędne mapy bitowej mieszczą się w zakresie od 0 do maksymalnej liczby wierszy/kolumn minus jeden, dlatego w trybie 6 (160x192) maksymalne współrzędne piksela mogą wynosić 159 i 191. Jeśli Atari BASIC spróbuje narysować wykres poza dozwolonymi współrzędnymi dla trybu występuje błąd czasu wykonywania.

Zaawansowane techniki

Etykiety linii

Atari BASIC umożliwia używanie zmiennych numerycznych i wyrażeń do dostarczania numerów linii do poleceń GOTO i GOSUB . Na przykład podprogram, który czyści ekran, można zapisać jako GOSUB CLEARSCREEN , co jest łatwiejsze do zrozumienia niż GOSUB 10000 .

Ciągi jako sposób manipulowania pamięcią

Adresy bazowe łańcucha są przechowywane w tablicy zmiennych. Adresy ciągów można przekierować tak, aby wskazywały dowolne obszary pamięci RAM. Pozwala to na zastosowanie procedur szybkiego przesuwania pamięci leżących u podstaw przypisywania łańcuchów i podciągów z języka BASIC do pamięci używanej przez ekran lub grafikę odtwarzacza/pocisku. Jest to szczególnie przydatne do uzyskania szybkiego pionowego ruchu obrazów graczy/pocisków bezpośrednio z Atari BASIC.

Losowy dostęp przez DATA/RESTORE

Zmienne numeryczne i wyrażenia mogą być używane jako parametr instrukcji RESTORE , umożliwiając swobodny dostęp do instrukcji DATA za pomocą kodu, takiego jak RESTORE ROOMBASE + ROOMNUMBER: READ DESCRIPTION$ , TREASURE$ , EXITS . Można tego również użyć do emulacji statycznych tablic ciągów znaków: RESTORE STRBASE + INDEX: READ A$ : PRINT A$ .

Obsługa błędów za pomocą TRAP

instrukcja TRAP przeskakuje do numeru wiersza, co zmniejsza potrzebę ręcznego sprawdzania błędów. Na przykład rysując grafikę na ekranie nie trzeba sprawdzać, czy linie wychodzą poza granice ekranu bieżącego trybu graficznego. Ten stan błędu można przechwycić iw razie potrzeby obsłużyć błąd.

zawiera

Polecenie ENTER odczytuje kod źródłowy z urządzenia i łączy go z bieżącym programem, tak jakby użytkownik go wpisał. Pozwala to na zapisywanie programów w sekcjach za pomocą LIST , odczytywanie ich za pomocą ENTER w celu scalenia lub zastąpienia istniejącego kodu. Używając bloków numerów linii, które się nie nakładają, programiści mogą budować biblioteki podprogramów i łączyć je w nowe programy w razie potrzeby.

Samomodyfikujący się kod

Edytor można skonfigurować tak, aby wielokrotnie odczytywał dane wejściowe z ekranu, aż do osiągnięcia EOF. Pozwala to programowi napisać nowy kod programu, po którym następuje CONT na ekranie, a następnie ustawić kursor ekranowy na początku nowego kodu, ZATRZYMAĆ uruchomiony program, powodując wczytanie nowego kodu, a następnie kontynuację wykonywania przez oświadczenie CONT .

Wbudowany język maszynowy

Atari BASIC może wywoływać podprogramy kodu maszynowego przechowywane w łańcuchach lub POKE w pamięci. W tym celu często używany jest obszar 256 bajtów rozpoczynający się pod adresem 1536 10 (600 16 ).

Kod maszynowy jest wywoływany funkcją USR . Pierwszy parametr to adres podprogramu, a kolejne wartości to parametry. Jeśli kod jest przechowywany w łańcuchu o nazwie ROUTINE$ , można go wywołać z dwoma parametrami jako ANSWER = USR ( ADR ( ROUTINE$ ), VAR1 , VAR2 ) .

Parametry są umieszczane na stosie sprzętowym jako 16-bitowe liczby całkowite w kolejności określonej w wywołaniu USR w kolejności młodszy bajt, starszy bajt. Wciskany jest ostatni bajt wskazujący liczbę argumentów. Kod języka maszynowego musi usunąć te wartości przed powrotem za pomocą RTS . Wartość 16-bitową można zwrócić do języka BASIC, umieszczając ją w adresach 212 10 i 213 10 (D4 16 i D5 16 ).

Wydajność

Teoretycznie Atari BASIC powinien działać szybciej niż współczesne BASIC-y oparte na wzorcu MS. Ponieważ kod źródłowy jest w pełni tokenizowany po wprowadzeniu, wszystkie etapy tokenizacji i analizowania są już zakończone. Nawet złożone operacje matematyczne są gotowe do wykonania, przy czym wszelkie stałe numeryczne są już przekonwertowane do wewnętrznego formatu 40-bitowego, a wartości zmiennych są wyszukiwane według adresu, zamiast konieczności ich wyszukiwania. Pomimo tych teoretycznych zalet, w praktyce Atari BASIC jest wolniejszy niż większość innych komputerów domowych BASIC, często o dużą ilość.

W dwóch powszechnie używanych testach porównawczych tamtej epoki, Sieve of Eratosthenes magazynu Byte i teście porównawczym Creative Computing napisanym przez Davida H. Ahla , Atari znalazł się blisko końca listy pod względem wydajności i był znacznie wolniejszy niż współczesny Apple II lub Commodore PET , pomimo posiadania tego samego procesora, ale działającego z mniej więcej dwukrotnie większą prędkością niż którykolwiek z nich. Skończyło się za stosunkowo wolnymi maszynami, takimi jak Sinclair ZX81 , a nawet niektórymi programowalnymi kalkulatorami.

Większość powolności języka wynika z trzech problemów.

Po pierwsze, procedury matematyczne zmiennoprzecinkowe są słabo zoptymalizowane. W teście porównawczym Ahl operacja na pojedynczym wykładniku była odpowiedzialna za większość słabych wyników maszyny. Konwersja między liczbami zmiennoprzecinkowymi i 16-bitowymi jest również szczególnie powolna. Wewnętrznie te liczby całkowite są używane do numerowania wierszy i indeksowania tablic, wraz z kilkoma innymi zadaniami, ale liczby w tokenizowanym programie są przechowywane w dziesiętnym kodowanym binarnie (BCD). Ilekroć napotkany zostanie jeden z nich, na przykład numer wiersza w GOTO 100 , wartość BCD jest konwertowana na liczbę całkowitą, co może zająć do 3500 mikrosekund.

Inną kwestią jest sposób, w jaki Atari BASIC implementuje rozgałęzienia. Aby wykonać rozgałęzienie w GOTO lub GOSUB , interpreter przeszukuje cały program w poszukiwaniu pasującego numeru linii. W przeciwieństwie do tego, współczesne wersje języków BASIC pochodzących z MS przeszukiwałyby do przodu od bieżącej linii, gdyby numer linii docelowej gałęzi był większy, poprawiając w ten sposób wydajność gałęzi średnio około dwa razy.

Powiązanym i poważniejszym problemem jest implementacja pętli FOR NEXT . Kiedy FOR , Atari BASIC zapisuje jej numer linii. Za każdym razem, gdy NASTĘPNY , przeszukuje program w poszukiwaniu tej linii, mimo że znajduje się ona w tym samym miejscu co poprzednio. Wszystkie inne języki BASIC zamiast tego zapisują lokalizację w pamięci FOR i mogą natychmiast do niej powrócić bez konieczności wyszukiwania.

Przyczynę tego słabego wyniku najlepiej ilustruje cytat jednego z głównych autorów, Billa Wilkinsona; w 1982 roku stwierdził:

Osobiście nigdy nie byłem pewien, czy język interpretowany (np. BASIC) musi być szybki. Autorzy... twierdzili, że Atari BASIC jest najwolniejszym językiem, jaki kiedykolwiek stworzono. Moim pierwszym odruchem było pytanie: „Kogo to obchodzi?”.

Można porównać tę filozofię z filozofią Apple BASIC Steve'a Wozniaka dla oryginalnego Apple I , który został zaprojektowany specjalnie pod kątem wydajności wymaganej do pisania gier:

Po zaprojektowaniu sprzętowych gier zręcznościowych wiedziałem, że programowanie ich w języku BASIC zmieni świat.

Na platformie pojawiło się kilka języków BASIC innych firm, które rozwiązywały niektóre lub wszystkie z tych problemów. Obejmuje to własny BASIC XL Wilkinsona , który skrócił czas testu porównawczego Byte ze 194 do 58 sekund, ponad trzykrotnie szybciej. W teście porównawczym Ahl Atari BASIC wymagał 405 sekund, podczas gdy dokładnie ten sam kod w Turbo-BASIC XL zajął 41,6 sekundy, co oznacza poprawę o rząd wielkości.

Różnice w stosunku do Microsoft BASIC

  • Składnia jest sprawdzana, a błędy podświetlane natychmiast po wprowadzeniu wiersza.
  • Nazwy zmiennych mogą mieć dowolną długość, a wszystkie znaki są znaczące.
  • Następujące słowa kluczowe nie występują w Atari BASIC: INKEY$ , CLS , DEF FN , SPC , TAB , ELSE .
  • Wszystkie tablice muszą być zwymiarowane przed użyciem, podczas gdy Microsoft BASIC domyślnie ustawia tablicę na 10 elementów, jeśli nie jest zwymiarowana.
  • Zmienne łańcuchowe są traktowane jako tablice znaków i przed użyciem muszą zostać zwymiarowane. MS BASIC przechowuje napisy na stercie i czasami zatrzymuje się na wyrzucanie elementów bezużytecznych .
  • Funkcje LEFT$ , MID$ i RIGHT$ są zastępowane przez indeksowanie łańcuchów.
  • Nie ma operatora do konkatenacji łańcuchów.
  • Nie ma tablic ciągów znaków.
  • Nie ma obsługi zmiennych całkowitych.
  • Nie ma operatorów bitowych.
  • INPUT nie zezwala na monit.
  • PRINT może być skracane jako ? jak w Microsoft BASIC, ale Atari BASIC nie tokenizuje go do PRINT . Pozostaje znakiem zapytania.
  • Celem GOTO i GOSUB może być zmienna lub wyrażenie.
  • RESTORE może przyjąć stałą numeryczną, zmienną lub wyrażenie jako parametr, powodując, że następny READ rozpocznie się od określonego numeru linii
  • FOR..NEXT w Atari BASIC muszą mieć nazwę zmiennej, do której odwołuje się instrukcja NEXT , podczas gdy Microsoft BASIC tego nie wymaga.
  • Wiele zmiennych nie jest dozwolonych w instrukcjach NEXT , tak jak w Microsoft BASIC (np. NEXT X,Y ).
  • LISTA używa przecinka do oddzielenia zakresu zamiast znaku minus.

Słowa kluczowe

Notatki

Cytat

Bibliografia

Linki zewnętrzne