我编写了一个chip-8模拟器。无论我做什么,似乎我都无法在屏幕上显示任何像素。奇怪的是我已经检查了代码,已经上下2天了,而且确实似乎没有任何问题。它将.rom文件读入内存,并正确获取OP代码。
以下是源代码:
SDL_SetRenderDrawColor( renderer, 0, 0, 0, SDL_ALPHA_OPAQUE );
SDL_RenderClear(renderer);
uint32_t pixels[(WINDOW_WIDTH / 10) * (WINDOW_HEIGHT / 10)];
uint16_t i;
for(i = 0; i < 64*32; i++){
pixels[i] = (0x00FFFFFF * display[i]) | 0xFF000000;
}
//upload the pixels to the texture
SDL_UpdateTexture(tex,NULL,pixels, 64 * sizeof(uint32_t));
//Now get the texture to the screen
SDL_RenderCopy(renderer,tex,NULL,NULL);
SDL_RenderPresent(renderer); // Update screen
ch8.drawF = false;
uint16_t x = ch8->V[((ch8->opcode & 0x0F00) >> 8)];
uint16_t y = ch8->V[((ch8->opcode & 0x00F0) >> 4)];
uint8_t n = (ch8->opcode & 0x000F);
for(i = 0; i < n; i++) {
uint8_t pixel= memory[ch8->I.word + i];
for(j = 0; j < 8; j++) {
if((pixel & (0x80 >> j)) != 0){
if(display[x + j + ((y + i) * 64)] == 1) {
ch8->V[0xF] = 1;
}
display[x + j + ((y + i) * 64)] ^= 1;
}
}
}
答案 0 :(得分:0)
基本上,问题出在init()函数。我最初使用的是SDL_CreateWindow和SDL_CreateRenderer,但现在我正在使用SDL_CreateWindowAndRenderer,它指向SDL_Window和SDL_Renderer的指针而不是指向a的指针。 char和指向窗口的指针。
我修复了3个问题。 1.我正在向NNN操作码添加+ 0x200,因为我首先认为ROM中的NNN相对于0,所以我从每个XNNN操作码中删除了+ 0x200。我忘记了SDL_Texture * tex中的*它应该是SDL_Texture ** tex,我只是改变了本地指针也在poing的地址...... 2.操作码2NNN,而不是(ch8-> SP)= ch8-&gt;操作码&amp; 0x0FFF;其(ch8-> SP)= ch8-> PC.word; 3.操作码FX65其i&lt; =((ch8->操作码&amp; 0x0F00)&gt;&gt; 8)
基本上,SDL_CreateWindowAndRenderer和SDL_CreateWindow&amp; SDL_CreateRenderer之间的区别让我感到困惑,我应该首先查看文档。
现在我只需要让模拟器只重绘已更改的像素,然后让模拟器播放声音。