ת»»Ϊgb2312±àÂë

This commit is contained in:
2025-07-05 19:47:28 +08:00
parent 8c12c1ffc3
commit 079aa9f868
550 changed files with 13358 additions and 17326 deletions

View File

@@ -9,16 +9,16 @@
//////////////////////////////////////////////////////////////////////////////////
//本程序移植自网友ye781205NES模拟器工程
//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