#include "stm32f10x.h"
#include "lcd.h"
#include "key.h"
#include "joypad.h"
// 游戏数据数组(通过WinHEX生成)
extern const unsigned char nes_data1[40976]; // 超级玛丽
extern const unsigned char nes_data2[262160]; // 魂斗罗
int main()
{
// 硬件初始化
LedInit(); // LED指示灯
UsartInit(USART1,72,115200); // 串口调试
KeyInit(); // 按键初始化
LcdInit(); // LCD初始化
JoypadInit(); // 游戏手柄初始化
LcdClear(0); // 清屏
// 加载并运行游戏
LoadNes((unsigned char*)nes_data1, 40976); // 超级玛丽
// 游戏退出处理
while(1)
{
LED1=!LED1;
DelayMs(400);
}
}
u8 LoadNes(unsigned char* pname, u32 size)
{
u8 res = 0;
res = NesSramMalloc(); // 内存分配
romfile = (u8*)pname; // 游戏数据地址
NESrom_crc32 = get_crc32(romfile+16, size-16); // CRC校验
res = LoadNesRom(); // 加载ROM
NesClockSet(16); // 超频至128MHz
JoypadInit(); // 游戏手柄初始化
cpu6502_init(); // 6502 CPU模拟
Mapper_Init(); // 存储器映射初始化
PPU_reset(); // 图像处理单元复位
apu_init(); // 音频处理单元初始化
NesEmulateFrame(); // 进入游戏主循环
return res;
}
void NesEmulateFrame(void)
{
u8 nes_frame;
NesSetWindow(); // 设置显示窗口
while(1)
{
// 图像帧生成循环
PPU_start_frame();
for(NES_scanline = 0; NES_scanline < 240; NES_scanline++)
{
run6502(113*256); // 运行6502指令
NES_Mapper->HSync(NES_scanline); // 水平同步
// 行扫描绘制
if(nes_frame == 0)
scanline_draw(NES_scanline);
else
do_scanline_and_dont_draw(NES_scanline);
}
// 垂直消隐期处理
// ... 省略部分代码
// 读取游戏手柄输入
NesGetGamepadval();
nes_frame++;
if(nes_frame > NES_SKIP_FRAME)
{
nes_frame = 0; // 帧率控制
}
}
}
// 设置游戏显示区域
void NesSetWindow(void)
{
u16 lcdwidth, lcdheight;
lcdwidth = 256;
lcdheight = 240;
nes_xoff = 0;
// 设置LCD显示窗口
LcdSetWindow(32, 0, lcdwidth, lcdheight);
LcdWriteRAM_Prepare(); // 准备写入LCD RAM
}
// 行扫描绘制函数
void scanline_draw(int LineNo)
{
uint16 i;
u16 sx, ex;
do_scanline_and_draw(ppu->dummy_buffer);
sx = nes_xoff + 8;
ex = 256 + 8 - nes_xoff;
// 优化绘制速度,批量写入像素数据
for(i = sx; i < ex; i++)
{
LCD_RAM = NES_Palette[ppu->dummy_buffer[i]]; // 写入颜色数据
// ... 批量写入优化代码
}
}
LcdSetWindow()
和LcdWriteRAM_Prepare()
函数JoypadInit()
和NesGetGamepadval()
函数Project/
├── CMSIS/ // Cortex-M3核心支持
├── FWLib/ // 固件库(未使用)
├── User/
│ ├── main.c // 主程序
│ ├── lcd.c // LCD驱动
│ ├── joypad.c // 游戏手柄驱动
│ ├── vs1053.c // 音频驱动
│ └── fatfs/ // 文件系统
├── Nes/
│ ├── nes_emu.c // NES模拟器核心
│ ├── cpu6502.c // 6502 CPU模拟
│ └── ppu.c // 图像处理模拟
└── Game/
└── game_data.c // 游戏数据数组
本项目展示了如何在STM32F103平台上成功移植NES模拟器,涵盖了硬件驱动、模拟器核心和用户交互的完整实现。通过寄存器级编程优化性能,使游戏运行流畅度接近原版FC游戏机。开发者可根据实际硬件情况适配相应驱动,亦可扩展更多功能如游戏存档、网络联机等。
完整工程代码和293款游戏资源可通过提供的下载链接获取,适合嵌入式开发学习和娱乐使用。