speccy.pl
Facebook Like


SPECCY.PL

[SPECCY.PL PARTY 2020.1]

[WIKI SPECCY.PL]
Polecamy

PIXEL HEAVEN 2020
AYGOR
Forum ZX Spectrum
[PARTIES/ZLOTY] Warszawa, 12 sierpnia 2020 - start w Rudawce (zaraz obok Czeskiej Piwiarni) wysłana przez AndyX Dzisiaj o 19:20:46
[HARDWARE] W czasie deszczu dzieci się nudzą... wysłana przez steev Dzisiaj o 14:25:29
[PARTIES/ZLOTY] Spotkania online wysłana przez maciekb Dzisiaj o 13:21:02
[WSPÓŁCZESNE KLONY] A to co? Spectrum Next. wysłana przez Gryzor Dzisiaj o 13:03:03
[GRY] Nowe gry na ZX w 2020 wysłana przez Rzeznik Dzisiaj o 12:06:46
[SOFTWARE] TAP na WAV wysłana przez sajmosia Dzisiaj o 11:05:30
[POWITANIA] Dzień dobry wieczór wysłana przez Tygrys Dzisiaj o 10:28:40
[RÓŻNOŚCI] Lokalizacje plików na WOS wysłana przez Gelip Dzisiaj o 06:18:11
Archiwum plików ZX Spectrum
[Demoscena] Dodano "10102020" z roku 2020 dla komputera ZX Spectrum 48K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 19:12:17
[Demoscena] Dodano "Roll Me Gently: Invite Remix" z roku 2020 dla komputera ZX Spectrum 128K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 19:10:49
[Demoscena] Dodano "Roll Me Gently" z roku 2020 dla komputera ZX Spectrum 128K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 19:08:54
[Demoscena] Dodano "Colors of Love" z roku 2020 dla komputera ZX Spectrum 48K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 19:03:50
[Demoscena] Dodano "04042020" z roku 2020 dla komputera ZX Spectrum 48K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 19:01:55
[Demoscena] Dodano "Chernobyl'86" z roku 2019 dla komputera ZX Spectrum 48K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 18:59:38
[Demoscena] Dodano "Oh No! More Boxes" z roku 2019 dla komputera ZX Spectrum 128K Autorzy: Joker. Dodany przez John Dalthon, 2020-08-10 18:52:25
[Demoscena] Dodano "speccy.pl party 2020.1 invitation rev3" z roku 2020 dla komputera ZX Spectrum 48K Autor: Tygrys. Dodany przez Tygrys, 2020-08-02 16:19:53
Więcej...
Nawigacja
Kolorowanie gier dla ULA Plus

Słowo wstępne

W ostatnim czasie, wiele osób zainteresowało się emulowanym, jak na razie, chipem ULA Plus oferującym 256 kolorów, z których 64 może być jednocześnie wyświetlone na ekranie. Póki co, jednym z nielicznym zastosowań wirtualnego chipa, jest "kolorowanie" istniejących już gier. Ilość wyświetlanych kolorów zwykle nie przekracza kilkunastu, gdyż tyle kolorów jest standardowo używanych przez gry. Oryginalny chip ULA, bez tricków typu gigascreen, czy interlace jest w stanie wyświetlić jedynie 15 kolorów. ULA Plus natomiast koduje paletę kolorów we własnych 64 rejestrach (komórkach pamięci) przeznaczając po jednym bajcie na każdy kolor (po 3 bity na składowe kanały R i G oraz 2 bity na kanał B). Wartości kolorów odczytywane są z pamięci atrybutów (dla ZX Spectrum 48k to obszar pamięci: 22528-23295; hex: $5800-$5AFF) i przypisywane są im odpowiadające kolory odpowiednio przypadających rejestrów. Wykorzystywany jest cały bajt oryginalnego koloru, łącznie z bitami BRIGHT (bit 6) i FLASH (bit 7), dla których można ustalić całkiem inne kolory przy włączonych i wyłączonych tych bitach.
Wydaję się, że dysponując jednocześnie aż 64 kolorami, w dodatku dowolnie wybranymi z 256 w kilka minut stworzymy zapierające dech w piersi arcydzieło. Musimy jednak pamiętać, że paleta ULA Plus, to w rzeczywistości 4 subpalety po 16 kolorów (odpowiednio dla wyłączonych i włączonych bitów BRIGHT i FLASH), więc nadal nie możemy dowolnie łączyć dowolnego koloru z dowolnym, jedynie w obrębie 16 kolorowych subpalet. Tak jak w standardowej palecie ZX Spectrum niemożliwe jest użycie w jednym polu atrybutów koloru BRIGHT 0 i BRIGHT 1, nie wspominając o FLASH. Ponadto w każdej z subpalet pierwsze 8 kolorów to INK, a drugie 8 to PAPER, czyli też nie użyjemy w jednej "kratce" dowolnych kolorów z tych 16. Jedynym rozwiązaniem pozwalającym na zwiększenie możliwości mieszania kolorów, jest ich powtórzenie w wybranych subpaletach, co automatycznie zmniejsza liczbę dostępnych kolorów. Taki mamy kompromis. Przy tworzeniu grafiki, niezależnie czy statycznego ekranu, czy do gry, główny kolor tła powinien być powtórzony w każdej subpalecie, zarówno jako PAPER i INK, czyli ten sam kolor zabiera aż 8 rejestrów ULA Plus, a jeśli chcemy użyć drugiego jako tła, to znika nam kolejne 8 dostępnych kolorów. W praktyce tworząc dla ULA Plus, z reguły nie przekracza się 30-kilku kolorów w "obrazkach", więcej można użyć w grach i demach, zmieniając zawartość rejestrów wraz z kolejnymi poziomami czy etapami. Możemy dzięki 256 dostępnym kolorom dokonać takich zmian bardzo płynnie przechodzac z jednego koloru w drugi, czy stopniowo rozjaśniając cały ekran.

Stworzono już kilkadziesiąt nowych gier wykorzystujących możliwości ULA Plus, jednak dopóki ten układ nie będzie miał swojej hardwareowej realizacji, graficy dość oszczędnie posługują się rozszerzoną paletą, nie wykorzystując atrybutów FLASH, ponieważ na realnym sprzęcie wyglądało by to co najmniej źle. Stąd kompromis - aby gra wyglądała dobrze zarówno w tradycyjnych kolorach, jak i w ULA Plus, jak wspomniałem na początku, zmodyfikowany chip można obejrzeć w akcji jedynie na kilku emulatorach.

Osobiście używam emulatora ZX Spin 0.7. Posiada on wbudowany edytor palety i bardzo łatwo poprawić kolory w grze - o ile jest kolorowa. Gry monochromatyczne zostają takie, jakie są. Możemy co najwyżej zdefiniować kolor gry, jeśli użyty standardowy nam nie odpowiada. ULA Plus nie likwiduje także problemu "colour clash", gdyż korzysta z pamięci atrybutów. Można co najwyżej złagodzić kontrasty dobierając podobne do siebie kolory.

Konfiguracja ZX Spin

Aby móc się cieszyć rozszerzonymi kolorami ULA Plus, należy wcześniej skonfigurować ZX Spin. Wystarczy włączyć opcję '64 colour enchanced ULA'.

Edycja rozszerzonej palety

Zabieramy się więc do rzeczy. W tym celu najlepiej zaopatrzyć się w trainer gry, lub samemu wpisać odpowiednie POKE, aby przejść całą grę (lub chociaż większą jej część, jeśli grafika się powtarza w dalszych poziomach). Otwieramy grę w ZX Spin 0.7, klawiszem F4 przechodzimy do trybu okna (jeśli emulator uruchomił się na pełnym ekranie). Z menu wybieramy . Po pojawieniu się okna z edytorem, widzimy 64 kolorowe kwadraty. Nieparzyste rzędy kwadratów odpowiadają za kolor INK, parzyste zaś za PAPER. Zatem kolejno: 1 i 3 rząd kolorów odpowiada za INK, 2 i 4 rząd to PAPER. Dwie pierwsze odpowiadają wyłączonemu BRIGHT i FLASH, trzeci i czwarty włączonemu BRIGHT, zaś linie 5-8 używane są przy włączonym FLASH, odpowiednio z BRIGHT 0 i 1. Te 4 kolumny praktycznie są nieużywane w istniejących grach, zatem zostają nam 32 pola, w których możemy zdefiniować nowe kolory dla poszczególnych elementów gry.

Teraz musimy korzystać z artystycznej wyobraźni - jeśli gramy w kosmosie, zdecydujmy się na "metaliczną" kolorystykę, jeśli walczymy żołnierzem na polu bitwy, definiujmy piaskowo-militarne kolory, jeśli modyfikujemy wesołą platformówkę, wybierajmy "żelkowe" kolory itd...

Najważniejsze jest to, aby sama gra prezentowała się jak najlepiej. Później możemy sprawdzić (po uprzednim zapisaniu palety jako pliku .tap) czy na planszy tytułowej czy high scores nie ma konfliktu, co czasem się zdarza gdy zdefiniujemy różne kolory PAPER dla tego samego INK przy włączonym i wyłączonym BRIGHT. Nie przejmujmy się absolutnie screenem. Jeśli w naszej zmodyfikowanej palecie prezentuje się ciekawie, możemy zostawić go tak jak jest, jeśli nie to zmienimy loader tak, aby przełączenie palety miało miejsce po wyświetleniu screenu.

Składanie w całość

ZX Spin 0.7 oferuje najprostszy sposób dodania własnej palety do istniejącej gry, nie zmieniając nic w kodzie ani loaderze. Paletę można zapisać do pliku .TAP jako program w BASICu, do wczytania przed grą. Plik ten zawiera definicje kolorów, załadowanie ich do rejestrów ULA Plus oraz komendę LOAD "", umożliwiającą załadowanie gry. W prosty sposób można połączyć ow plik z grą na przykład wykorzystując program Tapir lub inny manager .TAPów. Program z paletą dla ULA Plus należy umieścić na początku pliku .tap z grą, poprawiając jego nazwę (opcjonalnie) z mało mówiącej "64colour" na tytuł gry i już mamy gotową grę do uruchomienia bezpośrednio w emulatorze.

Przez to, że w ZX Spectrum nie ma możliwości zatrzymania silnika magnetofonu, w oryginalnych loaderach wszystkie bloki wraz ze screenem ładowane są jeden po drugim, co przy ładowaniu gry w emulatorze sprawia, że obrazek mignie przez ułamek sekundy i od razu startuje gra. Zmienimy to. W loaderze po załadowaniu screenu dodajemy PAUSE 0. Jeśli za nim doładowywane są dalsze bloki, warto jeszcze dodać krótką pętlę opóźniającą, tak aby wciśnięcie spacji nie zatrzymywało dalszego ładowania komunikatem BREAK. Najprostsza taka pętla to:

FOR i=0 TO 50 : OUT 254,0 : NEXT i

Można również zmienić kolejność ładowania bloków (jeśli loader jest cały w BASIC), aby screen załadować jako ostatni, a po nim już tylko PAUSE 0 i uruchomienie gry. Pamiętajmy aby zmienić też kolejność na taśmie za pomocą np. programu Tapir.

Teraz dodamy zmianę kolorów (definicję palety), czyli zapisany plik .tap - jest to jedna linia w BASIC o numerze 0. W Tapir dodajemy ją do taśmy, zapisujemy, następnie w Fuse wgrywamy loader i po sprawdzeniu, czy w linii 0 nic nie ma, łączymy go za pomocą instrukcji MERGE "" z definicją palety. Po wykonaniu tego powinnniśmy do loadera dodać linie zmieniające paletę. Może być to automatyczna zmiana, lub pytanie "czy chcemy zmienić kolory?". Gdy mamy linię z paletą w loaderze, instrukcja LOAD "" w niej jest zbyteczna. Standardowo, gdy BASIC zaczyna się od 23755, instrukcja ta mieści się pod 23798, zmieniamy ją wpisując

POKE 23798,254: POKE 23799,58: POKE 23800,58

- zmieni nam to LOAD "" na RETURN :: i wtedy przez GO SUB 0 z dowolnego miejsca loadera możemy dokonać zmiany palety. Możemy także bez tej zmiany polecenia LOAD na RETURN bezpośrednio wywołać kod definiujący paletę ULA Plus poprzez wykonanie polecenia: RANDOMIZE USR 23803.

Kod włączający ULA Plus wraz z definicją palety jest relokowalny, zajmuje 101 bajtów i możemy go przenieść w dowolne miejsce pamięci. Jeśli piszemy menu do gry czy intro w assemblerze, należy przed wywołaniem CALL do zmiany palety załadować do rejestrów BC ten sam adres, gdyż kod korzysta z tego, czyli

LD BC, adres
CALL adres

Wszystkie przerobione przeze mnie gry można obejrzeć i pobrać z tej strony.

Miłej zabawy.
Odnośniki:
  1. Strona WWW autora tekstu.
  2. Strona domowa projektu Ula+
  3. Opis trybu GigaScreen
  4. Opis trybu Interlace
  5. Opis problemu "colour clash"
  6. Emulator ZX Spin w wersji 0.7
  7. program Tapir do ściągnięcia ze strony World Of Spectrum
35
Abrimaal dnia 29.03.2012 15:52:59

Dzięki za opublikowanie, lecz chyba trochę pan Admin był nadgorliwy zamieniając w jednym miejscu skrót ULA (Uncommitted Logic Array) na ULI - chyba, że to I na końcu odpowiada za "Improved" lub "Interface", jeśli układ będzie dołączany do komputera przez slot z tyłu.

1
Tygrys dnia 29.03.2012 15:59:55

"ULI" wynikało z polskiej odmiany Z przymrużeniem oka zmieniłem na 'ULA' aby było tak jak trzeba (sam to mogłeś zrobić)

35
Abrimaal dnia 30.03.2012 03:21:55

Tak się kiedyś potocznie odmieniało, bo kojarzyło się z imieniem Szeroki uśmiech
Czasy, gdy obsługiwało się komputer nie znając angielskiego były śmieszne, gdy mówiło się s-a-v-e czy d-r-a-w Z przymrużeniem oka

A jak edytować artykuł to jeszcze nie wiem, ale chyba już nie trzeba nic poprawiać. Thanx.

Dodaj komentarz
Zaloguj się, aby móc dodać komentarz.
Oceny
Tylko zarejestrowani użytkownicy mogą oceniać zawartość strony
Zaloguj się , żeby móc zagłosować.

Brak ocen. Może czas dodać swoją?