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…

5 uwag do wpisu “Atari Action! Displaylisty, wskaźniki i inne.

  1. Hejka, próbuję skonwertować twój program, tak aby używał trybu graficznego 7 (kod ANTIC: 13), bo tryb 3 ma trochę zbyt duże piksele dla mnie, a chcę zrobić grę gdzie na górnym, tekstowym pasku byłoby wyświetlane punkty, życia, itd.

    Na razie mam coś takiego:

    INCLUDE "D2:RUNTIME.ACT"
    PROC MAIN()
    CARD SAVMSC=88
    CARD TEXTADDR=660
    BYTE ARRAY DLTB=[ 112 112 112 66 96
    159 72 112 158 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 65 78 158 ]
    CARD DLIST=560
    GRAPHICS(7)
    DLIST=DLTB ; PIKNE, 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
    

    ale to nie działa (niby się wyświetla, ale obraz jest poplątany

    • Hej, tak na szybko to na pewno trzeba też zmienić tą linię displaylisty: 72 112 158, 72=64+8, czyli jest dla starego trybu, a powinno być 64+13=77 no i w sumie trzeba też dobrze sprawdzić ile zajmuje pamięć obrazu w tym trybie :). Pobawię się wieczorem jak już dzieciaki pójdą spać. Fajnie, że Action! nieco odżywa, bo to super język który idealnie nadaje się do programowania Atari. Ja mam w planach grę na VBXE, ale póki co czekam na samą kartę…

  2. Tak jak przypuszczałem, grafika zajmuje więcej. Przesunięcie tekstu w inne miejsce załatwia sprawę ;).

    PROC MAIN()
    CARD SAVMSC=88
    CARD TEXTADDR=660
    BYTE ARRAY DLTB=[ 112 112 112 66 0
    64 77 108 157 13 
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 13 13 13 13
    13 13 13 13 65 78 158 ]
    CARD DLIST=560
    GRAPHICS(7)
    DLIST=DLTB ; PIKNE, PRAWDA?
    TEXTADDR=$4000
    SAVMSC=40300
    PRINTE("ACTION!")
    SETCOLOR(2,4,6)
    COLOR=1 PLOT(0,0) DRAWTO(20,20)
    COLOR=3 PLOT(12,12) DRAWTO(19,0)
    DO OD
    RETURN
    
    • Dzięki. A da się zrobić tak, aby text był wyświetlany od pierwszej kolumny z lewej, a nie od drugiej?

      W każdym razie mi się do gry przyda jak nic. Wielkie dzięki.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s