Проблемы рендеринга SDL в CHIP-8

Я запрограммировал эмулятор чипа-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;
                        }
                    }
                }

1 ответ

В общем, проблема заключалась в функции init(). Сначала я использовал SDL_CreateWindow и SDL_CreateRenderer, но теперь я использую SDL_CreateWindowAndRenderer, в котором вместо указателя на char и указателя на char и указателя на SDL_Renderer используются указатели. окно.

Также было 3 проблемы, которые я исправил. 1. Я добавлял + 0x200 к кодам операций NNN, потому что сначала я думал, что NNN в ПЗУ относительно 0, поэтому я удалил + 0x200 из каждого кода операции XNNN. Также я забыл * при SDL_Texture* tex, он должен быть SDL_Texture** tex, я просто менял адрес, на который указывал локальный указатель... 2. в опкоде 2NNN вместо (ch8->SP) = ch8-> опкод & 0x0FFF; its (ch8->SP) = ch8-> PC.word; 3. в опкоде FX65 его i <= ((ch8-> опкод & 0x0F00) >> 8)

По сути, различия между SDL_CreateWindowAndRenderer и SDL_CreateWindow&SDL_CreateRenderer меня смутили, сначала я должен был проверить документацию.

Теперь мне нужно только заставить эмулятор перерисовывать только измененные пиксели, а затем заставить эмулятор воспроизводить звук.

Другие вопросы по тегам