2009-11-17 17 views
57

Ok. Mam nadzieję, że się nie zamknie, bo mam tę ciekawość od 25 lat i bardzo chciałbym zrozumieć tę sztuczkę.Rysuj na granicy ekranu w Commodore 64

W Commodore 64 granica nie była adresowalna przez 6569 VIC. Wszystko, co możesz zrobić, to narysować piksele w obszarze centralnym, w którym przesunął się kursor. Granica była zawsze jednolita, chociaż można było zmienić jej kolor za pomocą poke 53280, kolor, jeśli dobrze pamiętam.

Mimo to wyraźnie pamiętam wprowadzenie do gier, w którym granica została opatrzona grafiką, tak jakby była w pełni adresowalna. Próbowałem zrozumieć, jak to działa, ale nigdy nie dotarłem do sedna. Legendy mówią, że było to sprytne użycie sprite'ów, które w pewnych okolicznościach mogły zostać narysowane na granicy, ale nie wiem, czy to miejska legenda.

edit: po prostu czytać to z jednego z przewidzianych linki

Sprites zostały multipleksy w całej pionowych linii rastrowych (ponad 8 duchy, czasami nawet do 120 ikonek). Aż Crest Grupa wydała Krestage 3 w maja 2007 odbyło się wspólne przekonanie, że nie więcej niż 8 skrzaty może pojawić się w jednej linii rastrowej, ale przypisując nowe współrzędne Y wykonane ona ponownie dalej w dół ekranu.

To zło .... pokonać rastrowe i położenie ikonki zanim zrobi się tam ...

+0

wow ... nawet jeśli otrzymasz odpowiedź - czy masz możliwość jej przetestowania? – Dani

+5

Mój c64 czeka w piwnicy –

+0

Jestem prawie pewien, że mój tata nadal ma nasze stare C64 zeskakane gdzieś w piwnicy. – gnovice

Odpowiedz

40

Po pierwsze tylko spity mogą być wyświetlane w obszarze obramowania lub powtarzający się 8-bitowy wzór (8 pikseli szerokości), który jest odczytywany z ostatniego bajtu banku wideo, zwykle 3 funty. Zauważ, że widzisz tylko te sprite'y lub 8-bitowy wzór, gdy oszukujesz układ VIC, aby "nie wyświetlał" granic. Zobacz poniżej.

Granice mają wyższy priorytet niż sprite, więc normalnie, gdy kresek jest rysowany w obszarze granicznym, krawędź obejmuje duszek. Przy odrobinie oszustwa VIC można wyłączyć granice.

Można bardzo łatwo obrócić górną i dolną granicę (wyjaśnię poniżej), a boczne krawędzie są bardzo krytyczne.

Po pierwsze trochę informacji o tym, jak układ VIC działa na c64.

Układ VIC rysuje ekran od górnego lewego rogu do prawego górnego rogu, następnie wzdłuż linii, i od lewej do prawej, aż cały ekran zostanie narysowany. Wykonuje to odświeżanie 50 razy na sekundę (dla jednostek PAL) lub 60 razy na sekundę dla (jednostek NTSC).

Istnieje 8-bitowy rejestr VIC, który zawiera pionową pozycję rastra w danym momencie. $ d012. W rzeczywistości istnieje więcej niż 255 możliwych pozycji, więc 9 bit jest zapisany w bit 7 (najwyższy bit) lub rejestruj $ d011. W każdym momencie możesz przeczytać te rejestry i dowiedzieć się pionowej pozycji rastra. Nie ma dostępnego rejestru, aby odczytać pozycję x rastra.

Kolejna fajna funkcja chipu VIC została wykorzystana do rozwiązania problemu podczas korzystania ze sprzętowego przewijania. Podstawowe przewijanie pionowe zostało osiągnięte poprzez użycie rejestru sprzętowego, aby przesunąć ekran w zakresie 0-7 pikseli w pionie. Po osiągnięciu limitu (0 lub 7 w zależności od kierunku przewijania) przesuniesz każdy blok znaków (8x8 pikseli) o jeden blok w pionie i narysujesz nowe dane do wyświetlenia u góry (lub u dołu w zależności od kierunku). Działa to bardzo dobrze, z tym że co 8 pikseli przewijania zobaczysz dane "pop" na ekranie. Aby temu zaradzić, możesz zwiększyć obszar granicy o 8 pikseli w pionie, usuwając bit 3 w rejestrze $ d011. Nazywa się to trybem 24-wierszowym. Domyślnie ekran został ustawiony na 25 wierszy ze znakami 8x8 pikseli. W trybie 24-wierszowym nadal można było narysować znaki w dolnym rzędzie, po prostu byłyby one ukryte za granicą.

Więc sztuczka wyłączyć górne i dolne granice jest:

1) Ustaw ekran w tryb 25 rzędów

2) czekać na raster, aby osiągnąć pozycję pionową pomiędzy $ F2 i $ fa (8 pikseli pomiędzy miejscem rozpoczęcia granicy zarówno w trybie 24-wierszowym, jak i 25-wierszowym).

3) Ustaw ekran w trybie 24 wierszy ... przesuwania pionowego startu granicy powyżej aktualnej pozycji rastra

4) Poczekaj, aż po pionowej pozycji rastra ($ fa)

5) Powtórz każdą klatkę Krok 3) oszukuje układ VIC, myśląc, że już zaczął rysować obramowanie, aby nigdy go nie narysować. Voila, górna i dolna granica są otwarte.

Jeśli chodzi o krawędzie boczne, można zrobić to samo z różnymi rejestrami, ale ponieważ ruch poziomy rastra jest o wiele szybszy niż ruch w pionie, czas musi być znacznie ostrzejszy. I jest jeszcze jedna kwestia, którą należy wziąć pod uwagę, zwaną jitter. < - czego nie wyjaśnię tutaj. Wyszukaj w internecie "Stable Raster C64", aby uzyskać szczegółowe wyjaśnienie tego problemu.

+1

Tak, tryb 24-wierszowy, który znałem, ale nigdy bym nie przypuszczał, że można go użyć w ten sposób ... Jedyne, czego nie rozumiem, to: w zasadzie pozwala ci to wyczyścić dno. Tryb 24-graniczny powiększa o 8 pikseli dolną granicę, ale po usunięciu dolnej granicy raster powraca do wiersza 0 i rozpoczyna rysowanie granicy na podstawie resetowania. –

+1

Błędne jest założenie, że flagi obramowania są resetowane na początku odświeżania ekranu. Flaga, aby przerwać rysowanie granicy, dzieje się wokół linii 48 lub 56 w zależności od trybu 24 lub 25 rzędów. Flaga, aby rozpocząć rysowanie granicy, zdarza się tylko w liniach $ f2 i $ fa, ponownie w zależności od trybu 24 lub 25 rzędów znaków. Więc kiedy flaga "start draw" nie jest ustawiona na linii $ fa, nie próbuje ponownie do następnego obszaru $ f2- $ fa. – JohnD

+0

aw ... to fantastyczne: D –

3

PRINT „To było 53280, Dude”.

+0

Yep - i 53281 było w środku. –

+0

Dzięki! starzeję się. w tamtym czasie była to mantra. –

2

Z tego co rozumiem, jest to możliwe tylko w przypadku duszków.

Sprite mogą znajdować się w obszarze granicznym, a granica zostanie narysowana na wierzchu. Dzięki pewnym sztuczkom można usunąć granicę.

4

Zamierzam zabić ukłucie w ciemności tutaj (nie zrobił tego sam). Znalazłem to na wikipedii.

c64demo section wyjaśnia, że:

Efekty pomyślenia były osiągnięty w demo, głównie ze względu na nieudokumentowane skutki uboczne związane do MOS Technology VIC-II chip. Niektóre przykłady VIC-oszustwa:

jednym z wymienionych sieka się:

Sprite zmieniacze umieszczano na granicy . Przez oszukanie sprzętu, aby nie narysować obramowania dookoła ekranu, można w tym obszarze przesunąć sprite'y i wyświetlić.

Oczywiście, interesującą częścią pytania jest sposób jego wykonania. Sugerowałbym, żebyś szukał w jakimś demo database, który zawiera kod źródłowy w poszukiwaniu wersji demo, która wykorzystuje hack.

9

Zauważ, że to, co zrobił Krestage 3 (jak wspomniano w pytaniu), jest inne.

Jeden poziom lewy polega na pomieszaniu z krawędzią, kiedy właśnie rysuje się dół "papieru" (prostokąt obszaru roboczego, przedmiot wewnątrz granicy). Dzięki temu możesz mieć spity w górnej i dolnej granicy.

Wyższym poziomem jest bałagan z nim po prawej stronie papieru, w każdej linii rastra, wszystko jak wyjaśniono w powyższej odpowiedzi Johna. Pozwala to na tworzenie ikonek w lewej i prawej ramce.

Nic z tego nie może zawierać więcej niż 8 spritów w jednym wierszu. To tylko magia Krest.

Zdecydowanie najlepszym zasobem (wiem o) dla układu VIC jest "The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64" autorstwa Christiana Bauera, a użyteczny dodatek to "The memory accesses of the MOS 6569 VIC-II and MOS 8566 VIC-IIe Video Interface Controller" autorstwa Marko Mäkelä.
Ostrzegawczy lektor: są one nieco techniczne i mogą być łatwiejsze do zrozumienia po samodzielnym zaprogramowaniu pewnych efektów VIC.

Jeśli linki kiedykolwiek giną, wystarczy, że zgłosisz artykuły po tytule, a następnie zostaną one odtworzone w nieskończoność.

2

Grafika na obramowaniu: Albo sprite albo wykorzystujący efekt $ 3FFF (który w rzeczywistości wcale NIE jest sprite'em). Wnikanie w szczegóły wymaga znacznie więcej miejsca i czasu, niż mam tutaj.

+0

+1 tylko dlatego, że PD jest niesamowity. –

6

Można otworzyć górne i dolne granice za pomocą prostego programu BASIC:

 
    1 poke56334,0:poke53266,212:poke53265,27:poke16383,0 
    2 h=53265:i=53273:h1=19:h2=27:i1=1 
    3 pokei,i1:waiti,i1:pokeh,h1:pokeh,h2:goto3 
1

Można również uzyskać skrzaty do granicy w podstawowym: BASIC Sprites in Border

IIRC, nie było też jakiś sposób pomylić wideo chip tak, że rysuje 26 wiersz tekstu.