如何写一个NES模拟器(三)——精灵的显示
?
上次寫到顯示命名表,接下來可以顯示精靈了。
給初學(xué)者補(bǔ)充一下,在windows屏幕顯示圖像的流程是這樣的,分配一段內(nèi)存稱為顯存,把所有像素都寫入(通過draw_window_point函數(shù))進(jìn)去,然后再通過CreateDIBSection創(chuàng)建位圖,再用Bitblt函數(shù)繪制到前臺(tái)。
?
閑話少敘,進(jìn)入正題。NES中精靈由專門的精靈內(nèi)存(256字節(jié))存放,在硬件中,一般映射在CPU的某個(gè)部分,便于快速傳送。我們分配一個(gè)內(nèi)存空間給它,SpriteRam[256]。
單個(gè)精靈是有4個(gè)字節(jié)來描述,所有NES共有64個(gè)精靈。
精靈的4字節(jié)描述如下
| 字節(jié)位描述 | 位bit7-bit0 | 描述 |
| 0 | y | 精靈左上角的Y 坐標(biāo)-1 |
| 1 | index | Tile 索引號(hào) |
| 2 | vhp000c | v=垂直翻轉(zhuǎn)(1=翻轉(zhuǎn)) |
| h=水平翻轉(zhuǎn)(1=翻轉(zhuǎn)) | ||
| p=背景優(yōu)先權(quán)(0=前臺(tái)1=后臺(tái)) | ||
| c=顏色的高2 位 | ||
| 3 | x | 精靈左上角的X 坐標(biāo) |
精靈有2中,一種是8x8的,另一種是8x16的。使用哪一種由0x2000寄存器的bit5,確定。
那么繪制的偽代碼如下
For(I = 63;I >=0;i++){
?????? If(要顯示8*8精靈 )
DrawTile8x8(spr.x, spr.y, spr.attr&3, flip); //flip表示翻轉(zhuǎn),根據(jù)屬性vh確定,attr&3表示顏色的高2位
?????? Else
DrawTile8x16(spr.x, spr.y, spr.attr&3, flip);
}
?
精靈8x8的繪制可以直接調(diào)用DrawTile,而8x16的繪制比較復(fù)雜。8x16的精靈塊的索引(index)表示第一個(gè)塊的索引,第二塊的索引則是index + 1,且index在圖案表0中索引,index+1在圖案表1中索引。繪制代碼見demo程序。
?????? 而精靈的顯示測(cè)試程序比較麻煩,由于精靈有專門的內(nèi)存空間,而大多數(shù)模擬器都無法查看到精靈空間,這時(shí)我們需要把CPU模擬放進(jìn)來了。
總結(jié)
以上是生活随笔為你收集整理的如何写一个NES模拟器(三)——精灵的显示的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些免费、好用的多人协同办公软件推荐?
- 下一篇: 利用pyecharts绘制分级地图的案例