about summary refs log tree commit diff
path: root/emulator.c
diff options
context:
space:
mode:
authorManuel Palenzuela <manuelpalenzuelamerino@gmail.com>2021-07-19 23:43:08 +0100
committerManuel Palenzuela <manuelpalenzuelamerino@gmail.com>2021-07-19 23:43:08 +0100
commitfd3aac5d52d468be2e971fcaf00882d9ef6a89fd (patch)
tree4847a7302105b5f2e0d2bf703507936e7da55d1c /emulator.c
parentDebug: Added draw debug prints (diff)
downloadCHIP8-Emulator-fd3aac5d52d468be2e971fcaf00882d9ef6a89fd.tar.gz
CHIP8-Emulator-fd3aac5d52d468be2e971fcaf00882d9ef6a89fd.tar.bz2
CHIP8-Emulator-fd3aac5d52d468be2e971fcaf00882d9ef6a89fd.zip
Feature: Added draw instruction implementation
Diffstat (limited to 'emulator.c')
-rw-r--r--emulator.c40
1 files changed, 10 insertions, 30 deletions
diff --git a/emulator.c b/emulator.c
index 15c5e39..082cbfb 100644
--- a/emulator.c
+++ b/emulator.c
@@ -62,20 +62,6 @@ 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;
@@ -138,30 +124,24 @@ 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;
-                                    }
-                                }
+                uint8_t pixels = emulator->memory[emulator->regs.I + row];
+                for(int offset = 0; offset < 8; ++offset)
+                {
+                    if((pixels & (0x80 >> offset)) != 0)
+                    {
+                        if(emulator->display[x + offset][y + row] == 1)
+                          emulator->regs.V[0xF] = 1;
+                        emulator->display[x + offset][y + row] ^= 1;
+                    }
+                }
             }
-            //show_screen(emulator);
 
             emulator->draw_flag = 1;
             break;