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*/
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*/
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);
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;
}
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;
}
}
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);
}
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


