龙空技术网

C语言chip-8模拟器开发教程(2)初始化

终于削了皮的茄子 112

前言:

此刻小伙伴们对“c11 结构体初始化”大体比较讲究,朋友们都需要知道一些“c11 结构体初始化”的相关资讯。那么小编也在网摘上收集了一些有关“c11 结构体初始化””的相关内容,希望你们能喜欢,大家快快来学习一下吧!

上期教程:

程序架构

有了对chip-8的了解后,编写模拟器的话就很容易了。

程序的大体逻辑就是:

初始化cpu,内存,gfx等,读取rom模拟cpu运行周期,解析rom里的指令,执行相应操作。
初始化

首先是对cpu的模拟:

struct {	unsigned short opcode;                  //操作码  unsigned char v[16];                      //v0-vf寄存器  unsigned short index;                    //index寄存器  unsigned short pc;                         //程序计数器  unsigned short sp;                         //栈顶指针} cpu;

以及4096字节大小的内存块,用数组即可:

unsigned char memory[4096] = { 0 };

chip-8的屏幕分辨率大小是64x32,所以:

unsigned char gfx[64 * 32] = { 0 };

chip-8还有两个计时器:

unsigned char delayTimer;unsigned char soundTimer;

以及栈:

unsigned short stack[16] = { 0 };                //注意chip-8的操作码大小为两个字节

关于按键状态我们也定义一个数组:

unsigned char key[16] = { 0 };                 //一共16个按键

然后就是字符集,chip-8用80字节大小存放字符集(0-F),每个字符占4像素宽,5像素高:

        unsigned char fontset[80] = {                0xF0, 0x90, 0x90, 0x90, 0xF0, // 0                0x20, 0x60, 0x20, 0x20, 0x70, // 1                0xF0, 0x10, 0xF0, 0x80, 0xF0, // 2                0xF0, 0x10, 0xF0, 0x10, 0xF0, // 3                0x90, 0x90, 0xF0, 0x10, 0x10, // 4                0xF0, 0x80, 0xF0, 0x10, 0xF0, // 5                0xF0, 0x80, 0xF0, 0x90, 0xF0, // 6                0xF0, 0x10, 0x20, 0x40, 0x40, // 7                0xF0, 0x90, 0xF0, 0x90, 0xF0, // 8                0xF0, 0x90, 0xF0, 0x10, 0xF0, // 9                0xF0, 0x90, 0xF0, 0x90, 0x90, // A                0xE0, 0x90, 0xE0, 0x90, 0xE0, // B                0xF0, 0x80, 0x80, 0x80, 0xF0, // C                0xE0, 0x90, 0x90, 0x90, 0xE0, // D                0xF0, 0x80, 0xF0, 0x80, 0xF0, // E                0xF0, 0x80, 0xF0, 0x80, 0x80  // F        };

比如字符0:

16进制  	2进制0xF0     		1111 0000      ####0x90    	  1001 0000      #    #0x90     		1001 0000      #    #0xF0     		1111 0000      ####

接下来,让我们对cpu进行初始化:

        cpu.pc = 0x200;          //chip-8程序从0x200位置开始        cpu.opcode = 0;        cpu.index = 0;        cpu.sp = 0;

我们的字符集要加载到内存里面,所以:

        for (int i = 0; i < 80; i++) {                memory[i] = fontset[i];        }

标签: #c11 结构体初始化