ת»»Ϊgb2312±àÂë
This commit is contained in:
@@ -9,16 +9,16 @@
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//本程序移植自网友ye781205的NES模拟器工程
|
||||
//ALIENTEK STM32F407开发板
|
||||
//NES PPU 驱动代码
|
||||
//正点原子@ALIENTEK
|
||||
//技术论坛:www.openedv.com
|
||||
//创建日期:2014/7/1
|
||||
//版本:V1.0
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ye781205<EFBFBD><EFBFBD>NESģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ALIENTEK STM32F407<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//NES PPU <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/7/1
|
||||
//<EFBFBD>汾<EFBFBD><EFBFBD>V1.0
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
uint8* PPU_patterntables; //8192 VROM开始地址 图案表
|
||||
uint8* PPU_patterntables; //8192 VROM<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ַ ͼ<><CDBC><EFBFBD><EFBFBD>
|
||||
|
||||
void set_tile_banks(uint8 *bank0, uint8 *bank1, uint8 *bank2, uint8 *bank3,
|
||||
uint8 *bank4, uint8 *bank5, uint8 *bank6, uint8 *bank7)
|
||||
@@ -140,7 +140,7 @@ void compile(int count, uint8 *src, uint8 *dest)
|
||||
EXTRACT_4_PIXELS();
|
||||
src++;
|
||||
}
|
||||
p=destemp;//重新指向数组首地址
|
||||
p=destemp;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
for(j=0;j<16;j++)*dest++=destemp[j];
|
||||
src += 8;
|
||||
}
|
||||
@@ -233,7 +233,7 @@ void PPU_Latch_FDFE(uint32 addr) {}
|
||||
} \
|
||||
}
|
||||
|
||||
//、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、初始化
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
||||
static u16 *LCD_ADDR=0;
|
||||
void PPU_reset(void *lcd_addr)
|
||||
{
|
||||
@@ -248,13 +248,13 @@ void PPU_reset(void *lcd_addr)
|
||||
// NES_Palette[i]=COLOR565TO888(NES_Palette[i]);
|
||||
// }
|
||||
// }
|
||||
//清屏
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// for (int i=0;i<480*272;i++)
|
||||
// {
|
||||
// LCD_ADDR[i]=0;
|
||||
// }
|
||||
// set up PPU memory space table
|
||||
PPU_patterntables=VROM_banks;//不确定正确
|
||||
PPU_patterntables=VROM_banks;//<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
|
||||
|
||||
ppu->PPU_VRAM_banks[0x00] = PPU_patterntables + (0*0x400);
|
||||
ppu->PPU_VRAM_banks[0x01] = PPU_patterntables + (1*0x400);
|
||||
@@ -272,7 +272,7 @@ void PPU_reset(void *lcd_addr)
|
||||
ppu->PPU_VRAM_banks[0x0A] = ppu->PPU_nametables;
|
||||
ppu->PPU_VRAM_banks[0x0B] = ppu->PPU_nametables;
|
||||
|
||||
ppu->PPU_tile_tables=VROM_tiles;//不确定正确
|
||||
ppu->PPU_tile_tables=VROM_tiles;//<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
|
||||
//BYTES_PER_COMPILED_TILE=16
|
||||
ppu->PPU_tile_banks[0x00] = ppu->PPU_tile_tables + (0*0x400);
|
||||
ppu->PPU_tile_banks[0x01] = ppu->PPU_tile_tables + (1*0x400);
|
||||
@@ -296,12 +296,12 @@ void PPU_reset(void *lcd_addr)
|
||||
ppu->read_2007_buffer = 0;
|
||||
ppu->current_frame_line = 0;
|
||||
|
||||
if(RomHeader->flags_1 &0x01)set_mirroring(0,1,0,1);//垂直镜像 // PPU_set_mirroring(); 设置镜像
|
||||
else set_mirroring(0,0,1,1);//水平镜像
|
||||
if(RomHeader->flags_1 &0x01)set_mirroring(0,1,0,1);//<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // PPU_set_mirroring(); <EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><EFBFBD><EFBFBD>
|
||||
else set_mirroring(0,0,1,1);//ˮƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
}
|
||||
//***********************************************************************************************
|
||||
void set_mirroring(uint32 nt0, uint32 nt1, uint32 nt2, uint32 nt3)//设置垂直水平镜像
|
||||
void set_mirroring(uint32 nt0, uint32 nt1, uint32 nt2, uint32 nt3)//<EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ֱˮƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
ppu->PPU_VRAM_banks[0x08] = ppu->PPU_nametables + (nt0 << 10); // * 0x0400
|
||||
ppu->PPU_VRAM_banks[0x09] = ppu->PPU_nametables + (nt1 << 10);
|
||||
@@ -327,7 +327,7 @@ void do_scanline_and_draw(uint8* buf)
|
||||
uint16 i;
|
||||
if(!bg_enabled())
|
||||
{
|
||||
// set to background color设置背景颜色
|
||||
// set to background color<EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
||||
// memset(buf, bg_pal[0], NES_BACKBUF_WIDTH);//NES_BACKBUF_WIDTH=256+(2*8)
|
||||
for(i=0;i<(256+16);i++)
|
||||
{
|
||||
@@ -341,18 +341,18 @@ void do_scanline_and_draw(uint8* buf)
|
||||
|
||||
if(bg_enabled())
|
||||
{
|
||||
// draw background画背景
|
||||
// draw background<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
render_bg(buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
// clear out solid buffer清除固体缓冲区
|
||||
// clear out solid buffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>建<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
memset(ppu->solid_buf, 0x00, sizeof(ppu->solid_buf));
|
||||
}
|
||||
|
||||
if(spr_enabled())
|
||||
{
|
||||
// draw sprites绘制精灵
|
||||
// draw sprites<EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><EFBFBD><EFBFBD>
|
||||
render_spr(buf);
|
||||
}
|
||||
|
||||
@@ -361,7 +361,7 @@ void do_scanline_and_draw(uint8* buf)
|
||||
ppu->current_frame_line++;
|
||||
}
|
||||
|
||||
extern u8 nes_xoff; //显示在x轴方向的偏移量(实际显示宽度=256-2*nes_xoff)
|
||||
extern u8 nes_xoff; //<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>x<EFBFBD>᷽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(ʵ<><CAB5><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>=256-2*nes_xoff)
|
||||
extern u8 nes_yoff;
|
||||
void scanline_draw(int LineNo)
|
||||
{
|
||||
@@ -486,7 +486,7 @@ void write_2007(uint8 data)
|
||||
// palette
|
||||
data &= 0x3F;
|
||||
|
||||
if(0x0000 == (addr & 0x000F)) // is it THE 0 entry?0的条目吗
|
||||
if(0x0000 == (addr & 0x000F)) // is it THE 0 entry?0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>
|
||||
{
|
||||
ppu->bg_pal[0] = ppu->spr_pal[0] = data;
|
||||
}
|
||||
@@ -504,13 +504,13 @@ void write_2007(uint8 data)
|
||||
return;
|
||||
}
|
||||
|
||||
// handle mirroring处理镜像
|
||||
// handle mirroring<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
addr &= 0xEFFF;
|
||||
}
|
||||
|
||||
VRAM(addr) = data;
|
||||
if (addr < 0x2000) {
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
|
||||
*(TILE(addr) + (addr & 0xf )) = data;//************************
|
||||
#else
|
||||
@@ -736,7 +736,7 @@ void render_bg(uint8* buf)
|
||||
uint8 *data;
|
||||
uint32 col;
|
||||
|
||||
uint32 tile_x; // pixel coords within nametable像素坐标内nametable
|
||||
uint32 tile_x; // pixel coords within nametable<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nametable
|
||||
uint32 tile_y;
|
||||
uint32 name_addr;
|
||||
uint32 line;
|
||||
@@ -745,7 +745,7 @@ void render_bg(uint8* buf)
|
||||
uint32 attrib_addr;
|
||||
uint32 attrib_bits;
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
uint8 pattern_lo;
|
||||
uint8 pattern_hi;
|
||||
uint8 pattern_mask;
|
||||
@@ -784,7 +784,7 @@ void render_bg(uint8* buf)
|
||||
|
||||
// CHECK_MMC2(pattern_addr);//*******************************************************
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
data = TILE(pattern_addr) + line;
|
||||
|
||||
pattern_lo = *data;
|
||||
@@ -833,7 +833,7 @@ void render_bg(uint8* buf)
|
||||
tile_x++;
|
||||
name_addr++;
|
||||
|
||||
// are we crossing a dual-tile boundary?我们穿越dual-tile边界吗?
|
||||
// are we crossing a dual-tile boundary?<EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>Խdual-tile<EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD>?
|
||||
if(0x0000 == (tile_x & 0x0001))
|
||||
{
|
||||
// are we crossing a quad-tile boundary?
|
||||
@@ -867,7 +867,7 @@ void render_bg(uint8* buf)
|
||||
|
||||
// if(bg_clip_left8())
|
||||
// {
|
||||
// // clip left 8 pixels夹了8个像素SIDE_MARGIN = 8,
|
||||
// // clip left 8 pixels<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SIDE_MARGIN = 8,
|
||||
// memset(buf + SIDE_MARGIN, bg_pal[0], 8);
|
||||
// memset(solid + SIDE_MARGIN, 0, sizeof(solid[0])*8);
|
||||
// }
|
||||
@@ -893,7 +893,7 @@ void render_spr(uint8* buf)
|
||||
|
||||
uint32 spr_height;
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
|
||||
uint8 pattern_lo;
|
||||
uint8 pattern_hi;
|
||||
@@ -909,7 +909,7 @@ void render_spr(uint8* buf)
|
||||
|
||||
spr_y = spr[0]+1;
|
||||
|
||||
// on current scanline对当前扫描线?
|
||||
// on current scanline<EFBFBD>Ե<EFBFBD>ǰɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
if((spr_y > ppu->current_frame_line) || ((spr_y+(spr_height)) <= ppu->current_frame_line))
|
||||
continue;
|
||||
|
||||
@@ -980,7 +980,7 @@ void render_spr(uint8* buf)
|
||||
tile_addr += ppu->spr_pattern_table_addr;
|
||||
}
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
t = TILE(tile_addr) + line;
|
||||
|
||||
pattern_lo = *t;
|
||||
@@ -997,11 +997,11 @@ void render_spr(uint8* buf)
|
||||
{
|
||||
//uint8 col = 0x00;
|
||||
|
||||
// if a sprite has drawn on this pixel, don't draw anything如果一个雪碧吸引了这个像素,不画任何东西
|
||||
// if a sprite has drawn on this pixel, don't draw anything<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ѩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>κζ<CEBA><CEB6><EFBFBD>
|
||||
if(!((*solid) & SPR_WRITTEN_FLAG))
|
||||
{
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:内存占用小 0:速度快
|
||||
#if NES_RAM_SPEED==1 //1:<EFBFBD>ڴ<EFBFBD>ռ<EFBFBD><EFBFBD>С 0:<3A>ٶȿ<D9B6>
|
||||
|
||||
col = ((pattern_hi>>(7-x)<<1)&2)|((pattern_lo>>(7-x))&1);
|
||||
#else
|
||||
|
Reference in New Issue
Block a user