Fade in mozna zrobic tak samo jak fadeouta.
Z tym ze to raczej metoda do dem/kolekcji ale nie gier.
Skoro jest 16 kolorow #$0f ($0x) to mozna dla kazdego koloru wygenerowac prosta 16 bajtowa tabelke przejscia od danego koloru do czarnego (wygaszenie).
Teraz wiaze sie te tabelki ze soba #$0f x #$0f i powstaje #$ff 256 tabelek przejsc kolorow. Tabelki sa niezalezne od siebie.
Mozna je najprosciej rozmiescic w pamieci co 16 bajtow, zajma $1000 bajtow.
Co do make\'a procedury wygaszania to wyglada to tak:
- bierzemy bajt z ekranu
- dla bajtu pobieramy adres tabelki fejd ina/auta
- adres wstawiamy do spidkodu
- dla $d800 mozna postapic tak samo, albo ograniczyc adres do tablic
#$0x
- wskazowka: jezeli mamy masywne problemy z pamiecia dobrze aby tabelki z zerem #$0x nie lezaly w pamieci ram $d000-$dfff
fejdin/aut wyglada tak:
lda tabelka_kolorow_dla_danego_bajtu,x
sta screen
cykle:5+4=9*1000 bajtow=9000 cykli, *2 ($d800) = 18000
18000 cykli z 18656 wiec ciezko z odgrywaniem muzyki.
Tu mozna jeszcze zrobic 2 optymalizacje.
Pierwsza dotyczy ekranu, jako ze jest 256 kombinacji a pol ekranu jest 1000 to mozna przeskanowac ekran i sprawdzic ktora kombinacja wystepuje dla ktorych pol ekranu.
np. #$6b powtarsza sie dla screen+$0200, screen+$0234, screen+$344
spidkod wyglada wtedy tak
lda tabelka_kolorow_dla_danego_bajtu,x
sta screen+$0200
sta screen+$0234
sta screen+$0344
W ten sposob 1000 odczytow lda $yyyy,x ograniczamy do 256 odczytow
co daje przyspieszenie o 1000-256=744*5=3720 cykli
3720 cykli/63=59 lini rastra -> czyli jest czas na odgrywanie muzyki
No i to samo zrobic dla $d800 tylko jeszcze kolory $d800 andowac przez #$0f, aha w procedurze make\'a nie spidkodzie!.
(czasem niektore edytory/konwertery syfia pamiec kolorow $d800).
Mozna pokusic sie o polaczenie procedury dla ekranu i $d800 ale trzeba
dokladnie sprawdzic ile jej wykonanie zajmie rastrow dla danego obrazka i jak bedzie wygladac odswiezanie.
Ogolnie sam fejd in/out wykonuje sie poprzez zmiane rejestru X i skoku do spidkoda.
Zmieniamy wartosc rejestru X=#$00-#$0f i mamy albo fejd in albo fejd aut.
Ostatnia optymalizacja to przeskanowanie mapy ekranu i mapy kolorow, w celu sprawdzenia ile w rzeczywistosci potrzebujemy tablic kolorow z tych 256
To co opisalem dotyczy wygaszania calosci ekranu jednym indeksem, gdyby wygaszac okregiem, to wtedy trzeba dodatkowa przed \"kazdym\" bajtem odczytac wartosc rejestru X z komorki ze strony zerowej przyporzadkowanej dla danego okregu.
Dodatkowo mozna zeskanowac komorki ekranu po okregach i wtedy
tylko raz odczytuje sie rejestr X i rysuje wartosci na ekranie okregiem ale
to gryzie sie z optymalizacja opisana wyzej jeden odczyt lda -> kilka sta (komorki moga nalezec do innych okregow).
No moglem tu zastosowac jakies skroty myslowe takze jak cos jest nie jasne to moge cos dopisac.