Ja w chwili obecnej pracuję nad nowym interpreterem BASIC-a. Ma to być język programowania na Atari wyposażone w Warpa-4 albo Nową Nienazwaną Dopałę Pasia (na Atari z "golym" 65c816 też pójdzie, ale zostawi mało wolnej pamięci). W związku z tym istnieje tylko wersja pod 65c816, a wersja na 6502 nie powstanie, bo na 6502 jest świetny Turbo BASIC XL i to wystarczy (a ci, co nie chcą sobie za bardzo ułatwiać, mają Atari BASIC).
Screenshota nie posiadam, ale niebieski ekran z napisem "Ready" każdy sobie może łatwo wyobrazić. Nie mogę się też podzielić żadą wersją preview na razie, z braku kabelka.
Nazwa b. oryginalna pochodzi od tego, że MultiBASIC ma stanowić połączenie Turbo BASIC-a XL i BASIC-a XE. Zgodność z Turbo BASIC XL jest na poziomie tokenów (do MultiBASIC-a można wczytywac programy TBXL przez LOAD i one będą działać), natomiast zgodność z BASIC XE ma być na poziomie słów kluczowych (do MultiBASIC-a będzie można wczytywać programy BASIC-a XE przez ENTER i one może będą działać).
W opisie poniższym zakładam, że Atari BASIC i Turbo BASIC XL jest wszystkim znany, wyszczególnię więc tylko różnice w stosunku do obydwu.
Przede wszystkim, interpreter działa z linii komend pod SpartaDOS i pod DOS II+/D (za to ostatnie trzeba dziękować Lizardowi, bo to jego parser jest tam wkompilowany, z małymi acz niezbędnymi modyfikacjami). Składnia:
mb [options] [filename.bas]
Program o nazwie 'filename.bas' zostanie automatycznie załadowany. Opcje są następujące:
-R - po załadowaniu program jest automatycznie uruchamiany, a po zakonczeniu albo przewaniu interpreter zgłasza się przez "Ready"
-B - jak wyżej, ale po zakończeniu programu interpreter wraca do DOS-u
Komunikaty BASIC-a są trochę mniej toporne niż w Atari BASIC: jest "Ready" zamiast "READY", "Error 170 at line 15" zamiast "ERROR- 170 AT LINE 15", "Stopped" zamiast "STOPPED". Dodatkowo obsługa błędów jest rozszerzona opcjonalnie o dwie rzeczy:
- słowne komunikaty błędów, dłuższe niż w TBXL, do 12 znaków
- numer błędu jest wypisywany jako liczba ujemna
A więc nie "ERROR- 170 AT LINE 17", tylko "Error -86 NO SUCH FILE at line 17". Obie featury można wyłączyć.
Listing jest wyprowadzany z wcięciami, jak w TBXL. Można to wyłączać i włączać na dwa sposoby, albo jak w TBXL (poleceniem *L) albo jak w BXE (poleceniem SET). Można regulować skok wcięcia, oraz oddzielnie włączyć i wyłączyć wcięcia dla komend REM i --.
Dodatkowo można opcjonalnie włączyć listowanie w stylu BASIC-a XE, czyli słowa kluczowe mają pierwszą literę dużą, a resztę małymi (np. For I=1 To 1000 Step 0.9:Next I itp.).
Program można wpisywać dużymi lub małymi literami, bez różnicy (można przełączyć na wyłącznie duże litery, zgodnie z BASIC XE). Interpreter akceptuje wszystkie słowa kluczowe napisane małymi literami, a nie, jak TBXL, tylko te, które zaczynają się od litery, a więc małymi literami można wpisać również -MOVE albo %GET i nie będzie błędu.
Rozszerzenia słów kluczowych Atari BASIC i Turbo BASIC XL:
1) polecenia POKE, DPOKE, MOVE, -MOVE, oraz funkcje ADR(), DPEEK(), PEEK() operują na 24-bitowych adresach.
2) funkcja VAL() opcjonalnie konwertuje liczy HEX, tak jak w BASIC-u XE.
3) wszystkie konwersje HEX<>DEC są 24-bitowe. DEC() konwertuje także liczby napisane małymi literami, w inwersie, poprzedzone spacjami (co w TBXL nie zachodzi).
4) funkcja USR() działa jak w BASIC XE, to znaczy opcjonalnie może nie wstawiać na stos liczby parametrów. USR() działa tylko na banku 0 (pierwsze 64k).
5) błąd procedury kontroli składni dla poleceń DIM i COM został poprawiony.
6) CLOSE może być bez parametru, jak w Turbo BASICu XL
7) STATUS zwraca ujemny kod błędu, jeśli takowe są włączone
7,9) POINT akceptuje stałe, a nie tylko zmienne (to jak w TBXL)
9) Rozszerzona instrukcja SOUND:
- SOUND bez parametru, jak w TBXL
- SOUND z dodatkowym parametrem:
SOUND #n
SOUND #n,chn,freq,pitch,vol
gdzie "#n" może być #0 albo #1 i oznacza kanał lewy i prawy dla komputerów ze stereofonicznym Pokeyem. Tak samo DSOUND.
10) rozszerzone instrukcje NEW/LOAD/SAVE/RUN:
NEW "filename.bas"
definiuje domyślną nazwę dla nowego programu. Wpisanie SAVE bez parametrów spowoduje zapis pod tą właśnie nazwą. LOAD bez parametrów ładuje program o takiej nazwie, LOAD "filename.bas" ładuje program o wskazanej nazwie i ustawia ją jako domyślną (a więc działa jak NEW "filename.bas" / LOAD). RUN "filename.bas" działa tak samo, ale jeszcze oczywiście uruchamia wczytany program. SAVE z podaną nazwą zapisuje program pod tą nazwą, ale NIE ZMIENIA nazwy domyślnej.
11) jeszcze jedno rozszerzenie do RUN:
RUN 100
RUN "filename.bas",100
Pierwsze uruchamia program od linii 100, drugie ładuje najpierw plik "filename.bas", a potem odpala go od linii 100. Co do numeru linii, działa to jak LIST 100,200, to znaczy program odpalany jest od linii 100, a jeśli jej nie ma, to od najbliższej następnej.
Wszystko to jest już zaimplementowane i działa. Jest też zaimplementowana spora garść komend Turbo BASIC-a XL, to jest w chwili obecnej:
- komendy: DPOKE, MOVE, -MOVE, *F, *B, *L, REPEAT, UNTIL, WHILE, WEND, IF, ELSE, ENDIF, BPUT, BGET, FILLTO, DO, LOOP, EXIT, DIR, LOCK, UNLOCK, RENAME, DELETE, PAUSE, TIME$, FCOLOR, --, BLOAD, BRUN, CLS, DSOUND
- operatory i funkcje: DPEEK, &, !, EXOR, %0, %1, %2, %3, HEX$,DEC,DIV,MOD,FRAC,TIME,RND,RAND,TRUNC,ERR,ERL
Z BASIC-a XE napisałem dopiero:
- komendy: SET
- operatory i funkcje: SYS, %
'%' to to samo co EXOR w TBXL.
SET i SYS() służą do regulacji parametrów pracy interpretera i włączania i wyłączania różnych opcji. Docelowo (tego jeszcze nie ma) interpreter będzie tuż po starcie ładował plik ustawień z katalogu domyślnego (czyli z tego, z którego został załadowany, albo z bieżącego). Plik ustawień będzie normalnym programem BASIC-a z poleceniami SET w środku, oczywiście będzie mógł też zawierać dowolne inne.
Słowa kluczowe nowe dla MultiBASIC-a:
1) AUTO, włączenie automatycznej numeracji linii, jak w Microsoft BASIC:
AUTO
AUTO start
AUTO start,step
Defaultowo "start" (numer linii od której zaczyna się numeracja) jest 10, a step jest 5. Po pierwszym użyciu komenda zapamiętuje ostatnio wypisany numer linii i za drugi razem startuje od niego. Reset przez NEW albo przez AUTO 0,0.
2) FILE, przypisuje wskazanej zmiennej numerycznej numer pierwszego wolnego kanału IOCB. Użycie:
K=FILE:OPEN #K,4,0,"D:fname":GET #K,A:? A:CLOSE #K
3) SEEK:
SEEK #n,var
SEEK #n,num
Robi seek na wskazanym pliku "n" do pozycji wskazanej zmienną albo stałą numeryczną.
4) TELL - odwrotność SEEK, przypisuje wskazanej zmiennej bieżącą pozycję we wskazanym pliku.
TELL #1,var
5) FLEN - przypisuje wskazanej zmiennej długość pliku:
FLEN #n,var
Oczywiście, żeby skorzystać z komend SEEK, TELL i FLEN, trzeba mieć SpartaDOS ;)
6) WAIT - wstrzymuje CPU do chwili wystąpienia jakiegokolwiek przerwania.
7) VOID:
VOID expression
Oblicza wyrażenie numeryczne 'expression' i ignoruje wynik ;) Jest to w zasadzie komenda dla przyszłego kompilatora MultiBASIC-a, ale w interpreterze też się przyda, np.:
VOID USR(adres)
7,9) PI - pseudozmienna o wartości 3,14159265
To na razie tyle. W planach jest jeszcze wiele rzeczy, ale nie są jeszcze do końca ustalone. Z planów: listę tokenów instrukcji można rozszerzać w zasadzie w nieskończoność, a konkretnie może być ich 256 bez specjalnego trudu (zajęte jest ok. 120). Dlatego stopniowo można zaimplementować wszystkie komendy BASIC-a XE i Microsoft BASIC-a, o ile nie będzie specjalnych konfliktów co do składni albo znaczenia (przykładowo EXIT w TBXL i Exit w BASIC-u XE - raczej trudno jest je pogodzić).
Gorzej natomiast jest z tokenami funkcji, tych może być tylko 128, z czego obsadzonych jest 114. Pozostają dwa tokeny "normalne" oraz 12 zarezerwowanych na oznaczanie typów zmiennych i tym podobne. Jeśli uda mi się wykorzystać jeden z tokenów rezerwy na prefix dla dodatkowych operatorów i funkcji, to stopniowo zaimplementuję wszystkie funkcje z BASIC XE i Microsoft BASIC. Jeśli nie - to tylko najciekawsze minimum.
? HEX$(6670358)