MultiBASIC
From Atariki
Wersja z dnia 03:55, 30 gru 2005 KMK (Dyskusja | wkład) (→AUDCTL) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) |
||
Linia 1: | Linia 1: | ||
- | [[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]]. | + | 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 [[Wojciech Zientara|Wojciecha Zientarę]]. Autorem dodatkowego kodu (interpreter ma obecnie prawie 19k), wszelkich rozszerzeń, poprawek i modyfikacji jest [[KMK]]. | + | Za podstawę MultiBASIC-a posłużył kod źrodłowy [[Atari BASIC]]-a rev. C opublikowany przez [[Wojciech Zientara|Wojciecha Zientarę]]. Autorem dodatkowego kodu (interpreter ma obecnie ponad 20k), wszelkich rozszerzeń, poprawek i modyfikacji jest [[KMK]]. |
== Cele projektu == | == Cele projektu == | ||
Linia 14: | Linia 14: | ||
* 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, 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 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 GOTO i GOSUB akceptują etykiety | ||
* instrukcje SAVE i LOAD nie wymagają bezwzględnie podawania nazwy pliku (istnieje coś takiego jak nazwa domyślna programu). | * 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. | * 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 programu w BASIC-u istnieje dostęp do parametrów przekazanych w linii komend DOS-u (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. | * 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 == | + | == Download == |
- | Poniżej znajduje się lista słów kluczowych i operatorów nowych lub o zmienionym działaniu w stosunku do [[Turbo BASIC XL|Turbo BASIC-a XL]]. | + | * [http://drac030.krap.pl/pl-mb-pliki.php Ze strony autora] |
- | + | ||
- | === % === | + | |
- | 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'''<br> | + | |
- | '''20 WHILE X<ARGC'''<br> | + | |
- | '''30 ? ARGV$(X):X=X+1'''<br> | + | |
- | '''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. Mozna je odczytać przez funkcje SYS(22) i SYS(23) oraz zmienić przez SET 22 i SET 23. | + | |
- | + | ||
- | === 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. | + | |
[[Kategoria:Oprogramowanie Atari 8-bit]] | [[Kategoria:Oprogramowanie Atari 8-bit]] | ||
+ | [[Kategoria:Języki programowania]] | ||
+ | [[Kategoria:BASIC]] |
Aktualna wersja
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 ponad 20k), 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 GOTO i GOSUB akceptują etykiety
- 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 (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.