Tajemnice ATARI

Piszemy DEMO

Zamiast wstępu

   Poniższy artykuł rozpoczyna cykl pod tytułem "Piszemy Demo". Mamy nadzieję, że po skompletowaniu i przeanalizowaniu wszystkich odcinków tego cyklu, każdy z zainteresowanych czytelników będzie w stanie zaprogramować swoje pierwsze demo. Zapewne większość z Państwa zauważyła już, że ten artykuł nie ma nic wspólnego z opublikowaną wcześniej zapowiedzią serii.

Co już umiemy ?

   Wszystkie programy publikowane w kolejnych artykułach naszego cyklu napisane zostały w QA. Z tego względu zakładamy, że każdy pragnący poznać tajemnice Atari posiada legalną (poprawnie działającą) kopię tego programu i wnikliwie przestudiował rozdział instrukcji poświęcony programowaniu 6502. Oprócz znajomości mnemoników i trybów adresowania naszego procesora czytelnik powinien umieć posługiwać się jeszcze dwoma systemami numeracji: dwójkowym i szesnastkowym.

Co to jest demo?

   Demo, jak sama nazwa wskazuje, jest programem prezentującym (z jak najlepszej strony) możliwości graficzne i muzyczne komputera. W przypadku naszego 8-bitowego Atari, zadanie to nie jest proste: konieczna jest umiejętność programowania procesora graficznego ANTIC oraz znajomość rejestrów GTIA. Obydwa te układy odpowiedzialne są za tworzenie obrazu. POKEY natomiast, między innymi, tworzy dźwięk. W tym i w następnym artykule zajmiemy się szczegółowo ANTIC'iem - czyli ekranem.

Display List

   ANTIC, jak każdy procesor, potrafi wykonywać program. Poszczególne rozkazy programu (omówione poniżej) określają strukturę wyświetlanego obrazu. Wektor DLPTRS umieszczony w pamięci w komórkach $230 i $231 (560 i 561) wskazuje na program ANTIC'a. ANTIC potrafi zaadresować 64 kilobajty pamięci, podobnie jak CPU (Central Processor Unit - centralna jednostka sterująca, czyli 6502). Oznacza to, że program ANTIC'a możemy umieścić w dowolnie wybranym miejscu pamięci.

Rozkazy ANTIC-a

   Rozkazy mikroprocesora ANTIC można podzielić na trzy grupy:
  • tworzące puste linie;
  • tworzące Unie trybów graficznych lub tekstowych;
  • rozkazy skoków.

       Rozkazy tworzące puste linie mają cztery młodsze bity skasowane. Bity 4-6 zawierają liczbę tworzonych pustych linii, zmniejszoną o jeden. Oto pełna lista rozkazów tworzących puste linie:

    jedna pusta linia - $00
    dwie puste linie - $10
    trzy puste linie - $20
    cztery puste linie - $30
    pięć pustych linii - $40
    sześć pustych linii - $50
    siedem pustych linii - $60
    osiem pustych linii - $70

       Następną wyróżnioną przez nas grupą rozkazów są rozkazy tworzące linie trybów graficznych lub tekstowych. Poniższa tabela zawiera zestawienie wszystkich tych trybów:

    tryb ANTIC-a tryb OS
    $02 $00
    $03 -
    $04 $0C
    $05 $0D
    $06 $01
    $07 $02
    $08 $03
    $09 $04
    $0A $05
    $0B $06
    $0C $0E
    $0D $07
    $0E $0F
    $0F $08

       Wykorzystując to, co wiemy, ułóżmy pierwszy program dla ANTIC'a, wyświetlający na ekranie dziewięć linii w trybie $02 ANTIC'a:
    Program Equ $8800
    
    List_mem Equ %00000110
    List_err Equ %00000101
    Code_mem Equ %00010000
    Code_dsk Equ %00100000
    
    Dlptrs   Equ $0230
    Kbcodes  Equ $02FC
    
             Opt List_err+Code_mem
            
             Org Program
    
    
             Lda Dlptrs+1
             Pha
             Lda Dlptrs
             Pha
             Ldx DList
             Stx Dlptrs
             Sty Dlptrs+1
             Jsr Klawisz
             Pla
             Sta Dlptrs
             Pla
             Sta Dlptrs+l
             Rts
    
    Klawisz  Lda #$FF
             Sta Kbcodes
    L1       Cmp Kbcodes
             Beq L1
             Rts
    
    DList    Equ *
        Dta B($02),B($02),B($02)
        Dta B($02),B($02),B($02)
        Dta B($02),B($02),B($02)
    
             End
    
       Po uruchomieniu programu wektor DLPTRS odkładany jest na stos. Następnie ustawiamy go tak, aby wskazywał na nasz program ANTIC"a, zaczynający się od etykiety DLIST. Podczas gdy komputer oczekuje na naciśnięcie klawisza (procedura klawisz) widoczny jest efekt działania programu. Po naciśnięciu klawisza przywracany jest stary wektor DLPTRS. Zgodnie z oczekiwaniami na ekranie pojawiło się dziewięć linii trybu $02 ANTIC'a. Oprócz nich zostały wyświetlone również inne, zupełnie przypadkowe linie obrazu, ponieważ program ANTIC'a nie został poprawnie zakończony. Aby to zrealizować musimy poznać jeszcze dwa rozkazy, rozkazy skoków:

  • JMP ($01) - tworzy jedną pustą linię, a następne dwa bajty programu ANTIC'a nie są rozkazami, tylko adresem dalszej części Display List. Rozkaz ten jest analogiczny do rozkazu JMP procesora 6502.
  • JVB ($41) - kończy program ANTIC'a, a kolejne dwa bajty programu nie są rozkazami, tylko powinny być adresem początku Display List.

       Teraz jesteśmy w stanie zlikwidować przypadkowe linie, umieszczając na końcu programu ANTIC'a rozkaz JVB. Część programu zawierająca Display List ma postać:

    Dlist  Dta B($02),B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($41),A(Dlist)
    
           End
    
       W ten sposób otrzymaliśmy dziewięć linii trybu $02 ANTIC'a. Linie te zawierają przypadkowe znaki. Dzieje się tak dlatego, że nie poinformowaliśmy ANTIC'a skąd ma pobierać dane do wyświetlania. Tak więc, musimy się zapoznać z kolejnym pojęciem LMS (Load Memory Scan). Zmodyfikujmy poprzedni program tak, aby ANTIC pobierał dane z wyznaczonego przez nas obszaru pamięci. Program po modyfikacji, od etykiety DList, wygląda następująco:

    DList  Dta B($42),A(Text)
           Dta B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($41),A(Dlist)
    
           Org $A000
    
    Text   Dta D'Tajemnice Atari.'
     
           End
    
       W pierwszym rozkazie programu ANTIC'a ustawiony został szósty bit (czyli do $02 dodaliśmy $40), a następujący po nim wektor wskazuje na wybrany przez nas obszar pamięci. Z obszaru tego ANTIC będzie pobierał dane wyświetlane na ekran przy pomocy licznika pamięci obrazu. Licznik ten jest automatycznie zwiększany przez ANTIC. Przy tej operacji brane jest pod uwagę tylko 12 najmłodszych bitów licznika, co ogranicza zakres jego działania do czterech kilobajtów. W praktyce oznacza to, że jeśli dane obrazu zajmują więcej niż 4 kilobajty, to po przekroczeniu granicy czterokilobajtowego bloku kolejne dane będą pobierane od początku tego bloku. W naszym przykładzie licznik pamięci ekranu ustawiony jest na tekst rozpoczynający się od etykiety Text. Po uruchomieniu programu tekst ten ukaże się na ekranie. Zwróćmy uwagę na to, że napis "Tajemnice Atari" zapisany jest w pamięci w kodzie IOCODE. Na koniec pierwszego artykułu podajemy jeszcze jedną proponowaną przez nas modyfikację. Ponieważ linie wyświetlane są od samej góry ekranu i mogą być niewidoczne na niektórych monitorach, to należałoby obniżyć wyświetlany ekran. W tym celu umieśćmy trzy rozkazy $70 (tworzące w sumie 24 puste linie). Każdy program ANTIC'a tworzony przez system operacyjny rozpoczyna się tymi rozkazami. Oto zmodyfikowany fragment naszego programu:

    DList  B($70),B($70),B($70)
           Dta B($42),A(Text)
           Dta B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($02),B($02),B($02)
           Dta B($41),A(Dlist)
    
           Org $A000
    
    Text   Dta D'Tajemnice Atari.'
     
           End
    
       Dalszy ciąg za miesiąc...

    Tomasz Bielak
    Rafał Blelecki



  • Powrót na start | Powrót do spisu treści | Powrót na stronę główną

    Pixel 2001