Moje nocne eksperymenty z Atari Action! mają się całkiem nieźle. Jak dotąd najlepsza zabawa polega na przepisywaniu przykładowego kodu w Basicu na Action. Dość często wartościowe pod względem merytorycznym książki mają przykłady tylko w Atari Basic. Ostatnio przy okazji eksperymentów z display listami naciąłem się na pewne zjawisko:
1. Zdefiniowane w display liście adresy grafiki i tekstu przy kompilacji z RUNTIME.ACT (binarka ma działać bez cartridge) muszą być jawnie podane Antic-owi:
Ten przykład w Basic:
20 GRAPHICS 3 30 DLIST=PEEK(560)+PEEK(561)*256 35 REM MODIFY DISPLAY LIST 40 FOR 1=0 TO 2:POKE DLIST+9+I,PEEK(DLIST+3+I):NEXT I 50 FOR 1=0 TO 5:POKE DLIST+3+I,PEEK(DLIST+25+I):NEXT I 60 FOR 1=0 TO 5:POKE DLIST+25+I,8:NEXT I 70 REM PLOT GR. 3 80 PRINT "HI TEXT IS UP HERE" 90 SETCOLOR 0,12,4:REM SET COLOR 1 TO GREEN 100 SETCOLOR 2,4,6:REM SET COLOR 3 TO PINK 110 COLOR l:PLOT O,O:DRAWTO 10,10 120 COLOR 3:PLOT 12,12:DRAI.JT0 19,0 1000 GOTO 1000
Po małych modyfikacjach samej display listy (tylko jedna linia tekstu na górze, a dlist definiowany w tablicy, w całości) w Action! wygląda tak:
include "H1:RUNTIME.ACT" proc main() card savmsc=88 card textaddr=660 byte array dltb=[ 112 112 112 66 96 159 72 112 158 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 65 78 158 ] card dlist=560 graphics(3) dlist=dltb ; piękne, prawda? textaddr=40800 printe("Action!") savmsc=40560 setcolor(2,4,6) color=1 plot(0,0) drawto(10,10) color=3 plot(12,12) drawto(19,0) do od return
Jak wyżej wspomniałem: jeśli display list definiuje adresy pamięci obrazu i tekstu, trzeba je podać Antic-owi w programie w przeciwnym razie fukcje print(), printe(), printf(), plot() czy drawto() nie będą działać standalone. W przypadku uruchomienia z cartem musi to się odbywać jakoś inaczej, ale w jaki sposób? Czy jakieś procedury analizują dlist? Tego się chyba nie dowiemy.
card savmsc=88 card textaddr=660
Powyższe definicje bardzo mi się w Action! spodobały, jest to zresztą cecha Action! – zmienna może być umieszczona pod konkretnym adresem w pamięci (w tym przypadku są to rejestry które pokazują Anticowi gdzie jest pamięć ekranu i tekstu). Co więcej, typ card pozwala na przypisanie wartości w jednej instrukcji przypisania (bez stosowania notacji LSB, MSB).
Po takiej definicji, wystarczy przypisać tym dwóm adresom właściwe wartości:
graphics(3) dlist=dltb ; ustawiamy pod adresem 560 adres tablicy, w której zdefiniowany jest nowy display list. textaddr=40800 ; 159*256+96 tutaj ustawiamy adres pamięci tekstu na ekranie wg display list. printe("Action!") savmsc=40560 ; 158*256+112 a tu adres grafiki
2. Wskaźniki.
Kolejną ciekawostką są w Action! wskaźniki. Wydawały mi się idealne do zmiany dlisty zamiast peeków i poków, jednak zauważyłem pewien problem: Jeśli wskaźnik zdefiniuje się w ten sposób:
CARD DL=560 BYTE POINTER DLP DLP=DL
to działa po kompilacji z RT.
BYTE POINTER DLP = DL
przypisuje wskaźnikowi adres, a nie wartość pod adresem, więc dostajemy nie to, o co nam chodzi.
BYTE POINTER DLP = DL^
działa z cartem, nie działa standalone (wyświetlają się zera).
Wbrew pozorom, takie eksperymenty zabierają sporo czasu, ale mam cały czas nadzieję, że pewne braki dokumentacji czy błędy w Action! da się ogarnąć, jak wyżej. Przy okazji eksperymentów znalazłem procedury w asm do przetestowania pod kątem szybszej obsługi grafiki, ale do tego brak mi jeszcze podstawowej wiedzy, więc będę sobie dalej czytał mądre książki znalezione na pigwie i przerabiał podane w nich przykłady…