STARTUJ ULUBIONE CO NOWEGO? AGNIESZKA CEGIELSKA - NIEOFICJALNY INTERNETOWY FANKLUB REDAKCJA KONTAKT
Informacje o aktualizacji Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Skocz do działu Poczytaj lub dodaj wpis Czyli kto to tworzy Kontakt z nami




OSTATNI KOMENTARZ  ?

Budujemy carty ...
Sampler do c-6 ...
Byłem tam ... ...
Seks w szkole, ...

(51)
(17)
(3)
(2)
(2)



WYBIERZ MELODIĘ       ?


The last ninja
The l.n. The wilderness
The last ninja 2
The l.n.2 The basement
The l.n.2 The final battle
The l.n.2 The mansion
The l.n.2 The office
The l.n.2 The sewers
The l.n.2 The street
The great giana sisters
The green beret
Turrican intro
Bubble Bobble Remix
Creatures
Game over
Mayhem intro
Diablo
Doom 2 Hell on Earth
Hi-octane
Xenon 2
Mario in the Loonybin
Tetris (gameboy) remix


Jaws
Spy vs spy
Draconus
Ghoust busters
Tetris (c-gameboy)
Duke Nukem 3D




PROGRAMOWANIE 


$d012 - OBRAZ I DŹWIĘK



   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





DODAJ SWÓJ KOMENTARZ



#1Dzień 6-8-2013godz.22:12:33Autor: Loev teh kitten!
Status: Brak błędówAdrIP: Ukryty
   Loev teh ce szesc4!

Instrukcja używania systemu komentarzy    

  1. 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.
  2.    
  3. 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:

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

Podpisz się:

Wpisz treść:

   wyślij mój komentarz    ukryj mój adres IP