2009-11-17 2 views
57

Ok. Ich hoffe, es wird nicht geschlossen, weil ich diese Neugier seit 25 Jahren habe und ich würde gerne den Trick verstehen.Zeichnen Sie Bildschirmrand in Commodore 64

Im Commodore 64 war die Grenze nicht durch die 6569 VIC adressierbar. Sie konnten nur Pixel im zentralen Bereich zeichnen, in dem sich der Cursor bewegte. Die Grenze war immer einheitlich, obwohl man die Farbe mit Poke 53280 ändern konnte, wenn ich mich richtig erinnere.

Dennoch erinnere ich mich klar Spiele Intros, wo die Grenze mit Grafiken gekennzeichnet war, wie es vollständig adressierbar war. Ich versuchte zu verstehen, wie es funktionierte, kam aber nie auf den Punkt. Legenden sagen, es sei ein geschickter Gebrauch von Sprites, die unter Umständen an die Grenze gezogen werden könnten, aber ich weiß nicht, ob es eine urbane Legende ist.

bearbeiten: Das gerade gelesen von einem der angezeigten Links

Sprites über vertikalen Rasterlinien gemultiplext wurden (über 8 Sprites, manchmal bis zu 120 Sprites). Bis veröffentlichte die Gruppe Crest Krestage 3 in Mai 2007 gibt es die gemeinsame Wahrnehmung, dass nicht mehr als 8 Sprites auf einer Rasterzeile erscheinen könnte, aber Zuweisung neue Y-Koordinaten aus es weiter unten in dem Bildschirm wieder .

Das ist böse .... schlagen Sie das Raster und das Sprite neu zu positionieren, bevor er dort ankommt ...

+0

wow ... auch wenn Sie eine Antwort bekommen - haben Sie die Möglichkeit, es zu testen? – Dani

+5

Mein c64 wartet im Keller –

+0

Ich bin mir ziemlich sicher, dass mein Vater immer noch unseren alten C64 irgendwo im Keller weggeschleudert hat. – gnovice

Antwort

40

Zunächst können nur Sprites im Randbereich oder ein sich wiederholendes 8-Bit-Muster (8 Pixel breit) angezeigt werden, das vom letzten Byte der Videobank gelesen wird, normalerweise $ 3fff. Beachten Sie, dass Sie diese Sprites oder das 8-Bit-Muster nur sehen können, wenn Sie den VIC-Chip dazu bringen, die Ränder nicht anzuzeigen. Siehe unten.

Die Ränder haben eine höhere Priorität als Sprites. Wenn also ein Sprite in einem Grenzbereich gezeichnet wird, wird der Sprite von der Grenze überdeckt. Mit ein bisschen VIC-Chip-Tricks kannst du die Grenzen abschalten.

Sie können die oberen und unteren Ränder ganz einfach abschalten (ich werde unten erklären), und die Seite grenzt mit sehr kritischen Timing ab.

Zuerst ein paar Informationen darüber, wie der VIC-Chip auf einem c64 funktioniert.

Der VIC-Chip zeichnet den Bildschirm von oben links nach rechts oben, dann eine Zeile nach unten und von links nach rechts, bis der gesamte Bildschirm gezeichnet ist. Es führt dieses Redraw 50 Mal pro Sekunde (für PAL-Einheiten) oder 60 Mal pro Sekunde für (NTSC-Einheiten) aus.

Es gibt ein 8-Bit-VIC-Register, das zu jedem Zeitpunkt die vertikale Position des Rasters enthält. $ d012. Tatsächlich gibt es mehr als 255 mögliche Positionen, so dass das neunte Bit in Bit 7 (höchstes Bit) oder Register $ d011 gespeichert wird. An jedem Punkt können Sie diese Register lesen und die vertikale Position des Rasters herausfinden. Es gibt kein verfügbares Register, um die x-Position des Rasters zu lesen.

Eine weitere coole Funktion des VIC-Chips wurde verwendet, um ein Problem beim Hardware-Scrollen zu beheben. Grundlegendes vertikales Scrollen wurde erreicht, indem ein Hardware-Register verwendet wurde, um den Bildschirm um 0 bis 7 Pixel vertikal zu verschieben. Sobald Sie das Limit erreicht haben (0 oder 7, abhängig von der Richtung des Scrolls), würden Sie jeden Zeichenblock (8x8 Pixel) einen Block vertikal verschieben und die neuen Daten zeichnen, die oben (oder unten) angezeigt werden sollen. Dies funktioniert sehr gut, mit der Ausnahme, dass alle 8 Pixel des Bildlaufs Daten auf dem Bildschirm "Pop" angezeigt werden. Um dies zu beheben, können Sie den Randbereich um 8 Pixel vertikal vergrößern, indem Sie Bit 3 im Register $ d011 löschen. Dies wird als 24-Zeilen-Modus bezeichnet. Standardmäßig war der Bildschirm auf 25 Zeilen mit 8x8 Pixel Zeichen eingestellt. Im 24-Zeilen-Modus könnten Sie immer noch Zeichen in die untere Reihe zeichnen, sie wären nur durch den Rand verdeckt.

So Der Trick, um das Ausschalten der oberen und unteren Grenzen ist:

1) Stellen Sie den Bildschirm 25 Zeilenmodus

2) warten, bis das Raster eine vertikale Position zwischen $ f2 zu erreichen, und $ fa (die 8 Pixel zwischen denen der Rand sowohl im 24-Zeilen-Modus als auch im 25-Zeilen-Modus beginnt).

3) Stellen um den Bildschirm zu 24 Zeilenmodus ... den vertikalen Start der Grenze über die aktuelle Rasterposition zu bewegen

4) warten, bis nach vertikaler Rasterposition ($ fa)

5) Wiederholen Sie jeden Frame

Schritt 3) Tricks der VIC-Chip zu denken, dass es bereits begonnen hat, die Grenze zu zeichnen, so dass es nie beginnt, es zu zeichnen. Voila, die oberen und unteren Grenzen sind offen.

In Bezug auf Seitenränder können Sie dasselbe mit verschiedenen Registern tun, aber da die horizontale Bewegung des Rasters viel schneller ist als die vertikale Bewegung, muss das Timing viel enger sein. Und es gibt ein anderes Problem, das als Jitter bezeichnet wird. < - das werde ich hier nicht erklären. Suchen Sie im Web nach "Stable Raster C64", um dieses Problem eingehend zu erklären.

+1

Ja, der 24-Zeilen-Modus, den ich kannte, aber ich hätte nie gedacht, dass er so verwendet werden könnte ... Das einzige, was ich nicht verstehe, ist: Das erlaubt im Grunde, den Boden zu löschen. Der 24-Rand-Modus wird um 8 Pixel unter dem unteren Rand vergrößert, aber wenn Sie den unteren Rand löschen, wird das Raster wieder in die Zeile 0 zurückgesetzt und beginnt, den Rand aufgrund des Zurücksetzens zu zeichnen. –

+1

Sie gehen davon aus, dass die Grenzflags zu Beginn der Bildschirmaktualisierung zurückgesetzt wurden. Das Flag zum Beenden des Zeichnens des Randes passiert um die Linie 48 oder 56, abhängig vom 24- oder 25-Zeilen-Modus. Das Flag, um mit dem Zeichnen des Rahmens zu beginnen, findet immer nur in der Zeile $ f2 und $ fa statt, wiederum abhängig vom 24- oder 25-Zeichenzeilenmodus. Wenn also das Flag "Start Draw" nicht um die Linie $ fa gesetzt ist, wird es erst in der nächsten $ f2- $ fa-Region erneut versucht. – JohnD

+0

aw ... das ist fantastisch: D –

3

PRINT "ES WAR 53280, GECK."

+0

Yep - und 53281 war das Innere. –

+0

Danke! ich werde alt. Es war damals ein Mantra. –

2

Von dem, was ich verstehe, ist dies nur für Sprites möglich.

Sprites dürfen sich im Grenzbereich befinden, und der Rand wird übergezogen. Durch einige Tricks kann die Grenze entfernt werden.

4

Ich werde hier einen Stich im Dunkeln machen (habe ich selbst nicht gemacht). Ich habe das auf Wikipedia gefunden.

Die c64demo section erklärt, dass:

Effects dachte unmöglich in Demos erreicht waren, vor allem aufgrund undokumentierten Nebenwirkungen im Zusammenhang zum MOS Technology VIC-II chip. Einige Beispiele für VIC-Tricks:

Einer der genannten Hacks war:

Sprite Wechslern in der Grenze gesetzt wurden. Durch Auslösen der Hardware nicht , um den Rand um den Bildschirm zu zeichnen, konnten Sprites in diesen Bereich verschoben und angezeigt werden.

Natürlich ist der interessante Teil der Frage, wie es getan wird. Ich würde vorschlagen, in einigen demo database suchen, die Quellcode enthält auf der Suche nach einer Demo, die den Hack verwendet.

9

Beachten Sie, dass was Krestage 3 (wie in der Frage erwähnt) anders ist.

Eine Stufe des Tricks ist, mit der Grenze zu verwirren, wenn der Boden des „Papiers“ (Arbeitsbereich Rechteck, das, was im Innern der Grenze) nur gezogen wird. Dadurch können Sie Sprites in der oberen und unteren Grenze haben.

ein höheres Niveau damit zu Durcheinander an der rechten Kante des Papiers, in jeder Rasterzeile, die alle als in JohnD Antwort oben erläuterten. Auf diese Weise können Sie Sprites in den linken und rechten Rahmen einfügen.

Nichts davon lässt Sie mehr als 8 Sprites in einer Zeile haben. Das ist nur Krest Magie.

Bei weitem die beste Ressource (ich weiß) für die VIC-Chip ist "The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64" von Christian Bauer und ein nützliches Addendum ist "The memory accesses of the MOS 6569 VIC-II and MOS 8566 VIC-IIe Video Interface Controller" von Marko Mäkelä.
Vorbehalt: Diese sind etwas technisch, und Sie können sie leichter zu verstehen, nachdem Sie einige VIC-Effekte selbst programmiert haben.

Wenn die Links jemals sterben, google nur die Artikel nach Titel, sind sie endlos wiederholt.

2

Graphics in Grenze: Entweder Sprites oder den $ 3FFF Effekt mit (die eigentlich nicht Sprites überhaupt ist). Im Detail zu gehen braucht viel mehr Platz und Zeit als ich hier zur Verfügung habe.

+0

+1 nur weil PD ist genial. –

6

können Sie öffnen obere und untere Grenzen mit einem einfachen BASIC-Programm:

 
    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

Sie auch Sprites in Grund einzufassen bekommen: BASIC Sprites in Border

iirc, gab es auch eine Möglichkeit, um das Video zu verwirren Chip so, dass es 26. Zeile des Textes zeichnet.

Verwandte Themen