如何寫乙個NES模擬器(二) 顯示命名表

2021-08-31 04:04:42 字數 1244 閱讀 6650

ppu 的記憶體空間如下

位址0x0000- 0x1fff 是圖案表,所有螢幕顯示的(點陣)圖案都從這裡獲取。下面是ppu的4個命名表(0x2000-0x2fff),

通俗的來說,這4個命名表就是顯示在螢幕上的畫面了。0x3f00起始的16個位元組是背景調色盤,0x3f10起始的16個位元組是精靈調色盤(先不研究)。

我們先研究背景內容的顯示。如上圖,命名表0有0x3c0 = 960個位元組,每個位元組代表乙個塊(許多手冊稱為tile)。請注意,1個位元組是8位,能表示的無符號數是0-255。而圖案表正好就是256個塊,8位正好索引256塊。而命名表中的每個位元組正是圖案表的索引。假設命名表中有個字元是0x10,這表示圖案表中的第0x10個位元組,定址的話就是: 0x0000 + 0x10 * 16 (每個塊佔16個位元組)。從0x23c0起屬性表儲存了每4個塊的高2位。

命名表的圖示(960個位元組,每個位元組代表乙個塊tile)

屬性表配色對應命名表(每個位元組配色4*4個塊)

說了這麼多,該上**了。

//繪製命名表函式

void draw_nametable(int x1,int x2,int y1,int y2,unsigned char * nametable_ptr )else if( i % 2 == 0)

if(0 == change_i)

attr = attr & 3;

draw_background(i * 8,/*x*/j * 8/*y*/, *nametable_ptr/*索引圖案表*/,attr/*屬性高2位*/); //繪製塊

nametable_ptr ++; //指向下乙個塊

測試程式在下面鏈結中

如何寫乙個Stack?

1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...

如何寫乙個鍊錶

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...

如何寫乙個Vue元件

寫的是以.vue結尾的單檔案元件的寫法,是基於webpack構建的專案。template 模板 js 邏輯 css 樣式 每個元件都有屬於自己的模板,js和樣式。如果將乙個頁面比喻成一間房子的話,元件就是房子裡的客廳 臥室 廚房 廁所。如果把廚房單獨拿出來的話,元件又可以是刀 油煙機.等等。就是說頁...