diff options
Diffstat (limited to 'emulator.c')
-rw-r--r-- | emulator.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/emulator.c b/emulator.c index 87b6e81..15c5e39 100644 --- a/emulator.c +++ b/emulator.c @@ -62,6 +62,20 @@ int emulator_load_rom(Emulator* emulator, char* rom_name) return 0; } +static void show_screen(Emulator* em) +{ + printf("SCREEN: \n"); + for(int x = 0; x < 64; ++x) + { + for(int y = 0; y < 32; ++y) + { + printf("%d ", em->display[x][y]); + } + printf("\n"); + } + printf("\n"); +} + int emulator_tick(Emulator* emulator) { uint16_t* pc = &emulator->pc; @@ -124,6 +138,31 @@ int emulator_tick(Emulator* emulator) break; case 0xD: dbgprintf("DRAW!\n"); + //show_screen(emulator); + int x = emulator->regs.V[X] % 64; + int y = emulator->regs.V[Y] % 32; + printf("DRAWING 0x%x AT (%d, %d)\n", emulator->regs.I, x, y); + + + emulator->regs.VF = 0; + + for(int row = 0; row < N; ++row) + { + uint8_t pixel = emulator->memory[emulator->regs.I + row]; + for(int xline = 0; xline < 8; xline++) + { + if((pixel & (0x80 >> xline)) != 0) + { + if(emulator->display[x][y] == 1) + { + emulator->regs.V[0xF] = 1; + } + emulator->display[x][y] ^= 1; + } + } + } + //show_screen(emulator); + emulator->draw_flag = 1; break; case 0xE: |