第一篇:手把手教你移植任天堂,没有声音、无需外置SD卡、可使用独立按键也可使用外置手柄,本人使用的芯片为ESP32,移植到STM32均可使用。(本篇主要介绍nes_main.h这个文件)
話不多說直接上文件框架
?可以看到NES模擬器主要包含以下幾大部分
6502(必要):這是用程序模擬NES內核,即用程序寫一個CPU,主要目的就是來運行NES文件
adcrock與keyNum(自定義):這兩個是獲取上下左右方向和獲取按鍵信息的一個文件夾,具體內容,可以根據你們自己的文件而定
joypad(必要):這個文件主要就是來處理方向信息和按鍵信息的一個文件
nes_main(必要):這個文件就是來執行NES的主文件
nes_rom(必要):這個文件就是游戲的數據信息了
NES(非必要):這個是Arduino的執行文件,當你們用安信可平臺或者KEIL等其他IDE時就不需要這個文件了
PPU(必要):這個跟顯示游戲內容相關
type(非必要):這里面存放的是變量類型
首先我讀取一份程序,本人建議自己看頭文件,了解大題步驟,這里我們直接看nes_main.h這個文件再對nes_main.c這個文件進行解析
#ifndef _NES_MAIN_H_ #define _NES_MAIN_H_#include <stdio.h> #include <string.h> #include "type.h" #include "nes_rom.h"typedef struct {char filetype[4]; //字符串“NES^Z”用來識別.NES文件 u8 romnum; //16kB ROM的數目 u8 vromnum; //8kB VROM的數目 u8 romfeature; //D0:1=垂直鏡像,0=水平鏡像 // D1:1=有電池記憶,SRAM地址$6000-$7FFF// D2:1=在$7000-$71FF有一個512字節的trainer // D3:1=4屏幕VRAM布局 // D4-D7:ROM Mapper的�4� u8 rommappernum; // D0-D3:保留,必須是0(準備作為副Mapper號^_^)// D4-D7:ROM Mapper的高4位 //u8 reserve[8]; // 保留,必須是0 //OM段升序排列,如果存在trainer,它的512字節擺在ROM段之前 //VROM段, 升序排列 }NesHeader; u8 nes_main(void); void NesFrameCycle(void); u8 nes_mem_creat(void); //開辟nes運行所需的RAM. void nes_mem_delete(void); //刪除nes運行時申請的RAM //PPU使用 extern u8 *NameTable; //2K的變量 extern u16 *Buffer_scanline; //行顯示緩存,上下標越界最大為7,顯示區 7 ~ 263 0~7 263~270 為防止溢出區 //CPU使用 extern u8 *ram6502; //RAM 2K字節,由malloc申請#endif可以看到引用的頭文件中
#include <stdio.h> #include <string.h> #include "type.h" //存放數據類型 #include "nes_rom.h" //存放游戲數據前兩個就不做解釋了,學過C的都懂,下面主要介紹
#include “type.h”和#include “nes_rom.h”文件夾
其中#include “type.h”文件內容為:這里面存放的是變量類型
#ifndef _TYPE_H_ #define _TYPE_H_#define u8 unsigned char //定義一個8位的無符號變量類型 #define u16 unsigned short //定義一個16位的無符號變量類型 #define u32 unsigned int //定義一個32位的無符號變量類型typedef unsigned short WORD; //定義一個16位的無符號變量類型,主要在6502文件中使用 typedef unsigned char BYTE; //定義一個16位的無符號變量類型,主要在6502文件中使用#endif是不是很簡單,就5句話,沒錯他就這么簡單,
其中#include “nes_rom.h”
#include "nes_rom.h"#define _USE_BIGTANK_ 0 //使用導彈坦克nes #define _USE_SUPPERMARIO_ 1 //超級瑪麗#if _USE_SUPPERMARIO_ == 1 const unsigned char rom_file[40976]= {0x4E,0x45,0x53,0x1A,0x02,0x01,............................................................0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }沒錯這個文件存放的就是游戲數據了,想要玩什么游戲,只需把.nes游戲文件轉化為HEX文件,再是生成游戲數據的數組就行了?,具體操作如下
?至此第一篇中引用的頭文件就講完了
接下去我們看結構體
typedef struct {char filetype[4]; //字符串“NES^Z”用來識別.NES文件 u8 romnum; //16kB ROM的數目 u8 vromnum; //8kB VROM的數目 u8 romfeature; //D0:1=垂直鏡像,0=水平鏡像 // D1:1=有電池記憶,SRAM地址$6000-$7FFF// D2:1=在$7000-$71FF有一個512字節的trainer // D3:1=4屏幕VRAM布局 // D4-D7:ROM Mapper的�4� u8 rommappernum; // D0-D3:保留,必須是0(準備作為副Mapper號^_^)// D4-D7:ROM Mapper的高4位 //u8 reserve[8]; // 保留,必須是0 //OM段升序排列,如果存在trainer,它的512字節擺在ROM段之前 //VROM段, 升序排列 }NesHeader;這個沒什么好講的,就是一個識別存放NES文件的一個結構體,我移植的時候這一段直接復制就行了
繼續往下看
u8 nes_main(void); void NesFrameCycle(void); u8 nes_mem_creat(void); //開辟nes運行所需的RAM. void nes_mem_delete(void); //刪除nes運行時申請的RAMnes_main(void);:這個是主內容:不管你用ESP32還是STM32還是什么其他單片機或者其他平臺只要調用這個函數你的游戲就能啟動了。這部分每一篇都會講
void NesFrameCycle(void);這個是游戲啟動之后一直在循環的函數,這部分放到最后一篇再講
u8 nes_mem_creat(void);?? ??? ?//開辟nes運行所需的RAM.即游戲啟動前使用本函數,為游戲開辟運行內存
void nes_mem_delete(void);?? ?//刪除nes運行時申請的RAM,即游戲結束之后,為結束內存空間,對游戲內存進行釋放
//PPU使用 extern u8 *NameTable; //2K的變量 extern u16 *Buffer_scanline; //行顯示緩存,上下標越界最大為7,顯示區 7 ~ 263 0~7 263~270 為防止溢出區 //CPU使用 extern u8 *ram6502; //RAM 2K字節,由malloc申請這幾個變量主要就是配合:u8 nes_mem_creat(void); 、void nes_mem_delete(void);? 這兩個函數使用的,即u8 nes_mem_creat(void); 、void nes_mem_delete(void); 這兩個函數申請內存和釋放內存時,即是對這三個變量進行操作的
至此第一篇關于nes_main頭文件的介紹至此就結束了,關于nes_main.h篇章就此告一段落,
繼續學習詳細請看第二篇
總結
以上是生活随笔為你收集整理的第一篇:手把手教你移植任天堂,没有声音、无需外置SD卡、可使用独立按键也可使用外置手柄,本人使用的芯片为ESP32,移植到STM32均可使用。(本篇主要介绍nes_main.h这个文件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm install error co
- 下一篇: 程序员阿里三次面试已过却无理由挂了,网友