MultiBASIC
From Atariki
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.
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).
- nieznane tokeny powodują wystąpienie błędu nr 17.
- z poziomu programu w BASIC-u istnieje dostęp do parametrów przekazanych w linii komend DOS-u (to działa tylko pod SpartaDOS).
- z poziomu linii komend można wpływać na działanie interpretera: podanie nazwy pliku spowoduje próbę automatycznego załadowania tego pliku jako programu w BASIC-u. Jednoczesne podanie parametru -R (jak RUN) spowoduje automatyczne uruchomienie tego programu, a po jego zakończeniu zgłoszenie się edytora komunikatem "Ready". Z kolei -B (jak BATCH) działa podobnie jak -R, ale po zakończeniu programu interpreter oddaje sterowanie do DOS-u.
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.
#
Definicja etykiety dla linii programu, na której początku się znajduje. Składniowo etykieta ma te same cechy co nazwa zmiennej numerycznej, czyli musi się składać ze znaków alfanumerycznych i nie przekraczać 128 znaków długości. W programie może występować etykieta i zmienna o tej samej nazwie, interpreter rozróżnia je po typie.
Etykieta może zostać podana zamiast numeru linii w słowach kluczowych GO#, GOSUB, GOTO, RESTORE i TRAP, a także w konstrukcjach ON .. GO#, ON ... GOTO i ON ... GOSUB. Wartością etykiety jest adres linii programu, w której się ona znajduje, a więc interpreter nie musi wyszukiwać linii o podanym numerze przed wykonaniem skoku. Z tego względu skoki do etykiet wykonywane są znacznie szybciej niż skoki do numerów linii.
%
Operator binarnej różnicy symetrycznej (to samo co XOR i EXOR) zaczerpnięty z BASIC XE.
%0, %1, %2, %3
Stałe numeryczne o odpowiednich wartościach (jak w Turbo BASIC XL).
--
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:
- SET 18,0 - linie z separatorem nie podlegają wcięciom (default)
- SET 18,1 - linie z separatorem podlegają normalnym wcięciom
ADR()
Funkcja numeryczna. Zwraca adres podanego łańcucha tekstowego. Może zwracać adresy większe niż 65535.
ARGC
Stała, 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.
AUTO
Włącza automatyczną numerację linii w edytorze BASIC-a. Składnia:
AUTO [start[,increment]]
Po wpisaniu linii programu i wciśnięciu klawisza RETURN edytor automatycznie wyświetli numer dla następnej linii i przejdzie do oczekiwania na jej treść. Wyjście z trybu automatycznej numeracji uzyskuje się przez wciśnięcie Break.
Opcjonalne argumenty mają następujące znaczenie:
- start - linia, od której życzymy sobie zacząć automatyczną numerację
- increment - skok, z jakim zwiększane sa numery kolejnych linii
AUTO 0,0 resetuje licznik i skok do wartości początkowych. Dla niepodanych parametrów komenda przyjmuje wartości domyślne. Można je odczytać przez funkcje SYS(22) i SYS(23) oraz zmienić przez SET 22 i SET 23.
Komendy AUTO nie można użyć w programie - jeśli interpreter natrafi na nią podczas wykonywania programu, traktuje ją tak samo jak instrukcję END.
BSAVE
Zapisuje wskazany blok pamięci na dysk w postaci pliku COM. Składnia:
BSAVE begin,end,"filename"
begin i end to odpowiednio adres początku (pierwszego bajtu) i końca (ostatniego bajtu) zapisywanego bloku. Te adresy muszą się mieścić w obszarze $000000-$00FFFF (pierwsze 64k pamięci).
DEC()
Funkcja numeryczna, która podobnie jak w Turbo BASIC-u XL zwraca numeryczną wartość podanego łańcucha tekstowego cyfr szesnastkowych. W odróżnieniu od Turbo BASIC-a, liczba szesnastkowa może być zapisana małymi literami albo w inverse video tudzież poprzedzona spacjami. Znaku $ na początku nie podajemy. Konwersja obejmuje maksymalnie sześć cyfr (czyli liczby z zakresu od $000000 do $FFFFFF). W przypadku liczb dłuższych interpreter konwertuje po prostu sześć ostatnich cyfr. Zobacz też VAL().
DEL
Komenda kasująca wskazane linie znajdującego się w pamięci programu w BASIC-u. Składnia:
DEL begin[,end]
Skasowaniu ulegają linie od begin do end włącznie. Konkretne linie o numerach begin i end nie muszą istnieć, te dwie liczby tylko wyznaczają limit, poza którym żadna linia nie zostanie skasowana. Pominięcie argumentu end powoduje skasowanie jednej linii, tej wskazanej przez parametr begin.
DIR
Komenda wyświetlająca na ekranie wskazany katalog dyskowy, albo katalog bieżący względnie katalog D1: (to zalezy od DOS-u) jeśli nic nie zostało podane. W odróżnieniu od Turbo BASIC-a, jeśli w systemie zainstalowany jest SpartaDOS, wyświetlany jest listing katalogu w "długim" formacie, podobnie jak pod COMMAND.COM SpartaDOS-u. W przeciwnym wypadku wyświetlany jest listing skrócony. SYS(20) pozwala odczytać, a SET 20 ustawić wartość ICAX2 dla systemowej komedy otwarcia katalogu do odczytu - SET 20,0 włącza "krótki" katalog pod SpartaDOS-em, SET 20,128 przywraca katalog w formacie pełnym.
Manipulowanie tą wartością w chwili, gdy interpreter jest uruchomiony pod innym DOS-em niż SpartaDOS nie jest zalecane. Numer wersji SpartaDOS można odczytać przez funkcje SYS(26) i SYS(27). Jeśli SYS(26) zwraca zero, to w systemie nie ma SpartaDOS.
DPEEK()
To działa tak samo jak w Turbo BASIC-u XL poza tym, że funkcja przyjmuje 24-bitowe wartości jako adres.
DPOKE
To działa tak samo jak w Turbo BASIC-u XL poza tym, że komenda przyjmuje 24-bitowe wartości jako adres.
DSOUND
W porównaniu z Turbo BASIC-em XL komenda może opcjonalnie służyć do sterowania drugim POKEY-em w komputerach ze stereo. Wyboru układu dokonujemy przez podanie na początku parametru LR podobnie jak w przypadku komendy AUDCTL:
DSOUND #LR[,channel,frequency,pitch,volume]
LR ma wartość 0 lub 1. Pominięcie pozostałych parametrów powoduje wyłączenie dźwięku we wskazanym kanale stereo. Dostępność stereo sprawdzamy przez SYS(28).
ENDWHILE
To samo, co WEND. Słowo wprowadzone dla zgodności z BASIC XE.
ERR
Pseudozmienna przechowująca numer błędu, jaki ostatnio wystąpił. Działanie jest takie samo jak w Turbo BASIC XL z tym wyjątkiem, że numer błędu jest defaultowo ujemny (np. -120 zamiast tradycyjnego 136, zob. kody błędów). SET 19,1 przełącza kodowanie numerów błędów na system tradycyjny.
FILE
Pseudozmienna, która przechowuje numer pierwszego wolnego - czyli zamkniętego - kanału IOCB. Użycie:
F1=FILE:OPEN #F1,4,0,"D:FILE1":F2=FILE:OPEN #F2,8,0,"D:FILE2"
Jeśli wszystkie kanały sa zajęte, wykonanie FILE powoduje błąd -95 (TOO MANY CHANNELS OPEN). Trzeba pamiętać, że przypisanie wartości FILE do czegokolwiek nie alokuje deskryptora pliku, tak więc coś takiego:
F1=FILE:F2=FILE:OPEN #F1,4,0,"D:FILE1":OPEN #F2,8,0,"D:FILE2"
spowoduje błąd "ALREADY OPEN", bo wartości F1 i F2 będą takie same.
FILENAME
Definiuje nową nazwę domyślną dla komend LOAD i SAVE. LOAD "D:FOO.BAS" działa dokładnie tak samo, jak FILENAME "D:FOO.BAS":LOAD. Komenda FILENAME może też zostać uzyta bez argumentu - domyślna nazwa programu zostanie wtedy skasowana, a próba wykonania LOAD lub SAVE bez parametru spowoduje błąd nr 31.
FLEN
Składnia: FLEN #iocb,var
Komenda przypisuje zmiennej numerycznej var wielkość pliku otwartego jako kanał numer iocb. Wywoływana funkcja systemowa to XIO 39 - DOS musi mieć to zaimplementowane, w przeciwnym wypadku FLEN nie będzie działać.
GET
Działanie identyczne jak w Turbo BASIC-u XL z tym wyjątkiem, że MultiBASIC nie przyjmuje zmiennych tekstowych jako argumentów (to jest błąd w Turbo BASIC-u). Dozwolone jest pominięcie numeru kanału - znak zostanie wtedy odczytany z klawiatury - oraz podanie więcej niż jednej zmiennej, co powoduje odczyt większej liczby bajtów za jednym zamachem.
GOSUB i GOTO
W odróżnieniu od Turbo BASIC-a XL jako argument tych instrukcji można podać etykietę (np. GOSUB #PODPROGRAM).
HEX$()
Funkcja zwraca łańcuch tekstowy cyfr szesnastkowych odpowiadający podanej wartości numerycznej. Akceptowany zakres liczb to wartości całkowite od 0 do 16777215.
LOAD
Działanie dokładnie takie samo jak w Turbo BASIC-u XL z tym wyjątkiem, że podanie nazwy pliku jest opcjonalne. Gdy nie podano, przyjmowana jest nazwa domyślna. Nazwa domyślna to:
- nazwa pliku podana ostatnio przy wykonywaniu LOAD "fname" albo RUN "fname"
- nazwa pliku podana interpreterowi w linii komend jako specyfikacja pliku do załadowania i/lub uruchomenia
- nazwa pliku zdefiniowana przez komendę NEW "fname" lub FILENAME "fname"
Jeśli domyślna nazwa nie została zdefiniowana w któryś z powyższych sposobów, próba wykonania LOAD bez parametru powoduje błąd numer 31.
MOVE/-MOVE
To samo, co w Turbo BASIC-u z tym wyjątkiem. że akceptowane są 24-bitowe adresy, a poza tym korzysta się z rozkazu przesłania blokowego 65C816.
NEW
To samo, co w Turbo BASIC-u, z tym wyjątkiem, że można podać nazwę pliku jako argument (np. NEW "D:FOO.BAS). Kasuje to aktualny program w BASIC-u (wraz z linią komend), a dla nowego programu defniuje nazwę domyślną jak podano.
PEEK()
To działa tak samo jak w Turbo BASIC-u XL poza tym, że funkcja przyjmuje 24-bitowe wartości jako adres.
PI
Stała numeryczna o wartości 3.14159265.
POKE
To działa tak samo jak w Turbo BASIC-u XL poza tym, że komenda przyjmuje 24-bitowe wartości jako adres.
RANDOMIZE
To słowo kluczowe zostało wprowadzone po to, żeby ułatwić przenoszenie programów z Microsoft BASIC-a - jednak ponieważ MultiBASIC korzysta ze sprzętowego generatora liczb losowych, przeto RANDOMIZE działa w rzeczywistości jak VOID - oblicza wyrażenie podane jako argument i ignoruje wynik.
REM
Tradycyjnie, z tym, że linie zaczynające się od REM mogą być potraktowane inaczej niż pozostałe przy generowaniu wcięć listingu. Kontroluje to SET 17:
- SET 17,0 - linie z REM nie podlegają wcięciom (default)
- SET 17,1 - linie z REM podlegają wcięciom jak wszystkie inne
RUN
Komenda ta ma cztery postaci:
- RUN - uruchamia od początku program znajdujący się w pamięci
- RUN 1000 - podany parametr numeryczny oznacza numer linii, od którego znajdujący się w pamięci program ma być uruchomiony
- RUN "D:FOO.BAS" - wczytuje z dysku plik "FOO.BAS" i uruchamia go od początku
- RUN "D:FOO.BAS",1000 - wczytuje z dysku program "FOO.BAS" i uruchamia go od wskazanej linii.
Jeśli w programie nie ma linii o podanym numerze, wykonanie zaczyna się od najbliższej następnej. Jeśli podana jest nazwa pliku, to stanowi ona nową nazwę domyślną dla komend LOAD i SAVE - a jednocześnie załadowanie nowego programu kasuje starą linię komend.
SAVE
Działanie dokładnie takie samo jak w Turbo BASIC-u XL z tym wyjątkiem, że podanie nazwy pliku jest opcjonalne. Gdy nie podano, przyjmowana jest nazwa domyślna. Nazwa domyślna to:
- nazwa pliku podana ostatnio przy wykonywaniu LOAD "fname" albo RUN "fname"
- nazwa pliku podana interpreterowi w linii komend jako specyfikacja pliku do załadowania i/lub uruchomenia
- nazwa pliku zdefiniowana przez komendę NEW "fname" lub FILENAME "fname"
Jeśli domyślna nazwa nie została zdefiniowana w któryś z powyższych sposobów, próba wykonania SAVE bez parametru powoduje błąd numer 31. Jeśli domyślna nazwa jest zdefiniowana, a zostanie wykonane SAVE z podaną nazwą pliku, domyślna nazwa się nie zmienia. Ale jeśli domyślna nazwa nie jest zdefiniowana, wtedy wykonanie SAVE z podaną nazwą pliku powoduje, że podana nazwa pliku staje się nazwą domyślną (krótko: SAVE "D:FOO.BAS" działa jak funkcja "Save as..." w systemach okienkowych).
SEEK
Składnia: SEEK #iocb,value
Komenda przesuwa znacznik odczytu i zapisu pliku otwartego jako kanał o numerze iocb do pozycji wskazanej przez zmienną lub stałą value. Wywoływana funkcja systemowa to XIO 37. UWAGA: to będzie działać tylko ze SpartaDOS - w innych DOS-ach pod tym numerem zaimplementowana jest funkcja POINT, która działa inaczej a swobodny dostęp do danych w pliku jest niemożliwy ze względu na ograniczenia narzucone przez filesystem. Patrz też TELL.
SET
SET ustawia wewnętrzne zmienne interpretera sterując jego pracą. Składnia:
SET variable,value
W wewnętrznej zmiennej interpretera wybranej przez wartość variable zapisywana jest wartość value. value może mieć wartości z zakresu od 0 do 255. Niektóre zmienne nie przyjmują wszystkich wartości z tego zakresu (przy próbie zapisu wartości spoza akceptowalnego zakresu następuje błąd nr 3). Zmienne o numerach od 0 do 15 mają znaczenie zgodne z BASIC XE (aczkolwiek nie wszystko jeszcze jest zaimplementowane). Oto lista numerów zmiennych wraz z opisem funkcji:
Zmienne zgodne z BASIC XE
- 0 - definiuje zachowanie interpretera po wciśnięciu przez użytkownika klawisza Break
- po SET 0,0 (default) wciśnięcie Break powoduje przerwanie programu i wyświetlenie komunikatu "Stopped" względnie "Stopped at line ...".
- po SET 0,1 wciśnięcie Break będzie generować błąd nr 1, który można przejąć przez TRAP. Jest to zachowanie zgodne z BASIC XE.
- po SET 0,2 wciśnięcie Break powoduje powstanie błędu nr 128, który także da się przejąć przez TRAP. Jest to zachowanie zgodne z tym, co robi Turbo BASIC XL po wykonaniu komendy *B+. W istocie SET 0,2 ma dokładnie taki sam skutek jak *B+, natomiast *B- jest ekwiwalentem do SET 0,0.
- 1 - liczba pozycji tabulacji, jaką przeskakuje przecinek użyty w instrukcji PRINT. Minimum to 3.
- 2 - kod ATASCII znaku zechęty instrukcji INPUT. Początkowo $3F ('?').
- 3 - niezaimplementowane
- 4 - niezaimplementowane
- 5 - SET 5,1 (default) powoduje, że kontrola składni akceptuje słowa kluczowe wpisane małymi literami; SET 5,0 przełącza to w tryb zgodny z Atari BASIC (akceptowane sa tylko duże litery).
- 6 - SET 6,0 (default) powoduje wyświetlanie słownych objaśnień komunikatów błędów, SET 6,1 wyłącza objaśnienia.
- 7 - niezaimplementowane
- 8 - SET 8,1 (default) włącza odkładanie na szczycie stosu liczby argumentów funkcji USR i LUSR, SET 8,0 wyłącza to.
- 9 - SET 9,1 powoduje, że prawidłowe wykonanie instrukcji ENTER będzie powodowało wystąpienie błędu numer 32. SET 9,0 (default) wyłącza to.
- 10 - niezaimplementowane
- 11 - niezaimplementowane
- 12 - SET 12,1 (default) włącza wcięcia listingu, SET 12,0 wyłącza je.
- 13 - SET 13,1 (default) włącza dekodowanie liczb szesnastkowych przez funkcję VAL, SET 13,0 wyłącza to.
- 14 - niezaimplementowane
- 15 - niezaimplementowane
Zmienne własne MultiBASIC-a
- 16 - liczba spacji dostawianych i ujmowanych za każdym "skokiem" wcięć listingu. Wartość początkowa to 2.
- 17 - SET 17,0 (default) powoduje, że linie zaczynające się od REM nie podlegają wcięciom; SET 17,1 włącza normalne wcięcia dla takich linii.
- 18 - to samo co 17, ale dla linii zaczynających się od separatora (--).
- 19 - SET 19,0 (default) powoduje, że systemowe kody błędów interpretowane są jako liczby ujemne, natomiast wewnętrzne kody błędów BASIC-a pozostają dodatnie. SET 19,1 przywraca zachowanie znane z Atari BASIC-a (kody wszystkich błędów interpretowane sa jako liczby dodatnie).
- 20 - wartość ICAX2 dla systemowej funkcji otwarcia katalogu do odczytu; 128 pod SpartaDOS, w przeciwnym wypadku 0. Zmienianie tej wartości pod innym DOS-em niż SpartaDOS jest raczej niezalecane.
- 21 - styl listingu: SET 21,0 (default) to styl Turbo BASIC-a XL, SET 21,1 wybiera styl BASIC-a XE. W pierwszym przypadku wszystkie słowa kluczowe, nazwy zmiennych itp. listowane są dużymi literami, np. GRAPHICS 8:COLOR 1:PLOT 0,0:DRAWTO 319,191. W drugim przypadku listing formatowany jest inaczej: nazwy zmiennych i słowa kluczowe listowane są małymi literami za wyjątkiem pierwszej litery, która pozostaje duża: Graphics 8:Color 1:Plot 0,0:Drawto 319,191.
- 22 - wartość początkowa numeru pierwszej linii dla komendy AUTO. Defaultowo jest 10.
- 23 - wartość początkowa przyrostu numeru linii dla komendy AUTO. Defaultowo jest 10.
- 24-28 - te wartości moga być tylko odczytane, natomiast nie mogą być zmienione.
Wszystkie wyżej podane zmienne mogą zostać odczytane funkcją SYS.
SOUND
W porównaniu z Turbo BASIC-em XL komenda może opcjonalnie służyć do sterowania drugim POKEY-em w komputerach ze stereo. Wyboru układu dokonujemy przez podanie na początku parametru LR podobnie jak w przypadku komendy AUDCTL i DSOUND:
SOUND #LR[,channel,frequency,pitch,volume]
LR ma wartość 0 lub 1. Pominięcie pozostałych parametrów powoduje wyłączenie dźwięku we wskazanym kanale stereo. Dostępność stereo sprawdzamy przez SYS(28).
STATUS
Działanie jest takie samo jak w Turbo BASIC XL z tym wyjątkiem, że numer błędu jest defaultowo ujemny (np. -120 zamiast tradycyjnego 136, zob. kody błędów). SET 19,1 przełącza kodowanie numerów błędów na system tradycyjny.
SYS
Funkcja numeryczna odczytująca wewnętrzne zmienne interpretera sterujące jego pracą. Składnia:
value=SYS(variable)
Z wewnętrznej zmiennej interpretera wybranej przez wartość variable odczytywane jest wartość value. value może mieć wartości z zakresu od 0 do 255. Zmienne o numerach od 0 do 15 mają znaczenie zgodne z BASIC XE (aczkolwiek nie wszystko jeszcze jest zaimplementowane). Oto lista numerów zmiennych wraz z opisem funkcji:
Zmienne zgodne z BASIC XE
- SYS(0) - zachowanie interpretera po wciśnięciu przez użytkownika klawisza Break
- wartość 0 (default): wciśnięcie Break powoduje przerwanie programu i wyświetlenie komunikatu "Stopped" względnie "Stopped at line ...".
- wartość 1: wciśnięcie Break będzie generować błąd nr 1, który można przejąć przez TRAP. Jest to zachowanie zgodne z BASIC XE.
- wartość 2: wciśnięcie Break powoduje powstanie błędu nr 128, który także da się przejąć przez TRAP. Jest to zachowanie zgodne z tym, co robi Turbo BASIC XL po wykonaniu komendy *B+.
- SYS(1) - liczba pozycji tabulacji, jaką przeskakuje przecinek użyty w instrukcji PRINT. Minimum to 3.
- SYS(2) - kod ATASCII znaku zachęty instrukcji INPUT. Początkowo $3F ('?').
- SYS(3) - niezaimplementowane
- SYS(4) - niezaimplementowane
- SYS(5) - wartość 1 (default): kontrola składni akceptuje słowa kluczowe wpisane małymi literami; wartość 0 - tryb zgodny z Atari BASIC (akceptowane sa tylko duże litery).
- SYS(6) - wartość 0 (default): wyświetlanie słownych objaśnień komunikatów błędów; wartość 1: objaśnienia wyłączone.
- SYS(7) - niezaimplementowane
- SYS(8) - wartość 1 (default): funkcja USR odkłada na stos liczbę przekazanych jej parametrów; wartość 0 - funkcja USR nie odkłada na stos liczby parametrów.
- SYS(9) - wartość 1: prawidłowe wykonanie instrukcji ENTER będzie powodowało wystąpienie błędu numer 32; wartość 0 (default) - ENTER wykona się bez zgłaszania błędu na zakończenie.
- SYS(10) - niezaimplementowane
- SYS(11) - niezaimplementowane
- SYS(12) - wartość 1 (default): włączone wcięcia listingu, wartość 0 - wyłączone wcięcia listingu.
- SYS(13) - wartość 1 (default): funkcja VAL dekoduje ciągi cyfr szesnastkowych; wartość 0 - nie robi tego.
- SYS(14) - niezaimplementowane
- SYS(15) - niezaimplementowane
Zmienne własne MultiBASIC-a
- SYS(16) - liczba spacji dostawianych i ujmowanych za każdym "skokiem" wcięć listingu. Wartość początkowa to 2.
- SYS(17) - zero (default): linie zaczynające się od REM nie podlegają wcięciom; 1 - normalne wcięcia dla takich linii.
- SYS(18) - to samo co 17, ale dla linii zaczynających się od separatora (--).
- SYS(19) - zero (default): systemowe kody błędów interpretowane są jako liczby ujemne, natomiast wewnętrzne kody błędów BASIC-a pozostają dodatnie; 1 - zachowanie znane z Atari BASIC-a (kody wszystkich błędów interpretowane są jako liczby dodatnie).
- SYS(20) - wartość ICAX2 dla systemowej funkcji otwarcia katalogu do odczytu; początkowo 128 pod SpartaDOS, w przeciwnym wypadku 0.
- SYS(21) - styl listingu: zero (default) to styl Turbo BASIC-a XL, 1 - styl BASIC-a XE. W pierwszym przypadku wszystkie słowa kluczowe, nazwy zmiennych itp. listowane są dużymi literami, np. GRAPHICS 8:COLOR 1:PLOT 0,0:DRAWTO 319,191. W drugim przypadku listing formatowany jest inaczej: nazwy zmiennych i słowa kluczowe listowane są małymi literami za wyjątkiem pierwszej litery, która pozostaje duża: Graphics 8:Color 1:Plot 0,0:Drawto 319,191.
- SYS(22) - wartość początkowa numeru pierwszej linii dla komendy AUTO. Defaultowo jest 10.
- SYS(23) - wartość początkowa przyrostu numeru linii dla komendy AUTO. Defaultowo jest 10.
- SYS(24) - "major version number" interpretera MultiBASIC-a.
- SYS(25) - "minor version number" interpretera MultiBASIC-a.
- SYS(26) - "major version number" zainstalowanego w systemie SpartaDOS-u. Albo zero, jeśli jest inny DOS.
- SYS(27) - "minor version number" zainstalowanego w systemie SpartaDOS-u. Albo zero, jeśli jest inny DOS.
- SYS(28) - 1 = stereo POKEY, zero w przeciwnym wypadku.
Większość wartości może zostać zmieniona komendą SET.
SYSCALL
Składnia: SYSCALL value
Wywołuje procedurę wskazaną przez value. W zależności od tej wartości komenda zadziała na jeden z trzech sposobów:
- dla wartości od 0 do 3 nastąpi wywołanie procedury systemowej przypisanej arbitralnie do wybranej liczby: 0 oznacza procedurę RESETCD, 1 - RESETWM, 2 - SIOINT. Wywołanie następuje w trybie emulacji.
- wartości od 4 do $03FF oraz od $E000 do $FFFF są zarezerwowane i będą powodować wystąpienie błędu nr 3 (BAD VALUE)
- pozostałe wartości traktowane są jako 24-bitowe adresy do wywołania długim skokiem JSL (powrót przez RTL). Wywołanie następuje w trybie natywnym.
TELL
Składnia: TELL #iocb,var
Komenda odczytuje (ustawiony przez SEEK) znacznik odczytu i zapisu pliku otwartego jako kanał o numerze iocb i przypisuje odczytaną wartość do zmiennej numerycznej var. Wywoływana funkcja systemowa to XIO 38. UWAGA: to będzie działać tylko ze SpartaDOS - w innych DOS-ach pod tym numerem zaimplementowana jest funkcja NOTE, która działa inaczej a swobodny dostęp do danych w pliku jest niemożliwy ze względu na ograniczenia narzucone przez filesystem. Patrz też SEEK.
TRAP
Instrukcja działa identycznie jak w Turbo BASIC-u XL z tym wyjątkiem, że argument można pominąć - TRAP kasuje wtedy ustawioną wcześniej pułapkę, a więc działa to tak samo jak TRAP 32768 w Atari BASIC.
USR()
Działa to identycznie jak w Turbo BASIC XL z tym wyjątkiem, że za pomocą SET 8 można wyłączyć odkładanie na stos liczby parametrów przekazanych do funkcji USR(), dzięki czemu podprogram może być zakończony przez proste RTS (e nie PLA/RTS). Oznacza to możność wywoływania procedur systemowych (w rodzaju CIOMAIN) przez USR.
Wywołanie jest zawsze robione w trybie emulacji, a adres podprogramu musi się mieścić w pierwszych 64k.
WAIT
Zatrzymuje procesor - instrukcją WAI - do chwili wystąpienia przerwania.
VAL()
Funkcja numeryczna mająca to samo zadanie co w Turbo BASIC-u XL. Dodatkowe działanie - zgodne z BASIC XE - przewiduje dekodowanie do wartości numerycznej łańcuchów tekstowych zawierających cyfry szesnastkowe. W przeciwieństwie do DEC(), VAL() wymaga podania znaku $ na początku takiego łańcucha, inaczej nie zostanie on rozpoznany jako liczba. Przykład: ? VAL("$FFFFFF") wyświetli "16777215". Podobnie jak w przypadku DEC() rozpatrywane jest tylko do sześciu cyfr szesnastkowych, a gdy podano więcej, funkcja bierze pod uwagę sześć ostatnich.
Rozpoznawanie liczb szesnastkowych można wyłączyć komendą SET 13.
VOID
Składnia: VOID num_expr
Wyrażenie numeryczne num_expr jest obliczane, ale wynik obliczeń jest ignorowany. Przydaje się to przy wywoływaniu funkcji numerycznych, które wykonują jakieś działania i zwracają wynik, ale programista jest zainteresowany tylko działaniami, natomiast wynikiem nie bardzo. Np. VOID USR(1536) zaoszczędza przypisywania przypadkowej wartości do zmiennej w sytuacji, kiedy wywoływany podprogram nie zwraca żadnego wyniku.
XOR
To samo, co % i EXOR, operator binarnej różnicy symetrycznej zaczerpnięty z Microsoft BASIC.