| PROGRAMOWANIE | |
|
$d012 - CZĘŚĆ PIERWSZA PODSTAWY |
Wyświetlaniem obrazu C64 zajmuje się specjalizowany układ VIC-II. Jego parametry nie są może oszałamiające, jednak w zupełności wystarczają na wizualizacyjne potrzeby Komcia. Komunikacja między programami, a procesorem obrazu odbywa się poprzez szereg rejestrów sterujących, które pozwalają nam wybrać adresy wyświetlanej grafiki, jej rodzaj, położenie itd. Dzięki dostępowi do nich z poziomu języka maszynowego, możemy niezwykle szybko je zapisywać i odczytywać, co pozwala nam na płynne skrolowanie, odczyty pióra świetlnego, czy zmianę wyświetlanego trybu graficznego wielokrotnie w czasie wyświetlania zawartości jednego ekranu. Jednak by móc tego dokonać musimy wpierw wiedzieć, który dokładnie obszar ekranu jest aktualnie wyświetlany. I tu z pomocą przychodzi nam rejestr "RASTER" o adresie $D012.
Czym jest rejestr "RASTER"? Aby odpowiedzieć na to pytanie, musimy wpierw zastanowić się jak wyświetlany jest obraz na ekranie. Nawet oko nieuzbrojone w lupę potrafi zauważyć poziome prążki na kineskopie. Co niektórzy zauważą nawet pojedyncze piksele, ale będą pewnie i tacy, którzy niczego nie zauważą. Polecam im wymianę Rubina na jakiś nowszy telewizor lub włączenie telewizora albo wizytę u okulisty, ewentualnie odczekanie aż środki odurzające opuszczą organizm. Poziome prążki na ekranie to nic innego jak ślady po przejściu wiązki elektronów wywołujące świecenie luminofora.
Otóż bez względu na to co jest wyświetlane na kineskopie (ekran TV, video, komputerowy), obraz zawsze powstaje w ten sam sposób. Wiązka elektronów wędruje z lewego, górnego rogu ekranu do prawego, dolnego. Linia po linii z prędkością 50, 60 i więcej (w nowszych komputerach) razy na sekundę.
Warto zdać sobie sprawę z faktu, że nawet wyświetlenie jednego punktu, to pracowite omiatanie ekranu linia po linii (punkt po punkcie i skok na początek następnej linii), powrót do lewego, górnego rogu ekranu, a następnie powtórzenie całego cyklu. Każde pełne przejście wiązki elektronów przez ekran i utworzenie obrazu nazywamy "ramką". Ponieważ w PAL wyświetlenie jednego obrazu zajmuje 1/50 sekundy, więc w sekundzie mamy 50 "ramek". Skoro jedna "ramka" to cały obraz (z tłem), to w tym czasie działo elektronowe musi "narysować" 312 linii (PAL). Aby móc precyzyjnie określić, w której linii znajduje się wiązka elektronów posługujemy się komórką $D012.
Przykładowy programik odczytujący numer wyświetlanej linii zajmuje tylko jedną linię w kodzie maszynowym i wygląda tak:
lda $D012
Natomiast program czekający na np. linię 128 (licząc od początku ekranu, gdyż obszar standardowo widoczny mieści się w przedziale 50-249) może wyglądać następująco: lda #$80
cmp $D012
bne *-3
Język maszynowy jest na tyle szybki, by umożliwić nie tylko odczyt komórki RASTER, ale i wykonanie szeregu operacji "w międzyczasie". Na przykład zmienić kolor jednej linii: start
lda #$80
cmp $D012
bne *-3
inc $d020
lda #$81
cmp $d012
bne *-3
dec $D020
jmp start
Zaraz, zaraz! Przecież $D012 to tylko 8 bitów i można tam zapisać wartości od 0 do 255! Jak zmieścić 312 w 255? Niestety to prawda i nie da się zapisać w rejestrze RASTER wszystkich numerów wyświetlanych linii. To co robić? Twórcy C64 oddali nam do dyspozycji jeszcze najstarszy, siódmy bit rejestru SCROLY ($D011). Wystarczy sprawdzić wartość tego bitu, by określić dokładny numer wyświetlanej linii, np.: lda $D011
and #$80 Warto jeszcze wiedzieć, iż po starcie Komody jest tam zapisywana różna wartość w zależności od wersji Kernela. Niby nic wielkiego, ale jeśli ktoś chce pisać gierkę lub demo z obsługą przerwań RASTER (wtedy nie odczytujemy, a zapisujemy $D012) powinien ten fakt uwzględnić. Czy można pominąć zapis i odczyt $D011? Wbrew pozorom można sobie na to pozwolić bez problemu. Już wyjaśniam: Wyobraźmy sobie, że w naszym programie chcemy wyświetlić tło białe między liniami 20 i 40, oraz czarne na reszcie ekranu. Najprostszy, ale błędny program wyglądałby tak: start
lda #$14
cmp $D012
bne *-3
lda #$01
sta $D020
lda #$1e
cmp $D012
bne *-3
lda #$00
sta $D020
jmp start Program wykonuje się dwukrotnie w "ramce", a nie o to chodziło. Okazuje się, że można sobie z tym poradzić nawet bez zabawy ze SCROLY. Oto przykład: start
lda #$80 ;taki numer linii jest osiągany
;tylko raz na "ramkę"
cmp $D012
bne *-3
; tu można wrzucić jakąś procedurkę
lda #$15 ;ta wartość musi być większa
;od naszej "pierwszej" linii
cmp $d012
bne *-3
; tutaj też można coś wsadzić (np. odtwarzanie muzyczki)
lda #$14
cmp $D012
bne *-3
lda #$01
sta $D020
lda #$1e
cmp $D012
bne *-3
lda #$00
sta $D020
jmp start W tak banalnym przykładzie takie karkołomne sztuczki nie mają sensu, ale czasem może się zdarzyć, że potrzebujemy wywołać kilka przerwań w "ramce", w różnych miejscach ekranu (np. zmiana trybów graficznych). Wtedy każde z nich można skrócić o zapis najstarszego bitu w $D011 przez odpowiednie rozplanowanie wywołań linii przerwania.
To tyle w tym krótkim odcinku. W następnym, mam nadzieję, pobawimy się w odtwarzanie muzyki i różne tryby graficzne w jednej "ramce".
Życzę udanych prób z programowaniem.
Autor:
Data realizacji:
Data publikacji:
Data modyfikacji:
Pierwsza publikacja:
|
|
Asl (Nipson)
-
24.5.2001
-
Filety on-line
|
|
#1 | Dzień 18-6-2015 | godz.16:40:06 | Autor: Ultimion / Caution | Status: Brak błędów | AdrIP: Ukryty | Właśnie szukałem jak się wywoływało
przerwanie w dolnej lub górnej linii $10
... wiedziałem ze d011, ale nie
pamietalem jak .... :-D
Pozdrawiam |
|
Instrukcja używania systemu komentarzy
- W polu "Podpisz się" umieszczasz swoje Imię, Nazwisko albo Pseudonim używając znaków alfanumerycznych: A-Z, 0-9 oraz znaków specjalnych, np.: !^<>" ' itp.
Tagi HTML są nieaktywne.
- W polu "Wpisz treść" umieszczasz komentarz używając znaków alfanumerycznych: A-Z, 0-9 oraz znaków specjalnych, np.: !^<>" ' itp. Klawisz ENTER tworzy nowy akapit.
Tagi HTML są aktywne. Możesz:
Możliwość:
|
Komenda:
|
Przykład:
|
a. Pogrubić tekst: |
<B></B> |
Pogrubiony |
b. Pochylić tekst: |
<I></I> |
Pochylony |
c. Podkreślić tekst: |
<U></U> |
Podkreślony |
d. Stworzyć indeks górny: |
<SUP></SUP> |
Indeks górny |
e. Stworzyć indeks dolny: |
<SUB></SUB> |
Indeks dolny |
f. Użyć czcionki maszynowej: |
<TT></TT> |
Czcionka maszynowa |
Adresy URL wpisujemy w postaci http://nazwastrony.pl, ftp://nazwastrony.pl.
Adresy email wpisujemy w postaci nazwa@nazwa.pl.
Adresy Gadu-Gadu wpisujemy w postaci gg:1234567 (bez spacji).
Proszę pamiętać o domykaniu otwartych tagów.
Przed naciśnięciem przycisku Komentuj, zaznacz checkboks przy jego prawym boku.
|