MatNES-基于Matlab的NES模拟器-PPURAM篇-2
在上一篇文章中,已经成功的将PPURAM数据进行了分块,提取出了Pattern Table,Name Table,Attribute Table,Palette等数据,在本篇文章中,主要进行Palette的数据处理,并将其显示出来。
Palette,也就是调色板,在PPU中占有举足轻重的地位,屏幕上显示的所有颜色都是从调色板中提取出来的。由于PPURAM大小的限制,屏幕图像的像素点并不是以RGB数据的形式存储的,而是以调色板索引的形式存储,也就是说,在显示像素的时候,先要从调色板中以查找表的方式将颜色提取出来,然后才能进行显示。(这也是对低下的硬件性能的一种妥协,假若有当今的强大硬件,就不会有这么多的麻烦事了。)
NES只能同屏显示32色,其中还有很多种颜色是重复的(-_-b,太弱了!)。在Palette数据中,每个Byte代表一种颜色,至于具体是什么颜色,请参照下图的颜色表。

根据对应的颜色表,将Palette里的数据转换为RGB颜色,Matlab代码如下:
function RGB = Byte2Color(Byte)
switch(Byte)
case('00')
RGB = '757575';
case('01')
RGB = '271B8F';
case('02')
RGB = '0000AB';
case('03')
RGB = '47009F';
case('04')
RGB = '8F0077';
case('05')
RGB = 'AB0013';
case('06')
RGB = 'A70000';
case('07')
RGB = '7F0B00';
case('08')
RGB = '432F00';
case('09')
RGB = '004700';
case('0A')
RGB = '005100';
case('0B')
RGB = '003F17';
case('0C')
RGB = '1B3F5F';
case('0D')
RGB = '000000';
case('0E')
RGB = '000000';
case('0F')
RGB = '000000';
case('10')
RGB = 'BCBCBC';
case('11')
RGB = '0073EF';
case('12')
RGB = '233BEF';
case('13')
RGB = '8300F3';
case('14')
RGB = 'BF00BF';
case('15')
RGB = 'E7005B';
case('16')
RGB = 'DB2B00';
case('17')
RGB = 'CB4F0F';
case('18')
RGB = '8B7300';
case('19')
RGB = '009700';
case('1A')
RGB = '00AB00';
case('1B')
RGB = '00933B';
case('1C')
RGB = '00838B';
case('1D')
RGB = '000000';
case('1E')
RGB = '000000';
case('1F')
RGB = '000000';
case('20')
RGB = 'FFFFFF';
case('21')
RGB = '3FBFFF';
case('22')
RGB = '5F97FF';
case('23')
RGB = 'A78BFD';
case('24')
RGB = 'F77BFF';
case('25')
RGB = 'FF77B7';
case('26')
RGB = 'FF7763';
case('27')
RGB = 'FF9B3B';
case('28')
RGB = 'F3BF3F';
case('29')
RGB = '83D313';
case('2A')
RGB = '4FDF4B';
case('2B')
RGB = '58F898';
case('2C')
RGB = '00EBDB';
case('2D')
RGB = '000000';
case('2E')
RGB = '000000';
case('2F')
RGB = '000000';
case('30')
RGB = 'FFFFFF';
case('31')
RGB = 'ABE7FF';
case('32')
RGB = 'C7D7FF';
case('33')
RGB = 'D7CBFF';
case('34')
RGB = 'FFC7FF';
case('35')
RGB = 'FFC7DB';
case('36')
RGB = 'FFBFB3';
case('37')
RGB = 'FFDBAB';
case('38')
RGB = 'FFE7A3';
case('39')
RGB = 'E3FFA3';
case('3A')
RGB = 'ABF3BF';
case('3B')
RGB = 'B3FFCF';
case('3C')
RGB = '9FFFF3';
case('3D')
RGB = '000000';
case('3E')
RGB = '000000';
case('3F')
RGB = '000000';
otherwise
disp('Invalid HEX');
end
end
转换完毕后,就可以将整个Palette显示出来了,32种颜色的显示效果如下:

Matlab代码如下:
PaletteDisplay = zeros(2,16,3);
for i = 1:size(ImagePalette,1)
ImageRGB = Byte2Color(ImagePalette(i,:));
SpriteRGB = Byte2Color(SpritePalette(i,:));
PaletteDisplay(1,i,1) = hex2dec(ImageRGB(1:2));
PaletteDisplay(1,i,2) = hex2dec(ImageRGB(3:4));
PaletteDisplay(1,i,3) = hex2dec(ImageRGB(5:6));
PaletteDisplay(2,i,1) = hex2dec(SpriteRGB(1:2));
PaletteDisplay(2,i,2) = hex2dec(SpriteRGB(3:4));
PaletteDisplay(2,i,3) = hex2dec(SpriteRGB(5:6));
end
image(PaletteDisplay/255);
本文的目标完成,在下一篇文章里,将会进行Pattern Table的显示,敬请期待!
.EOF.转载请注明出处.



