Atari Action! Displaylisty, wskaźniki i inne.

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…