Classic Kong Quelltext Verständnis

Hier könnt ihr Euch mit Gleichgesinnten austauschen bei der Entwicklung eines neuen Spiels oder eines neuen Stücks Hardware... oder einfach nur über Coding und Spieleentwicklung allgemein plaudern.

Moderatoren: ikari_01, d4s

Benutzeravatar
Farbauti
SNES-Programmer
SNES-Programmer
Beiträge: 128
Registriert: 14. August 2011, 23:00
+Positive Tradingpoints+: 0 von 0
Wohnort: Berlin

Classic Kong Quelltext Verständnis

Beitrag von Farbauti » 27. August 2012, 22:56

Hi Leute ich habe für den Quelltext rund um classic Kong von Shiru mal einen eigenen Thread aufgemacht weil es in dem anderen vom thema wohl nicht so technisch heiß her geht. Wem das nicht soll mich verklagen und bei den mods petzen gehen xP

Ich habe leider einige Probleme den Code zu verstehen und vielleicht können wir hier gemeinsam rausfinden was passiert.
Es geht um die Stelle in der das Publisher Logo angezeigt.(Ja ich habs nichtmal zum Startmenü geschafft T_T)

Code: Alles auswählen

void show_logo(void)
{
	static unsigned int i,j,n,bright;

	BGMODE(3+8);	/*mode 3, 2 layers, 256+16 colors*/
	BG1SC(0<<2);	/*32x32 nametable at $0000*/
	BG2SC(1<<2);	/*32x32 nametable at $0400*/
	BG12NBA(0x70);	/*patterns for layers 1 and 2 at $1000*/
	BG34NBA(0x00);	/*patterns for layers 3 and 4 at $1000*/

	copy_vram(0x0800,bzlogo_gfx,7168);
	set_palette(0,256,bzlogo_pal);

	for(i=0;i<32*32;++i)
	{
		nametable1[i]=0;
		nametable2[i]=0;
	}

	n=64;

	for(i=0;i<4;++i)
	{
		for(j=0;j<28;++j)
		{
			nametable1[POS(2+j,12+i)]=n;
			++n;
		}
	}

	update_nametables();
	update_palette();

	bright=0;

	for(i=0;i<17<<1;++i)
	{
		nmi_wait();

		if(bright<15)
		{
			++bright;
			set_bright(bright);
		}

		set_pixelize(i>>1);
	}
}

Code: Alles auswählen

BGMODE(3+8);	/*mode 3, 2 layers, 256+16 colors*/
BG1SC(0<<2);	/*32x32 nametable at $0000*/
BG2SC(1<<2);	/*32x32 nametable at $0400*/
Hier setzen wir den BG Mode und sagen, dass Nametable/TileMap für Hintergrund 1 bei adresse 0000 startet und die für den 2. Hintergrund bei Adresse 0400. Erkennt man zur Not noch an den Kommentaren.
Für die Assembler Helden unter euch müsste dass das hier bedeuten
schiebe ins register 2105 den wert 1011(binär)
Anschließend in Register 2107 den Wert 0(binär) und dann in Register 2108 den Wert 100(binär)
Durch die beiden letzen Befehle sagen wir ausserdem, dass beide Nametable/Tilemaps eine Dimension von 32x32 Tiles haben, da die ersten beiden Bits beider Werte 0 sind.

Code: Alles auswählen

BG12NBA(0x70);	/*patterns for layers 1 and 2 at $1000*/
BG34NBA(0x00);	/*patterns for layers 3 and 4 at $1000*/
Jetzt kommt schon der erste Part den ich nicht verstehe.
Der erste Befehl packt ins Register 210b den Wert 70(hex), also 01110000(binär).
Wenn ich die Doku richtig verstehe, heißt das, das wir sagen, dass das Tileset für Hintergrund 2 bei bei Adresse 7000 beginnt und der für Hintergrund 1, 3 und 4(durch den 2. befehl) bei Adresse 0.

Code: Alles auswählen

copy_vram(0x0800,bzlogo_gfx,7168);
set_palette(0,256,bzlogo_pal);
Der erste befehl kopiert die Grafik bzlogo_gfx, die 7168 Byte groß ist, auf die Adresse 0800.(Hierfür wird dma benutzt.)
Anschließend wird die Farbpalette bzlogo_pal an Position 0 gesetzt.

Code: Alles auswählen

for(i=0;i<32*32;++i){
	nametable1[i]=0;
	nametable2[i]=0;
}
Nametables/TileMaps werden geleert.

Code: Alles auswählen

n=64;

for(i=0;i<4;++i)
{
	for(j=0;j<28;++j)	{
		nametable1[POS(2+j,12+i)]=n;
		++n;
	}	
}
Hier werden Tiles an die Positionen gepackt, an denen Später das Bubblezaplogo zusehen ist.
Die Grafik ist 224x32 Pixel groß. Bei einer Tilegröße von 8x8 Pixeln macht das TADAA 28x4 Tiles.
Das POS(2+j,12+i) macht nichts anderes als die Position für das Tile im Array nametable1 zu berechnen. Das 2+j ist dafür, um die Grafik 2 Tiles nach rechts zu rücken und das 12+i um die Grafik in die 12 TileZeile zu verschieben.
Was ich hier wieder nicht verstehe ist der Wert, der in das Array geschrieben wird. Laut Doku ist der Wert pro Arrayeintrag 2Byte groß. Die ersten 10 Bit um die Tilenummer anzugeben, die nächsten 3 für die Palette, dann ein priority bit(kp was das ist) und dann jeweils ein bit für horizontale und vertikale Spiegelung.
Die 64, die das erste Tile meiner Grafik darstellen soll, hat den Wert 00000000 01000000(binär). Das würde ich jetzt so interpretieren: stelle an der Position in der Nametable/TileMap das Tile 64 von der Tileset mit der Startadresse 0000 mit der Palette 0 dar. Das scheint mir aber nicht wirklich richtig interpretiert -.-

Code: Alles auswählen

update_nametables();
update_palette();

bright=0;

for(i=0;i<17<<1;++i)
{
	nmi_wait();

	if(bright<15)
	{
		++bright;
		set_bright(bright);
	}

	set_pixelize(i>>1);
}
Zum schluss werden die Tilemaps und Paletten in den VRAM geschoben und die Helligkeit und der Wert in Register 2106 (Mosaic) Stück für Stück hochgedreht.

Rein Logisch gesehen denke ich, dass die Grafik bzlogo_gfx das Tileset ist. Die bekommt allerdings die Startadresse 0800 während ich durch BG12NBA(0x70); ja eigentlich sage, dass das Tileset bei Adresse 0 startet ?

So damit wäre aufgetischt, wäre toll wenn ich wenigstens etwas Response von euch bekomme damit ich diesen Monstertext nicht umsonst getippt habe :D

Benutzeravatar
ikari_01
snesfreaks.com-Team
snesfreaks.com-Team
Beiträge: 441
Registriert: 15. Juni 2010, 23:19
+Positive Tradingpoints+: 6 von 6
Wohnort: Wunstorf

Re: Classic Kong Quelltext Verständnis

Beitrag von ikari_01 » 28. August 2012, 10:31

Farbauti hat geschrieben: Rein Logisch gesehen denke ich, dass die Grafik bzlogo_gfx das Tileset ist. Die bekommt allerdings die Startadresse 0800 während ich durch BG12NBA(0x70); ja eigentlich sage, dass das Tileset bei Adresse 0 startet ?
Vorausgesetzt, das Logo hat 256 Farben, kommt das genau hin:
Das Logo-Tileset wird an VRAM-Adresse $0800 kopiert, also Offset 4096 Bytes. 4096?! Warum nicht 2048? Weil das VRAM 16 Bit breit ist und somit jede Adresse "zwei Bytes aufnimmt".
Bei der Schleife, die die Nametable befüllt, hast du schon festgestellt, dass sie mit n=64 beginnt, was direkt Tilenr. 64 entspricht.

Im 256-Farben-Modus ist ein 8x8-Tile 64 Bytes groß (8 Bits pro Pixel, 64 Pixel). Somit sind 64 Tiles genau 4096 Bytes groß und es passt genau.

Die unteren 4096 Bytes (0000-03ff) wurden wohl freigelassen, um dort die Nametables für BG1 und BG2 unterzubringen.
sd2snes news: https://sd2snes.de

Benutzeravatar
Farbauti
SNES-Programmer
SNES-Programmer
Beiträge: 128
Registriert: 14. August 2011, 23:00
+Positive Tradingpoints+: 0 von 0
Wohnort: Berlin

Re: Classic Kong Quelltext Verständnis

Beitrag von Farbauti » 28. August 2012, 12:12

Und warum klingt das bei dir so verdammt einfach, dass ich es beim ersten mal lesen sofort verstehe ?! :D
Vielen Dank !!!

Das alles was du geschrieben hast lag irgendwie verteilt in meinen Hirnwindungen rum... leider habe ich es nach einem ganzen Wochenende nichtmal geschafft das selber zusammen zu puzzeln =/

Was ich nur nicht ganz verstehe ist, warum er mit

Code: Alles auswählen

BG12NBA(0x70);
Das Tileset für Hintergrund 2 auf Adresse 7000 legt obwohl die NameTable/TileMap für den Hintergrund eh leer bleibt.
Hast du vielleicht eine Idee warum er das machen könnte?
Wenn ich mir die Kommentare neben den Funktionsaufrufen anschaue scheint das aber sowieso nicht ganz stimmig mit dem zu sein, was eigentlich gemacht wird.

Benutzeravatar
lytron
Code Bro
Code Bro
Beiträge: 2664
Registriert: 12. August 2012, 20:18
+Positive Tradingpoints+: 12 von 12
Wohnort: ハノーファー区
Kontaktdaten:

Re: Classic Kong Quelltext Verständnis

Beitrag von lytron » 28. August 2012, 12:31

Farbauti hat geschrieben:Das Tileset für Hintergrund 2 auf Adresse 7000 legt obwohl die NameTable/TileMap für den Hintergrund eh leer bleibt.
Hast du vielleicht eine Idee warum er das machen könnte?
Wenn ich mir die Kommentare neben den Funktionsaufrufen anschaue scheint das aber sowieso nicht ganz stimmig mit dem zu sein, was eigentlich gemacht wird.
Ich rate mal dazwischen. :D

Mit dem

Code: Alles auswählen

n=64;

for(i=0;i<4;++i)
{
	for(j=0;j<28;++j)	{
		nametable1[POS(2+j,12+i)]=n;
		++n;
	}	
}
schreibt er, wenn ich es richtig verstehe, eine Tilemap, deren Inhalt fortlaufende Nummern sind (passend, wenn das Tileset ein in Kacheln aufgeteiltes Bild ist, bei dem es zu keiner "Kompression" gekommen ist, dass doppelte Kacheln (z. B. in komplettem Schwarz) entfernt wurden). Das ist dann die Tilemap.

Ich hoffe, dass ich deine Frage richtig verstehe...
Die Tilemap für BG 1 liegt bei $0000, der Character Offset ist das, was auf $7000 gesetzt wurde. Das bedeutet, er nummeriert die Tiles ab $7000 durch; wenn man ihm sagt "Nimm Tile 0", sucht er das jetzt bei $7000.

Ich bin mir da ziemlich sicher, dass das so stimmt. :D Stimmts, ikari_01? :D
pantalytron: ルトロンはくそのディスアセンブラだよ!
Perikles hat geschrieben:Man muss sich das mal reinziehen: die Idee ist scheiße, die theoretische Ausarbeitung ist scheiße, die praktische Umsetzung ist scheiße und der so entstehende Anspruch noch beschissener.

Benutzeravatar
ikari_01
snesfreaks.com-Team
snesfreaks.com-Team
Beiträge: 441
Registriert: 15. Juni 2010, 23:19
+Positive Tradingpoints+: 6 von 6
Wohnort: Wunstorf

Re: Classic Kong Quelltext Verständnis

Beitrag von ikari_01 » 28. August 2012, 13:21

lytron hat geschrieben: Die Tilemap für BG 1 liegt bei $0000, der Character Offset ist das, was auf $7000 gesetzt wurde. Das bedeutet, er nummeriert die Tiles ab $7000 durch; wenn man ihm sagt "Nimm Tile 0", sucht er das jetzt bei $7000.

Ich bin mir da ziemlich sicher, dass das so stimmt. :D Stimmts, ikari_01? :D
Nicht ganz- Tilemap _und_ Character-Adresse für BG1 liegen bei $0000. Da die Tilemap aber natürlich keine vernünftigen Characterdaten hergibt, wird diese mittels Tile-Nr. 64+ einfach ausgespart und tatsächliche Characterdaten so erst ab $0800 angesprochen.

Die Character-Adresse für BG2 liegt bei $7000, wo zu diesem Zeitpunkt aber nichts ist. Vermutlich wurde die Adresse mehr oder weniger willkürlich ausgewählt, um sicher zu gehen, dass kein Grafikmüll auf BG2 angezeigt wird. Wobei man dann auch einfach BG2 hätte abschalten können. Nun ja. :roll:

Im Kern aber richtig, wenn die Adresse auf $7000 gesetzt ist, dann wird Tile 0 bei $7000 gesucht. ;)
sd2snes news: https://sd2snes.de

Benutzeravatar
Farbauti
SNES-Programmer
SNES-Programmer
Beiträge: 128
Registriert: 14. August 2011, 23:00
+Positive Tradingpoints+: 0 von 0
Wohnort: Berlin

Re: Classic Kong Quelltext Verständnis

Beitrag von Farbauti » 28. August 2012, 14:27

Ah okay,
Also hat er das mit dem kopieren der TileGrafiken auf Adresse 0800 und der Starttile 64 nur gemacht, damit er keine lücke von 200 Speicherstellen(400Byte) im VRAM lassen muss?
Er hätte ja auch sagen können

Code: Alles auswählen

BG12NBA(0x71);
Damit hätte er das Tileset für BG1 1 auf Adresse 1000 gesetzt

anschließend ein

Code: Alles auswählen

copy_vram(0x1000,bzlogo_gfx,7168);
Um die TileSet Grafik auf Adresse 1000 zu kopieren und schon hätte er in der Schleife, in der Nametable/TileMap 1 gefüllt wird mit n=0 starten können, oder?

Benutzeravatar
ikari_01
snesfreaks.com-Team
snesfreaks.com-Team
Beiträge: 441
Registriert: 15. Juni 2010, 23:19
+Positive Tradingpoints+: 6 von 6
Wohnort: Wunstorf

Re: Classic Kong Quelltext Verständnis

Beitrag von ikari_01 » 28. August 2012, 14:45

Exakt. :)
sd2snes news: https://sd2snes.de

Antworten