|
|
|
| PROGRAMOWANIE | |
|
W poprzednim odcinku poznaliśmy podstawowe zadania rejestru RASTER. W tym, nauczymy się wykorzystywać ten rejestr do wyświetlania różnych trybów graficznych na jednym ekranie (dla zapominalskich: w RAMCE), a także do odtwarzania muzyki w naszych programach. Zacznijmy od obrazu.
Za grafikę odpowiada szereg rejestrów, umieszczonych w obszarze $D000-$D02E (53248-53294) i powtórzonych 15 razy w obszarze $D040-$D3FF. Jak ktoś lubi utrudniać sobie i innym życie, to zamiast wpisywać do np. $D020, może wpisywać do np. $D2A0. Trochę chore, ale niektórzy to lubią. W pierwszym odcinku wykorzystywaliśmy właśnie rejestry koloru z tego obszaru - pamiętacie $D020 i $D021? Jeśli ktoś pragnie programować na poważnie, to powinien zaopatrzyć się w mapę pamięci Komodorka, gdzie opisane są wszystkie komórki, a nawet poszczególne bity. My wykorzystamy jedynie kilka z nich i to tylko w celach pomocniczych, ale "przy okazji" postaram się wyjaśnić czemu zapalamy lub gasimy właśnie takie, a nie inne bity. Opis będzie zdawkowy, przecież zajmujemy się $D012, a nie innymi rejestrami :-)
Jak już wiemy, nasz RASTER umożliwia nam kontrolę linii obrazu, w której wywołamy naszą procedurę. W skrajnym przypadku, możemy nawet odpalać nasze podprogramy nawet w 2 kolejnych liniach, ale musimy sobie zdawać sprawę z ograniczeń wynikających z działania praw fizyki. Każda instrukcja zabiera trochę czasu procesora. Czasem więcej, czasem mniej, ale nigdy zero. Dlatego, jeżeli przesadzimy z ilością instrukcji między kolejnymi liniami, to zamiast spodziewanego efektu zobaczymy jakieś migania i inne dziwne rzeczy. Stąd zalecam umiar i zdrowy rozsądek. Wyobraźmy sobie, że chcemy zrobić efekt do dema, gdzie na górze ekranu wyświetlona będzie grafika znakowa (np. najszybszy, "phongowany" 3D World w 3 kolorach), a na dole bajeranckie logo we FLI-interlace, wyczarowane przez naszego genialnego grafika. Ostatnie 40 linii loga jest w MCI, bo właśnie wymyśliliśmy sobie tam dodatkowy efekt obracanego tekstu z pozdrowieniami. Hmmm... Nie twierdzę, że to niemożliwe, ale uprzedzam: BĘDZIE CIĘŻKO. Nieważne. Załóżmy, iż właśnie tak chcemy podzielić ekran:
Wpisanie wymaganych wartości do odpowiednich komórek nic nam nie da, ponieważ nie będziemy w stanie kontrolować linii początkowej danego trybu graficznego. I właśnie tu pomoże nam $D012. "Jak dobrze, że jest z nami $D012". Jak mógłby wyglądać nasz program? Skoro ekran dzielimy na 3 części, to wystarczy tylko 3 razy skontrolować wartość w $D012. Ale, ale! Przecież wyświetlenie trybów FLI, AFLI i IFLI pochłania dokładnie tyle linii, ile zajmuje wyświetlenie. Wynika stąd prosty wniosek, że po skończeniu wyświetlania FLI-interlace (IFLI), wystarczy "przestawić" VIC na wyświetlanie MCI. Mamy teraz już tylko 2 wywołania rejestru RASTER - jedno na górze ekranu, a jedno w połowie. Tak naprawdę, to nasza "góra ekranu" zaczyna się dokładnie tam, gdzie kończymy wyświetlać MCI, gdyż zmiana trybu graficznego może nastąpić w dowolnym momencie pomiędzy linią 250, a 50. Przyjmijmy, że linia 255 ($FF) będzie w sam raz. Nasz program może wyglądać tak:
start
lda #$ff ;czekamy na linię 255
cmp $d012
bne *-3
lda $d011
and %11011111 ;5 bit włącza tryb bitmapowy, a my
;chcemy tryb znakowy,
;można krócej #$DF
sta $d011
lda $d016
ora %00010000 ;4 bit włacza multicolor i chociaż
;u nas jest on cały czas, to
;zostawiam go "dla przykładu"
sta $d016
lda #$18
sta $d018 ;akurat to wyjaśnię niżej
jsr 3d_część_1
jsr efekt_tekstu
lda #$96 ;czekamy na linię 150
cmp $d012
bne *-3
jsr show_IFLI ;za długa procka jak na przykład
lda $d011
and #$df ;zgadnijcie czemu :-)
sta $d011
lda $d016
ora #$10 ;to chyba też już wiecie
eor #$01 ;"trzęsienie" ekranu w poziomie
sta $d016
lda #$01
eor #$01
sta *-3 ;takie niby samoprogramowanie
;- raz 0, raz 1
tax
lda wskaźniki_mapy_MCI,x
sta $d018 ;to się już domyślacie
;co zawiera $D018
jsr 3d_część_2
jmp start
Uff!!! Niby niewiele, ale parę linii zajmuje. Teraz wyjaśnienia: W $D018 zapisujemy położenie w pamięci mapy bitowej (w trybie znakowym znakowej) i mapy kolorów (kształtów znaków). W bloku pamięci mieszczą sie 2 mapy bitowe po $2000 bajtów, albo 8 zestawów kształtów znaków po $0800 bajtów. Natomiast dane ekranowe (i dane koloru) to 16 zestawów w bloku po $0400 bajtów. Przykładowo, po starcie systemu włączany jest znakowy hires, a do $D018 wpisywana jest wartość $14 co oznacza, że ekran to znaki umieszczone od $0400, których dane znajdują się od $0800. Można, przełączając banki w rejestrze $DD00, używać całej pamięci C64 na grafikę, ale dokładny opis $D018 i $DD00 to temat na zupełnie inny artykuł. Optymistycznie założyłem, że Wasze efekty nie zajmą więcej niż ramkę procesora (pomimo zajęcia części czasu rastra przez wyświetlanie IFLI). W praktyce pewnie nie będzie tak słodko i będziecie musieli skorzystać z przerwań... Jeszcze parę słów o wywoływaniu efektów. Zapewne zauważyliście, że efekt tekstu wywoływałem podczas wyświetlania efektu 3D. Otóż operowanie na danych w trakcie ich wyświetlania daje przeważnie efekt zupełnie niepodobny do zamierzonego. Z tego powodu można (przy szybkiej procedurze) wywoływać go kiedy nie jest wyświetlany, lub stosować buforowanie, czyli wyświetlać wcześniej wyliczony efekt, a obliczać i rysować już jego kolejną fazę - będzie ona wyświetlana kiedy skończymy rysowanie, a my będziemy wtedy "męczyć" bufor dotychczas wyświetlany. Brzmi skomplikowanie, jednak jest dość proste - tak, jakby na jednej kartce rysować, a pokazywać innym poprzednio narysowaną, a po skończeniu rysowania nowej zamienić kartki.
Skoro potrafimy wyświetlać w różnych liniach ekranu różne tryby graficze, to nadszedł czas na odtwarzanie dżwięku. Sprawa jest tu znacznie łatwiesza. Nie musimy nic kombinować, tylko wgrać nasz kawałek do pamięci, raz go zainicjalizować, a następnie raz (choć dla niektórych muzyczek więcej) w ramce skoczyć do playera muzyczki. Przyjmuję, iż korzystamy z produktu tworzonego na popularnym edytorze jak DMC, GMC, Music Mixer, JCH, Grabovsky, Voicetracker itp. Standardowo wgrywają się one od $1000, choć mogą być wyjątki, pierwszy rozkaz to procedura inicjalizacyjna, a trzeci to odtwarzajka. Najprościej jest skorzystać z Music Searchera, który podpowie nam gdzie jest nasz zak i jakie ma "strategiczne" adresy. Myślę, że przy braku Searchera 90% wszystkich muzyczek powinna śmigać z poniższym programikiem:
start
lda #$00 ;jeśli w pliku jest więcej niż jedna
;muzyczka (np. DMC ma taką możliwość)
;- liczba określa jej numer
tax
tay
jsr $1000 ;inicjalizujemy odtwarzanie
petla
lda #$96
cmp $d012
bne *-3
inc $d021 ;zobaczymy ile czasu zajmuje
;odtwarzanie zaka
jsr $1003 ;skok do odtwarzania
dec $d021
jmp petla
Jeśli mjuzik ładuje się od innego adresu, to zmieńcie adres $1000 i $1003. Praktycznie zawsze działa. I to wszystko. Dla ambitnych (he, he) pozostawiam do rozpracowania połączenie wyświetlania różnych trybów graficznych i odtwarzania muzyki. W następnym odcinku poznamy proste efekty wykorzystujące rejestr $D012.
Autor:
Data realizacji:
Data publikacji:
Data modyfikacji:
Pierwsza publikacja:
|
|
Asl (Nipson)
-
2.10.2001
-
Filety on-line
|
|
#1 | Dzień 6-8-2013 | godz.22:12:33 | Autor: Loev teh kitten! | Status: Brak błędów | AdrIP: Ukryty | Loev teh ce szesc4! |
|
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.
|
|
|