MultiBASIC

From Atariki

Revision as of 02:57, 30 gru 2005; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

MultiBASIC to interpreter języka BASIC przeznaczony dla komputerów XL/XE wyposażonych w procesor 65C816. Ponieważ interpreter działa w trybie natywnym CPU, do działania wymagany jest również DracOS.

Za podstawę MultiBASIC-a posłużył kod źrodłowy Atari BASIC-a rev. C opublikowany przez Wojciecha Zientarę. Autorem dodatkowego kodu (interpreter ma obecnie prawie 19k), wszelkich rozszerzeń, poprawek i modyfikacji jest KMK.

Spis treści

Cele projektu

Docelowym zamierzeniem jest stworzenie interpretera języka BASIC wykorzystującego rozszerzenia oferowane przez procesor 65C816, przede wszystkim dodatkową pamięć oraz większą moc obliczeniową. Dodatkowo MultiBASIC ma stanowić syntezę cech i słów kluczowych innych dostępnych interpreterów BASIC-a, przede wszystkim Turbo BASIC-a XL oraz BASIC-a XE. Zgodność z Turbo BASIC-em zapewniona jest na poziomie tokenów (programy Turbo BASIC-a zapisane przez SAVE i wczytane do MultiBASIC-a komendą LOAD mają działać), natomiast zgodność z BASIC XE jest na poziomie słów kluczowych (program wczytany przez ENTER powinien działać).

W chwili obecnej MultiBASIC wykazuje duży stopień zgodności z Turbo BASIC-em XL, natomiast z BASIC-em XE jeszcze prawie żaden. W dalszym też ciągu korzysta tylko z pamięci znajdującej się w obszarze adresowym $000000-$00FFFF (pierwsze 64k), wewnętrzne zmiany mające pozwolić na przeniesienie zarówno kodu interpretera jak i obszaru na program w BASIC-u do obszarów powyżej adresu $00FFFF są w toku.

Różnice w stosunku do pierwowzorów

  • instrukcje POKE, PEEK, DPOKE, DPEEK, ADR, MOVE, -MOVE, SYSCALL, LUSR operują na 24-bitowych adresach.
  • instrukcje, które w Turbo BASIC-u XL używają kanału nr 7 do przesyłu danych (np. DIR), w MultiBASIC-u używają pierwszego wolnego kanału I/O.
  • instrukcje GOTO, GOSUB, RESTORE itp. przeszukują program od początku w poszukiwaniu żądanej linii programu tylko wtedy, kiedy jej numer jest mniejszy niż numer linii bieżącej. To samo przyspiesza działanie pętli FOR/NEXT, WHILE/WEND, REPEAT/UNTIL i DO/LOOP jeśli mieszczą się w jednej linii programu (prekompilacja jeszcze nie została zaimplementowana).
  • instrukcje SAVE i LOAD nie wymagają bezwzględnie podawania nazwy pliku (istnieje coś takiego jak nazwa domyślna programu).
  • z poziomu programu w BASIC-u istnieje dostęp do parametrów przekazanych w linii komend DOS-u (to działa tylko pod SpartaDOS).
  • nieznane tokeny powodują wystąpienie błędu nr 17.

Lista nowych słów kluczowych

Poniżej znajduje się lista słów kluczowych i operatorów nowych lub o zmienionym działaniu w stosunku do Turbo BASIC-a XL.

%

Operator binarnej różnicy symetrycznej (to samo co EXOR).

--

Separator; w odróżnieniu od Turbo BASIC-a XL nie jest traktowany tak samo jak inne słowa kluczowe przy generowaniu wcięć listingu. Kontroluje to komenda SET 18.

ADR()

Funkcja numeryczna. Zwraca adres podanego łańcucha tekstowego. Może zwracać adresy większe niż 65535.

ARGC

Pseudozmienna, która przechowuje liczbę przekazanych programowi parametrów linii komend DOS-u. Może uzyskiwać wartości całkowite z zakresu od 1 (brak parametrów) do 65535 (tyleż parametrów). 1 oznacza, że jest tylko jeden parametr i jest nim nazwa programu w BASIC-u znajdującego się aktualnie w pamięci. Wartość 0 oznacza, że lista parametrów jest niedostępna.

Wartość ARGC zmieniana jest przez komendy NEW, LOAD, RUN "filename" oraz FILENAME. Wszystkie te komendy kasują starą linię komend. NEW wykonane bez parametrów zeruje wartość ARGC. LOAD i RUN zmieniają wartość ARGC na aktualną. To samo robi też komenda FILENAME. Po wykonaniu komend LOAD, RUN "fname", FILENAME "fname" oraz NEW "fname" wartość ARGC wynosi co najmniej 1.

ARGV$()

Funkcja tekstowa. Jako parametr przyjmuje liczbę całkowitą z zakresu od 1 do 65535, i zwraca łańcuch tekstowy stanowiący przekazany w linii komend parametr o odpowiednim numerze. Razem z ARGC umożliwia dostęp do linii komend z poziomu programu w BASIC-u. ARGV$(1) zawsze zwraca ścieżkę dostępu do aktualnie załadowanego programu, o ile tylko linia komend jest w ogóle dostępna. Działanie obu funkcji ilustruje poniższy przykład:

10 X=0
20 WHILE X<ARGC
30  ? ARGV$(X):X=X+1
40 ENDWHILE

Program powinien wyświetlić wszystkie przekazane sobie argumenty - pomijając jednak te, które przekazane są interpreterowi BASIC-a. Dla wartości argumentu funkcji ARGV$ większych lub równych ARGC funkcja zwraca tekst składający się z jednego znaku EOL (ATASCII 155).

Linia komend zmieniana jest przez komendy NEW, LOAD, RUN "filename" oraz FILENAME. Wszystkie te komendy kasują ją i ewentualnie ustanawiają nową. NEW wykonane bez parametrów pozostawia pustą linię komend, LOAD i RUN wstawiają do niej nazwę pliku, który ma zostać załadowany. To samo robi też komenda FILENAME. Po wykonaniu komend LOAD, RUN "fname", FILENAME "fname" oraz NEW "fname" linia komend zawiera co najmniej jeden argument.

AUDCTL

Komenda ta pozwala na kontrolę rejestru AUDCTL układu POKEY. Składnia:

AUDCTL #LR[,mask,value]

LR ma wartość 0 albo 1 i wybiera odpowiedniego POKEY-a w komputerach ze stereo - czy komputer ma stereo, informuje funkcja SYS(28). mask to wartość, na której zostanie wykonana operacja bitowego AND z dotychczasową wartością rejestru AUDCTL, value natomiast zostanie zOR-owane z wynikiem tego ostatniego działania, po czym ostateczny wynik zostanie wpisany do rejestru AUDCTL. Poniewaz rejestr ten jest tylko do zapisu, interpreter przechowuje wpisywane wartości w rejestrze-cieniu. Z tego powodu lepiej unikać zamiennego używania AUDCTL oraz POKE $D208.

Pominięcie mask i value powoduje przyjęcie zera jako ich wartości,

Przykład:

  • AUDCTL #0,$00,$10 - ustawienie bitu 4: połączenie generatorów 1 i 2 w parę
  • AUDCTL #0,$EF,$08 - skasowanie bitu 4 i ustawienie bitu 3: rozłączenie pary generatorów 1 i 2 z jednoczesnym poączeniem w parę generatoów 3 i 4.
Personal tools