Mam dla Was coś ekstra!
Po co pisać w BASICu, V2 w dodatku, skoro możecie od razu pisać w assemblerze?
No, prawie...
Jeśli macie kawałek Linucha albo przynajmniej Cygwin/MinGW, to zapraszam do zbudowania sobie fantastycznego języka programowania dla ośmiobitowych zabytków.
Język nazywa się Atalan (ATAri LANguage
) i przy umiejętnym pisaniu wypluwa kod assemblerowy zoptymalizowany tak dobrze, jakbyście pisali bezpośrednio w języku maszynowym.
Pełną specyfikację znajdziecie tu:
http://atalan.kutululu.org/A dające się zbudować źródła - tu:
https://github.com/ssuukk/AtalanCzemu o tym piszę? No cóż - to już prośba do zaawansowanych - przydałoby się trochę pomocy w ogarnięcu generatorów kodu dla naszego C64, ponieważ domyślnie Atalan generuje kod dla assemblera MADS pod Atari. Dla swoich projektów już częściowo przekonwertowałem instrukcje na ca65, odpowiadają za to pliki w katalogu:
cpu\m6502
m6502.asm - całkowicie przekonwertowany, jest OK, assembluje się. Ten plik zawiera kawałki "standardowej biblioteki Atalana", takie jak mnożenie, dzielenie, pisanie po ekranie.
m6502.atl - plik Atalana mówiący jak konwertować pośredni mikrokod atalana na assembler 6502 - tu jest trochę sałatki, ponieważ póki co tylko część instrukcji, tych, których potrzebowałem do moich projektów jest w formacie a65, reszta w MADS, co oczywiście może powodować że skompilowany plik assemblera też będzie zawierał mix mnemoników dla a65 i MADS (głównie chodzi o pseudokody dla rzeczy takich jak .byt, .word, tworzenie tablic itp.). Dodatkowo - w niektórych przypadkach brak tam konwersji mikrokodu na assembler i pewnych konstruktów, które Atalan teoretycznie ma, nie da się wykorzystać, DOPÓKI NIE DODA SIĘ ICH W TYM PLIKU w postaci kodu assemblerowego. Więc jest to dość łatwe, jak tylko rozkmini się minimalnie składnię tegoż pliku
I najfajniejsza chyba rzecz, którą ktoś miły mógłby chcieć pomóc rozwijać, to te pliki:
platform/c64/c64.atl i c64.asm
Pierwszy z nich zawiera np takie definicje:
borderColor @53280:color
backgroundColor @53281:color
Color: enum
black
white
red
cyan
purple
green
blue
yellow
orange
brown
lightred
garkgrey
grey
lightgreen
lightblue
lightgrey
Dzięki czemu potem w kodzie Waszego programu, kiedy chcecie czarną ramkę piszecie po prostu:
borderColor = Color.black
A Atalan, o ile w akumulatorze jest właśnie przypadkiem 0, podmieni tę linijkę na:
STA 53280
Fajnie?
Dalej w tymże pliku mamy definicję:
KLoad@$ffd5: proc type:byte@cpu.a startAddr@(CPU.x,CPU.y):adr -> state@cpu.c error@cpu.a lastByte@(cpu.x,cpu.y):adr @cpu.a @cpu.x @cpu.y
Ale co znaczą te wszystkie symbole?
KLoad to procedura zawarta w pamięci pod adresem$ffd5 - to chyba jasne. Przyjmuje ona dwa argumenty, pierwszy nazywa się "type" i przenoszony jest przez rejestr A procesora, a drugi nazywa się startAddr i umieszczony zostanie w rejestach X i Y procesora. Procedura zwraca trzy wartości (serio!) zawarte w rejestrze C, A oraz adres w X+Y. I wywołujecie ją w swoim kodzie np. tak:
stan,blad,koniec = KLoad 1,$0800
Tadam? Fajnie?
Ostatnie krzaczki w linii informują generator kodu Atalana, że wywołanie tej proceduy wymaże zawartość rejestrów X, Y i A (zaawansowanym nie muszę tłumaczyć, po co to...)
Ten plik zawiera jeszcze parę innych pożytecznych skrótów, ale możnaby go rozszerzyć o wiele, wiele więcej, np. zmiany trybu graficznego, operowanie duszkami itp.
Jak ktoś jest chętny do pomocy, to zapraszam...