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.
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 |
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
|