1

Temat: Altirra BASIC

http://i.imgbox.com/TFsa7Va0.png

Altirra BASIC jest interpreterem przeznaczonym dla rodziny Atari 8-bit, w tym 400/800, 1200XL, 600/800XL, 800/130XE i XEGS. Zaprojektowany, by stanowić zamiennik „kropla w kroplę” dla Atari BASIC-a, ale z dodatkowymi rozszerzeniami i szybciej działający. Jest też łatwiejszy w użyciu. Pomimo tej zgodności, Altirra BASIC nie opiera się na Atari BASIC-u, lecz stanowi reimplementację od podstaw.

To nie jest mój opis, a przetłumaczony (mniej więcej) wstęp z podręcznika „Altirra BASIC Reference Manual. 11/29/14 Edition”. Autorem zarówno podręcznika, jak i „Altirry BASIC-a” jest Avery Lee, znany też pod ksywką phaeron. Jeżeli ktoś chciałby zaznajomić się ze szczegółami, to polecam ten podręcznik – link na dole postu.

Altirra BASIC występuje w dwóch formatach: obrazu kartridża ROM 8 kB (atbasic.bin) i pliku uruchamianego spod DOS-a (atbasicx.xex). Pod SpartaDOS do wczytywania musi być użyte polecenie X.

Niedawno na Atari Age ktoś wykrył drobny błąd w interpreterze. Uznałem, że to dobry pretekst, by bliżej zaznajomić się z tą odmianą BASIC-a. Poniżej przedstawię czym różni się Altirra BASIC od Atari BASIC-a, a konkretnie jakimi poleceniami i dorzucę garść moich wrażeń z pracą z tym programem.

Przyjąłem, iż osobie czytającej ten tekst znane są podstawy programowania w BASIC-u. - Oto nowe polecenia:


Operacje na liczbach i pamięci

&, !, %
Binarne: koniunkcja [AND] (&), alternatywa [OR] (!) i alternatywa wykluczająca [exclusive OR, XOR] (%). Dopuszczalny zakres liczb to 0 - 65535.

$hhhh
Liczby szesnastkowe (HEX) w programie. Można używać liczb całkowitych z zakresu 0 - 65535 ($0 - $FFFF - hex), np. $FDE8 to 65000 dziesiętnie.

HEX$(n)
Zamienia liczbę „n” formacie dziesiętnym na liczbę szesnastkową w formacie czterech znaków.
Uwaga: w tym samym wyrażeniu może występować tylko jedno HEX$ lub STR$. Np. wyrażenie STR$(n)<(HEX$(n) doprowadzi do błędnego wyniku.

BGET #IOCB, dokąd, ile
Pobiera dane z kanału IOCB i zapisuje do lokalizacji pamięci, począwszy od adresu „dokąd”. Ilość przesyłanych bajtów określa trzeci parametr (ile).

BPUT #IOCB, skąd, ile
Przesyła dane do kanału IOCB, począwszy od lokalizacji w pamięci „skąd”. Ilość przesyłanych bajtów określa trzeci parametr (ile).

DPEEK(n)
Odczytuje 2-bajtową liczbę (słowo) spod adresu n według wzoru: n+256*(n+1). Odczytywana liczba zawiera się przedziale 0 - 65535.

DPOKE n, słowo
Zapisuje słowo do dwóch kolejnych komórek pamięci, począwszy od n. Dopuszczalne są liczby całkowite z przedziału 0 - 65535.

MOVE skąd, dokąd, ile
Dokonuje transferu bloku pamięci od adresu skąd, do adresu dokąd. Ile określa ilość transferowanych bajtów. Jeżeli adres dokąd jest mniejszy niż skąd + ile nastąpi nadpisanie. Aby tego uniknąć, należy parametr ile podać jako ujemny.

Obsługa manipulatorów

HSTICK(n)
Zwraca poziomą (horyzontalną) pozycję dżojstika n (n=0 dżojstik w porcie #1, n=1 dżojstik w porcie #2). Jeżeli dźwignia wychylona jest w lewo - -1, jeżeli prawo - +1, a 0 w pozycji neutralnej.

VSTICK(n)
Zwraca pionową pozycję dżojstika n (n=0 dżojstik w porcie #1, n=1 dżojstik w porcie #2). Jeżeli dźwignia wychylona jest w dół (do siebie) - -1, jeżeli w górę (od siebie) - +1, a 0 w pozycji neutralnej.

Operacje dyskowe

DIR"dn:nazwa"
Wyświetla pliki z katalogu dysku lub innego urządzenia „d” o numerze „n” i wskazanej nazwie. Samo „DIR” (bez parametrów) wyświetli cały katalog dysku nr 1.

ERASE"dn:nazwa"
Kasuje plik (pliki) z katalogu dysku lub innego urządzenia „d” o numerze „n” i wskazanej nazwie. Skrót to ER. (nie podaje go Altirra BASIC Reference Manual. 11/29/14 Edition).

PROTECT"dn:nazwa"
Nakłada na plik blokadę przed skasowaniem lub zmianą nazwy. Format analogiczny do ERASE. Skrót to PRO. (nie podaje go Altirra BASIC Reference Manual. 11/29/14 Edition).

RENAME"dn:nazwa_stara,nazwa_nowa"
Zmienia nazwę pliku. Np. RENAME"D3:PLIK.EXE,PLIK.XEX”.

UNPROTECT"dn:nazwa"
Polecenie odwrotne do PROTECT.

CP
Przejście do DOS-a zorientowanego na procesor poleceń (linię komend), a nie menu jak np. w DOS 2.5 czy MyDOS.

* * *

Podsumowując...

Altirra BASIC (ATB), jak już wspomniano, ogólnie działa nieco szybciej niż Atari BASIC, a to za sprawą pewnych ulepszeń. Buforuje adresy powrotu poleceń FOR i GOSUB, rozpoczyna poszukiwanie linii od aktualnej, a nie od początku programu. Niemniej jednak niektóre polecenia, szczególnie skoku wstecz (np. 1000 GOTO 900) mogą być wykonywane wolniej niż Atari BASIC-u.

Zastosowanie nadal mają wszystkie zalecenia dotyczące optymalizacji programu w Atari BASIC-u. Np. umieszczenie większej liczby poleceń w jednej linii, zwłaszcza pętli, przyspieszy działanie. Procedury krytyczne czasowo należy umieszczać blisko początku programu. Im dalej tym wolniej program jest wykonywany.

Mnie w szczególności cieszy pojawienie się takich poleceń jak MOVE i DIR. Pierwsze pozwala na np. błyskawiczną „podmianę” generatora znaków (wreszcie nie trzeba stosować „protezy” w asemblerze), drugie na odczyt katalogu dysku, co łącznie z pozostałymi poleceniami dyskowymi znacząco poprawia komfort obsługi. Czasami zdarzało się, że chciałem wczytać jakiś program, ale nie pamiętałem nazwy, więc skok do DOS-a, sprawdzenie katalogu i powrót do BASIC-a. Teraz można wczytać program, o ile nadal pamięta się jego nazwę. ;) Obecnie wpisujemy z poziomu BASIC-a DIR i już wiadomo wszystko.

Polecenia HSTICK i VSTICK upraszczają i ułatwiają obsługę dżojstików, co przy nieoszałamiającej prędkości interpretera jest istotnym postępem. BPUT i BGET - wreszcie szybka współpraca z dyskiem przy przesyłaniu danych. Niektórzy pewnie z zadowoleniem przyjmą możliwość używania liczb w formacie szesnastkowym.

Jak wygląda kwestia kompatybilności?

Wszystkie programy napisane w Atari BASIC-u można uruchamiać pod ATB. Odwrotnie również, o ile nie zostaną użyte polecenia niedostępne w Atari BASIC-u. Tokeny ATB są w pełni zgodne z OSS BASIC-em XL i XE dlatego nie ma problemu z wymianą oprogramowania w obu kierunkach - przy zastrzeżeniu, że programy napisane w BASIC-u XL lub XE a uruchamiane pod ATB nie posiadają poleceń niewystępujących w ATB. Z przenoszeniem programów do Turbo-BASIC-a XL jest już trudniej, ale też istnieje taka możliwość. Ponownie musi być spełniony warunek braku w programie poleceń niewystępujących, tym razem wzajemnie. Przykładowo w TBXL nie ma polecenia HSTICK i VSTICK. Jest jeszcze drugi warunek. Ze względu na różnice w tokenach, przeniesienie musi następować przez zapisanie źródłowego programu poleceniem LIST i odczytanie go przez ENTER pod interpreterem docelowym.

Jak pisze się programy w ATB?

Cóż, brak pętli warunkowej, choćby WHILE - WEND czy polecenia IF - ELSE, komplikuje w wielu przypadkach kod. Te same zadania np. w Turbo-Basic-u XL, BASIC-u XE czy w Advanie można wykonać nierzadko znacznie prościej i... szybciej. Dokucza też brak polecenia RENUM (zmiana numerów linii). Nieco łagodzi ten problem możliwość wykorzystania renumeratora z BASIC-a XL lub XE, jeżeli posiada się stosowny kartridż. Aby nie przedłużać - ATB sporo brakuje do innych implementacji BASIC-a, szczególnie tych wymienionych przed momentem.

Zatem czy ATB mnie rozczarował? Nic podobnego. Celem stworzenia tego języka było zastąpienie 1:1 staruszka Atari BASIC-a, który już nie mógł doczekać się przejścia na emeryturę, nowym. I to zdecydowanie się udało! Modernizacja w takim zakresie z zachowaniem rozmiaru 8 kB to nie lada wyczyn.

Jeżeli ktoś jest przywiązany do programowania w Atari BASIC-u, to Altirrę BASIC przyjmie z pewnością z zadowoleniem, a przynajmniej taka jest moja ocena. Tu jeszcze jedna uwaga. Jeśli masz niedobre przyzwyczajenie przerywania programu w BASIC-u poprzez RESET, to teraz będziesz musiał zapomnieć o tym klawiszu. Jego naciśnięcie spowoduje zimny start komputera, czyli utratę całej zawartości pamięci RAM. Nie jest to problem, bo RESET jest rodzajem wyjścia awaryjnego i normalnie nie powinien być używany.

W chwili ukazania tego postu najnowsza wersja ATB to 1.39, ale niewykluczone, że pojawią się nowsze.

Jest jeden haczyk. Brak kompilatora, ale to już inna historia i opowiemy (być może) ją wam innym razem.

Zaraz, zaraz, to już koniec? Przecież była mowa o pisaniu programu? No tak, najlepiej poznać język coś w nim pisząc. Ech... niech wam będzie... zajrzyjcie do Krainy BASIC-a. :)

- - - - - -
Aktualizacja: 23.04.2015

Powyższy opis dotyczy wersji 1.39, tymczasem pojawiła się wersja 1.40 z rewolucyjną, można rzec, zmianą, a mianowicie:

IF warunek:instr.1:ELSE: instr.2:ENDIF
Jeżeli warunek po IF jest prawdziwy, to zostaną wykonane wszystkie instrukcje przed słowem kluczowym ELSE (instr.1). Jeżeli warunek nie jest prawdziwy, wówczas wykonane zostaną instrukcje pomiędzy ELSE a ENDIF (instr.2). Polecenie IF...ELSE...ENDIF nie musi mieścić się w jednej linii, może obejmować wiele linii programu.

- - - - - -
Aktualizacja: 19.05.2015

Dwa nowe polecenia.

ERR(n)
Wraz z TRAP pozwala na napisanie własnej obsługi błędów w programie. Jeżeli n=0 to funkcja ta zwraca numer błędu, jeżeli n=1, numer linii, w której wystąpił błąd. Przykład:

10 TRAP 100
20 A=10/0
100 ? ERR(0),ERR(1)

Ready
RUN
11        20

LOMEM adres
Rezerwuje obszar pamięci poniżej programu. Np. LOMEM DPEEK(128)+256. Uwaga. Polecenie te usuwa aktualnie znajdujący się w pamięci program.

- - - - - -
Aktualizacja: 10.06.2015

Tym razem sześć nowych poleceń przeznaczonych do obsługi PMG.

BUMP(nr_p/m,kolizja_z_obiektem)
Odczytuje zawartość sprzętowego rejestru kolizji PMG. Przyjmuje wartość 1, gdy kolizja wystąpiła lub 0, gdy kolizji nie było. Aby uzyskać właściwy wynik, odpowiednio przed odczytem BUMP należy skasować rejestr kolizji (POKE 53278,dowolna_wartość_niezerowa).
https://images2.imgbox.com/d0/e8/sLNwJQgp_o.png

MISSILE nr,pozycja_pionowa,wysokość
Aktywuje wybrany (nr=4-7) missile (pocisk) umieszczony na pozycji pionowej (liczonej od góry ekranu) o wskazanej wysokości. Np. MISSILE 7,96,8 umieści missile 7 (czyli 3 według oznaczenia Atari) na pozycji 96 od góry ekranu o wysokości 8 pikseli. Kolejne użycie tego polecenia z tym samym numerem pocisku usuwa obiekt z poprzedniej pozycji, umożliwiając w ten sposób tworzenie animacji.

PMADR(nr_p/m)
Podaje położenie w pamięci wybranego playera (0-3) lub łącznie wszystkich missile (4-7).

PMCLR nr_p/m
Czyści pamięć przeznaczoną dla wybranego playera (0-3) lub łącznie wszystkich missile (4-7).

PMGRAPHICS n
Wyłącza (n=0) lub włącza grafikę PM: n=1 – rozdzielczość jednoliniowa, n=2 – dwuliniowa.

PMMOVE nr_p/m,h;v
Przesuwa wybrany (nr) player lub missile na ekranie. H to bezwzględna pozycja pozioma (0-255), a v (oddzielany średnikiem!) to pozycja względna, tzn. określa, o ile pikseli w pionie zostanie przesunięty wybrany obiekt. Dopuszczalny zakres to od 0 do +255 w górę i od 0 do -255 w dół. Np. PMMOVE 0,100,-2 ustawi na ekranie playera 0 na poz. poziomej 100 i równocześnie przesunie go w pionie o dwa piksele w dół. Parametry h i v są opcjonalne, tzn. jeden z nich może zostać pominięty.

- - - - - -
Aktualizacja: 05.07.2015

Nowe polecenie do obsługi PMG.

PMCOLOR nr_p/m,kolor,jaskrawość
Ustala kolor playera (0-3) i równocześnie missile o tym samym numerze co player. Kolor i jaskrawość to parametr z zakresu 0-15.

- - - - - -
Najnowsza aktualizacja: 9.05.2017

Phaeron udostępnił poprawioną wersję ATB (1.54), tym razem problem wystąpił z poleceniem PMBASE.

Ostatnio edytowany przez Bluki (2018-11-18 20:47:26)

Post's attachments

Altirra BASIC 1.53 - nowe polecenia (broszura A5).pdf 73.92 kb, liczba pobrań: 11 (od 2017-03-17) 

Altirra BASIC 1.54 (ATR, XEX, BIN).7z 16.39 kb, liczba pobrań: 5 (od 2017-05-09) 

Altirra BASIC Reference Manual (2018-08-12).pdf 421.38 kb, liczba pobrań: 7 (od 2018-11-18) 

Tylko zalogowani mogą pobierać załączniki.

2

Odp: Altirra BASIC

Hej!

Fajnie że chciało Ci się to przetłumaczyć :) Ja ze swojej strony dodam że to właśnie Altirra BASIC pomógł mi w szybkim testowaniu koncepcji "efektów" do PA2015 compo zorganizowanego przez Sikora. Poniżej ten efekt który użyłem w Sikor PA2015, tylko dzięki operatorom AND, EOR (&, %) obyło się bez żadnego USR-a... czyli pure BASIC :)

3002 GRAPHICS 9
3003 FOR X=0 TO 63:FOR Y=0 TO 47
3004 C=X%Y:IF  NOT C&15 THEN C=1
3005 COLOR C:PLOT 8+X,Y*4:DRAWTO 8+X,Y*4+3
3006 NEXT Y:NEXT X
3007 FOR J=0 TO 1:FOR I=0 TO 255:POKE 20,0
3008 IF PEEK(20)<4 THEN 3008
3009 POKE 712,I:NEXT I
3010 GRAPHICS 11+32:NEXT J
9999 GOTO 9999

Ostatnio edytowany przez seban (2015-04-05 01:05:12)

3

Odp: Altirra BASIC

Czy mając w Atari zamontowane Ultimate można Atari Basic sobie podmienić na ten powyżej opisany i używać go "na stałe"?

4

Odp: Altirra BASIC

Cześć,

Myślę że jak najbardziej jest to możliwe... potrzebny jest obraz (ROM/BIN) Altirra BASIC oraz uFLASH:

http://atari8.co.uk/uflash/
http://atari8.co.uk/wp-content/uploads/2015/03/uflash3-300x214.png

przy pomocy którego można dokonać upgrade któregoś z banków CAR widocznych potem w menu Ultimate:

https://dl.dropboxusercontent.com/u/44199/ult_car1.png

5

Odp: Altirra BASIC

Spróbuję dziś wieczorem sam i dam znać :)

.: miejsce na twoją reklamę :.

6

Odp: Altirra BASIC

W stosunku do TBXL ryzykowna jest zmiana znaczenia operatora %.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

7

Odp: Altirra BASIC

Przydało by się:

1. Kompilator z linkerem do xex/exe
2. dostęp do ext ram, np na takiej zasadzie, jak jest to rozwiązane pod Basic XE.

ADRES: pin@atari.pl - konto zlikwidowane. Aktualny adres: pin(at)atari8.info

8

Odp: Altirra BASIC

A ja wolałbym nowy linker do Turbo Basica, najlepiej taki, co dołączałby tylko używane biblioteki, a nie wszystkie. Niech by chodził w dwu-trzech przebiegach, zamiast w jednym - i tak jest to operacja jednorazowa. Ale znając życie istnieje tylko opcja "napisz se", a na to jestem za cienki...
Co do podmiany w samej atarce - uważam to za zbyt ryzykowne (ne uzyskamy pełnej kompatybilności)  -ale cóż, nie znam się ;)

Sikor umarł...

9

Odp: Altirra BASIC

Sikor napisał/a:

uważam to za zbyt ryzykowne

Szczególnie w przypadku ULTIMATE ;)

ADRES: pin@atari.pl - konto zlikwidowane. Aktualny adres: pin(at)atari8.info

10

Odp: Altirra BASIC

Główny problem ze zgodnością i chyba jedyny, to większa prędkość ATB. Można zastosować przełącznik BASIC-ów (również w sensie programowym) lub zewnętrzny kartridż AB, jak w A 400/800.

Ostatnio edytowany przez Bluki (2015-04-05 15:11:34)

11

Odp: Altirra BASIC

@Pin: nie każdy ma i nie każdy chce mieć ultimate
Z ciekawości: wersja xex ładuje się tam, gdzie oryginalny basic?

Sikor umarł...

12

Odp: Altirra BASIC

Tak, dokładnie w miejsce Atari BASIC-a.

13

Odp: Altirra BASIC

Aha. Więc jakaś alternatywa jest dla tych, co nie chcą ROMu wymieniać. Dzięki za info.

Sikor umarł...

14

Odp: Altirra BASIC

Sikor napisał/a:

@Pin: nie każdy ma i nie każdy chce mieć ultimate

No Pin nie ma… jak na razie jedynym posiadaczem U1MB w regionie południowego Krakowa jestem prawdopodobnie ja… ale BASICiem pobawię się jutro, bo dzisiaj już się dosyć zmęczyłem(!) siedzeniem przy świątecznym stole…

.: miejsce na twoją reklamę :.

15

Odp: Altirra BASIC

Sikor napisał/a:

A ja wolałbym nowy linker do Turbo Basica, najlepiej taki, co dołączałby tylko używane biblioteki, a nie wszystkie. Niech by chodził w dwu-trzech przebiegach, zamiast w jednym - i tak jest to operacja jednorazowa.

Bezapelacyjnie popieram!!

Brak kompilatora jest dla mnie najwieksza wada altirra basic tak samo jak i advana, tam kompilator jest ale wypluwa juz nie pamietam co ale nic rozsadnego, bodajze loader tam jakis byl to kompilowanych plikow.

16

Odp: Altirra BASIC

Podobno zostało 8 wolnych bajtów na poprawki. Ciekawe, czy usunięcie obsługi nieopisanych skrótów ER. i PRO. zwiększyłoby bufor na ewentualne poprawki?

17

Odp: Altirra BASIC

PROTECT i UNPROTECT mógł nazwać LOCK i UNLOCK, miałby 6 bajtów więcej.

KMK
? HEX$(6670358)

18

Odp: Altirra BASIC

Phaeronowi zależy na zachowaniu zgodności z OSS BASIC-em XL/XE, a tam właśnie są nazwy  PROTECT i UNPROTECT.

19

Odp: Altirra BASIC

Nazwy można zmienić nie zrywając całkowicie zgodności: co prawda przy wczytywaniu programu przez ENTER wyskoczyłby błąd składni, ale większość programów jest stokenizowana, więc jak brzmi słowo kluczowe w interpreterze, nie robi im żadnej różnicy.

To przy założeniu, że w ogóle istnieją programy zawierające słowa kluczowe PROTECT i UNPROTECT (tudzież LOCK/UNLOCK).

Oczywiście, kto ma jakie priorytety, to jego sprawa, ale skoro się narzeka na 8 bajtów miejsca, to nadmieniam, że można byłoby tego miejsca łatwo mieć 14 bajtów.

Ostatnio edytowany przez drac030 (2015-04-07 14:32:52)

KMK
? HEX$(6670358)

20

Odp: Altirra BASIC

Napisałem, jakoś zapewne odpowie.

21

Odp: Altirra BASIC

Jest już wersja 1.40 ATB, szczegóły w zaktualizowanym poście #1.

22

Odp: Altirra BASIC

Bardzo ładnie. Z MultiBASIC-a pamiętam, że implementacja IF/ELSE/ENDIF nie jest specjalnie trudna, a znacznie polepsza dzielność danego dialektu BASIC-a.

KMK
? HEX$(6670358)

23

Odp: Altirra BASIC

Doszły dwa nowe polecenia: ERR i LOMEM - więcej w zaktualizowanym poście #1.

24

Odp: Altirra BASIC

A możesz załączniki dodawać do forum?
Dely i Krap się chyba nie obrażą, a szukanie tego po latach będzie łatwiejsze ;)

25

Odp: Altirra BASIC

Szkopuł w tym, że załączniki są niedostępne dla niezalogowanych użytkowników. Patrząc jednak na ilość pobrań,  przy najbliższej okazji zrezygnuję z zewnętrznego hostingu plików.

Aktualizacja goni aktualizację - jest już uzupełniony o nowe polecenia podręcznik Avery'ego Lee. Link w poście #1 (na dole).

Ostatnio edytowany przez Bluki (2015-05-19 18:27:00)