Madsowy „Hello World!”

Czytam powoli „Atari Roots” i przy trybach adresowania wymyśliłem sobie „Hello World” z wykorzystaniem madsowego .sb. Pomysł jest taki: pobieramy adres pamięci tekstu z adresu 660 i 661. Jest to trzecia od dołu linijka ekranu (pewnie dlatego, żeby print w basicu był prosty i obsługiwał tryby graficzne z „okienkiem tekstowym”). Odejmujemy odpowiednią magiczną liczbę (20 linii = 800 bajtów, LSB i MSB łatwo przeliczyć).

hello

Niespodzianka polega na tym, że opis .sb mówi: „it will convert all bytes into ATASCII screen codes before storing them”. Konwersja wykonywana jest do kodów ekranowych, stąd porównanie cmp #$db już po konwersji, zamiast #$9b.

     org $600
     cld
     sec
     lda 660
     sbc #32
     sta $cb
     lda 661
     sbc #3
     sta $cc
     ldy #0
     ldx #0
loop lda txt,y
     cmp #$db
     beq nxtl
     sta ($cb),y
     iny
     jmp loop
nxtl clc
     ldy #0
     lda $cb
     adc #54
     sta $cb
     lda $cc
     adc #0
     sta $cc
     inx
     cpx #24
     bne loop
rbow lda $d20a
     sta $d018
     lda #0
     sta $2c5
     sta $d40a
     jmp rbow
txt  .sb 'Hello World!' $9b

W „promocji” namalujemy na końcu losową tęczę :). Możliwości generowania obrazu tego małego komputerka zawsze mnie fascynowały.

Tabela mapowania ATASCII na kody ekranowe tutaj. Jak zauważył xxl na forum atarionline.pl przy napisie dłuższym niż 255 bajtów rejestr y się przekręci. W „Hello World!” nam to nie grozi, niech więc póki co zostanie tak jak jest.

Następny przystanek: plot/drawto.

Action! + asm.

Moje eksperymenty z Action! trwają i ten język programowania coraz bardziej mi się podoba. Po przeczytaniu „Assembly language and Action!” z Reference Manuala zacząłem się zastanawiać w jaki sposób łączyć ze sobą programy (binarne) w Action! i istniejące procedury w assemblerze. Są dwa sposoby: dla prostych procedur kod maszynowy 6502 można umieścić bezpośrednio w pliku źródłowym Action! w nawiasach [ ]. mads potrafi wygenerować listing, z którego taki żółtodziób jak ja może sobie skopiować kolejne rozkazy procesora i wstawić w nawias. Biorąc pod uwagę, że cała biblioteka runtime Action! jest tak zrobiona zastanawiałem się jak dołączyć bardziej skomplikowane procedury bez konieczności konwertowania ich do takiej postaci (o ile to w ogóle możliwe). Jakub na forum AOL mile mnie zaskoczył: wystarczy „skleić” pliki binarne np. za pomocą polecenia cat pod Linuksem (lub Cygwinem pod Windows).

Prosty przykład pokaże fajność tego połączenia, a wspomniany rozdział manuala wyjaśnia, że do procedury w asm można przekazać aż do 16 bajtów parametrów (poprzez akumulator A, rejestry X i Y i stronę zerową $A3-$AF):

ASMPROC.ASM:

org $600

lda #0
sta 710
rts

org $607

lda #52
sta 710
rts

ASMTEST.ACT:

include "H1:RUNTIME.ACT"

proc test1=$600()
proc test2=$607()

proc main()

card i

printe("Action! jest super !")

do
 test1()
 sound(0,121,10,6)
 for i=1 to 10000 do od

 test2()
 sound(0,50,10,6)
 for i=1 to 10000 do od
od

return

Po assemblacji łączymy oba pliki: cat ASMPROC.obx ASMTEST.BIN > ASMTEST.xex i gotowe.

Powiem krótko: cieszy mnie to niezmiernie :). Po 20-latach odkrywam na nowo jak niesamowitym urządzeniem było małe Atari… Połączenie Action! z assemblerem daje pełną swobodę i ogromne możliwości. Coś jak połączenie szkieletu w pythonie i modułów wymagających wydajności w C.

SDX rządzi.

Altirra po sflashowaniu SDX flasherem dla Side i dodaniu do utworzonego w ten sposób romu (za pomocą SDXImageUser.exe) sterownika PCLink i komendy RUN z tools.atr to rewelacyjne narzędzie do zabawy assemblerem na 8-bitowcu. Dodając do tego czteropak Kasztelana uzyskujemy bardzo zadowolonego Wikiego, który zapomina o depresji dnia codziennego :). Respect dla twórców tego softu.

Assembler 6502 na Linuksie.

No i w końcu mi się udało poeksperymentować. W tym celu kupiłem to małe 8-bitowe szare cudo techniki sprzed trzydziestu lat. Zacząłem czytać kurs assemblera 6502 z Tajemnic Atari (nr 3/91) i zastanawiałem się tylko, jakiego assemblera by tu (czytaj pod Linuksem)  użyć. Zarówno xasm jak i mads działają w wine, jednak każdorazowe uruchomienie wine trwa dość długo.

Okazuje się, że źródła mads kompilują się, co zresztą jest opisane w kodzie i dokumentacji, pod free pascal compilerem: fpc -Mdelphi -vh -O3 mads.pas. Tak utworzona binarka uruchamia się i generuje kod maszynowy Atari pod Linuksem błyskawicznie.

Po co? Bo zawsze chciałem to zrobić :). A swoją drogą artykuły w TA są super. Szkoda, że kiedyś byłem nieco za młody (czytaj głupi) żeby je dobrze zrozumieć.