Tajemnice ATARI

PISZEMY DEMO

Pierwszy krok

    Programowanie w języku maszynowym często uważane jest przez szarych użytkowników komputerów za rodzaj wiedzy tajemnej. Seria "Piszemy Demo" ma za zadanie pokazać czytelnikom, że napisanie programu w asemblerze to głównie kwestia znajomości systemu operacyjnego komputera - jego możliwości i sposobów wykorzystania. W kolejnych częściach naszej serii pokażemy jak je wykorzystać. Trzy pierwsze programy zawarte w cyklu po wpisaniu utworzą proste demo. Czytelnikom polecamy dokonywanie na nich eksperymentów. Wszystkie zamieszczone tu programy napisane są za pomocą QUICK ASEMBLER-a. Zakładamy, że czytelnicy znają rozkazy asemblera mikroprocesora 6502 (patrz: instrukcja do QA) oraz metody posługiwania się systemami szestnastkowym i dwójkowym. Tyle wstępu. Czas brać się do pracy.

   Komputery ATARI serii XL/XE w wersji podstawowej posiadają 64 kB pamięci RAM i 16 kB pamięci ROM. Niestety, nie cała pamięć RAM jest dostępna dla użytkownika. Na początek dla naszych zastosowań wystarczy świadomość, że mamy do dyspozycji pamięć od adresu $0700 do $BFFF. Tak naprawdę jest ona jednak jeszcze ograniczona przez np. DOS lub wykorzystywany przez nas asembler. Dobrze napisane programy informują zazwyczaj komputer ile wolnej pamięci pozostaje dla użytkownika. Informacje te zawarte są (o ile są ) w komórkach $02E5 (MEMTOP-adres górnej granicy wolnej pamięci RAM, dwubajtowy) oraz $02E7 (MEMLO-adres dolnej granicy wolnej pamięci RAM, dwubajtowy). Poza dwoma wyjątkami nie ma ograniczeń, w jakim obszarze umieścimy nasz program. Wyjątki te to umieszczenie obrazu i duszków w pamięci. Stosując bardziej zaawansowane techniki programowania można uzyskać teoretycznie 62kB wolnego RAM-u, ale o tym w którymś z następnych odcinków. Czas porozmawiać o pamięci obrazu. Mikrokomputery ATARI XL/XE posiadają specjalizowany procesor graficzny zwany skrótowo ANTIC. Procesor ten posiada własny zestaw rozkazów umożliwiający wyświetlanie grafiki o różnych parametrach: różnej rozdzielczości i ilości kolorów. ANTIC wspomagany jest przez drugi układ, GTIA, który odpowiedziały jest za kolory oraz umożliwia tworzenie duszków (ang. sprites). ANTIC posiada 16-bitową szynę adresową, która umożliwia umieszczenie danych dla obrazu w dowolnym miejscu RAM z małym ale... Otóż w liczniku obrazu, wskazującym ANTIC-owi skąd w danym momencie ma pobrać dane do wyświetlania zmieniane jest tylko 12 najmłodszych bitów, co ogranicza zakres działalności licznika do 4 kB. Trzeba uważać, aby dane dla obrazu nie przekroczyły wielkości tego bloku. Jak to obejść - za chwilę. Program ANTIC-a jest układany przez system operacyjny komputera lub przez użytkownika. Składa się on z ciągu rozkazów informujących ANTIC o rodzaju linii, która ma być aktualnie wyświetlona, o skokach lub innych cechach. Jak tworzyć program ANTIC-a? Przede wszystkim należy znać jego rozkazy. Są one 1 i 3 bajtowe. Należą do nich:

1. Rozkazy tworzenia pustych linii (jednobajtowe)
  • cztery młodsze bity są skasowane
  • bity od 4 do 6 zawierają liczbę pustych linii zmniejszoną o jeden - przykładowo: $30 - wyświetlenie 4 pustych linii (kolor z rejestru COLBAK)

    2. Rozkazy skoków (3 bajty)
  • pierwszy bajt zawiera rozkaz skoku; najmłodszy bit musi być równy l, bit 6 określa rodzaj skoku
  • gdy bit 6 jest równy 0 ($01), to tworzona jest jedna pusta linia, a dwa następne bajty (z tych trzech) przepisywane są do licznika programu w kolejności młodszy, starszy; powoduje to wykonanie dalszej części programu od wskazanego adresu, czyli działa to jak skok bezwzględny JMP
  • gdy bit 6 jest ustawiony ($41) ANTIC wykonuje skok z oczekiwaniem na synchronizację pionową; mówiąc normalnym językiem czeka, aż wiązka elektronów wyświetlająca obraz wróci na górę ekranu; rozkaz ten (oznaczany JVB) musi znajdować się na końcu programu ANTIC-a i wskazywać jego początek

    3. Rozkazy tworzenia linii trybu (jednobajtowe lub 3 bajtowe)
  • posiadają w czterech młodszych bitach numer trybu ($02 do $OF), określający sposób wyświetlania danych z pamięci; jest to oczywiście numer trybu ANTIC-a, różny od trybu Basic-a
  • pozostałe cztery bity oznaczają modyfikacje obrazu
  • ustawiony bit 7 (DLI - display list interrupt) oznacza skok do przerwania po zakończeniu wyświetlania linii obrazu
  • ustawiony bit 6 (LMS - load memory scan) powoduje, że dwa następne bajty programu przepisywane są do licznika pamięci obrazu - dzięki temu części obrazu mogą być umieszczone w różnych miejscach pamięci z zastrzeżeniem, że jeden blok danych dla obrazu nie może przekraczać wspomnianych wyżej 4 kB; jeżeli dane zajmują więcej niż 4 kB, konieczne jest ponowne ustawienie LMS; w przeciwnym razie po osiągnięciu końca bloku dane będą pobierane z początku tego samego bloku; należy uważać, aby dane żadnej linii obrazu nie przekraczały tego bloku, gdyż nie można zmienić LMS w trakcie wyświetlania linii
  • ustawiony bit 5 (VSC - vertical scrolling) oznacza włączenie pionowego przesuwu obrazu;
  • ustawiony bit 4 (HSC - horizontal scrolling) oznacza włączenie poziomego przesuwu obrazu; O wykorzystaniu właściwości bitów 4, 5 i 7 powiemy dokładnie za miesiąc. Poniżej krótka charakterystyka trybów wyświetlania obrazu ANTICu.

    tryb
    Anticu
    tryb
    OS
    znaków
    w linii
    bajtów
    w linii
    używane
    COLPFx
    TRYBY ZNAKOWE (tekstowe)
    2 $0 40 40 1,2
    3 brak 40 40 1,2
    4 $0c 40 40 0-3
    5 $0d 40 40 0-3
    6 $01 20 20 1-3
    7 $02 20 20 1-3
    TRYBY BITOWE (graficzne)
    8 $03 40 10 0-2
    9 $04 80 10 0
    10 $05 80 20 0-2
    11 $06 160 20 0
    12 $0e 160 20 0
    13 $07 160 40 0-2
    14 $0f 160 40 0-2
    15 $08 320 40 1,2

       Oczywiście, we wszystkich trybach używany jest rejestr COLBAK, do którego wpisujemy kolor ramki. W niektórych trybach jest to również kolor tła. Z braku miejsca nie podajemy dokładnej charakterystyki wszystkich trybów. Możecie ją znaleźć w książce (3). Zamieszczony poniżej program ilustruje metodę tworzenia własnego programu ANTIC-a, zwanego w skrócie DL (ang. display list co znaczy mniej więcej "lista ekranu"). Aby ANTIC wiedział, w którym miejscu pamięci znajduje się program dla niego, należy adres DL umieścić w rejestrze DLPTR. Sam program musi spełniać kilka warunków:

  • musi zawierać rozkaz LMS na początku (przed nim mogą być wyłącznie rozkazy wyświetlania pustych linii) oraz JVB na końcu
  • w sumie nie może być wyświetlanych więcej niż 216 linii obrazu (spróbuj co się stanie, jak będzie ich więcej...)

        Na koniec uwagi na temat samego programu. Zawarty w nim DL jest oczywiście przykładem nie wymagającym niewolniczego naśladowania. Polecam eksperymenty z własnym DL. Ustawione bity DLI i HSC zostaną wykorzystane za miesiąc. Program w poniższej wersji zostanie umieszczony od adresu $8800 (etykieta początek; zakładamy, że w QA MEMTOP i RUN ustawione są na ten adres).

    LITERATURA:

    (1) J. Ruszczyc "Asembler 6502", SOETO
    (2) W. Zientara "Mapa pamięci Atari XL/XE" cz. 1-3, SOETO
    (3) I. Chadwick "Mapping the Atari", COMPUTE! Books 1985
    (4) E. Lutz, B. Grohman "Atari Intern", Data Becker 1984
    (5) "De Re Atari", Byte Publishing, 1981

    list_err equ %00000101
    code_mem equ %00010000
    code_dsk equ %00100000
    
    
             opt list_err+code_mem
    
    
    dlptrs   equ   $0230
    colpf0s  equ   $02C4
    colpf1s  equ   $02C5
    colpf2s  equ   $02C6
    colpf3s  equ   $02C7
    colbaks  equ   $02C8
    kbcodes  equ   $02FC
    adres3   equ   $A000    |adres obrazka
    pocz     equ   $8800    |od tego adresu
                            |program bedzie
                            |umieszczony w pamieci
    
             org   pocz
    
    
    start    JSR ust_ekr
    
    
    petla    JSR wyjscie
             JMP petla
    
    
    ust_ekr  LDA 
    dl STA dlptrs+1 LDA #$08 | nowe kolory STA colpf0s LDA #$08 STA colpf1s LDA #$02 STA colpf2s LDA #$06 STA colpf3s LDA #$00 STA colbaks RTS wyjscie LDA kbcodes CMP #$1C | kod klawisza ESC BNE dalej | po jego nacisnieciu BRK | wracasz do edytora dalej RTS dl dta b($70) | 8 pustych linii dta b($C7),a(adres1) | DLI, LMS, tryb $07 dta b($70) dta b($42),a(adres2) | LMS, tryb $02 dta d'"""""' | tryb $02, 5 linii dta b($F0) | DLI, 8 pustych linii dta b($4E),a(adres3) | LMS, tryb $0F dta d'....................' dta d'....................' dta d'....................' dta d'...................' | tryb $0E, 80 linii dta b($F0),b($70) dta b($D6),a(adres4) | DLI,LMS,HSC,tryb $06 dta b($70) dta b($41),a(dl) | JVB na poczatek DL adres1 dta d' MojE PieRWszE DemO' adres2 dta d' Tutaj wpisz jakis swoj tekst:' dta d' 6*40=240 znakow. Nizej jest' dta d' miejsce na obrazek (80 linii).' org *+240 adres4 dta d' a tu bedzie scroll' org *+22 end


    Carampuc/ASF



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

    Pixel 2001