summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2019-09-26 19:39:15 -0400
committerAndrew Opalach <andrew@akon.city> 2019-09-26 19:39:15 -0400
commitca3946539a16f2f1175cd50531be564f0293060d (patch)
tree4139d0469008624fbde27098512beffca1022caa
parent96b8e8c586303a5658daf5881e18ef5a80c084c8 (diff)
downloadchip8-ca3946539a16f2f1175cd50531be564f0293060d.tar.gz
chip8-ca3946539a16f2f1175cd50531be564f0293060d.tar.bz2
chip8-ca3946539a16f2f1175cd50531be564f0293060d.zip
fix some of the 0xF instructions
-rw-r--r--chip8.c70
-rw-r--r--ui.c11
2 files changed, 39 insertions, 42 deletions
diff --git a/chip8.c b/chip8.c
index 6cb6a55..8d5c3a5 100644
--- a/chip8.c
+++ b/chip8.c
@@ -17,7 +17,7 @@
#include "util.h"
#include "chip8.h"
-#define ROM_FILE "roms/test_opcode.ch8"
+#define ROM_FILE "roms/breakout.ch8"
static void load_rom();
static void init_vm();
@@ -48,7 +48,7 @@ void load_rom() {
}
void vm_thread(void* v) {
- u8 buf[255];
+ u8 buf[0xFF];
while (1) {
// read 2 bytes and convert to big-endian
u16 in = htons(vm.rom[vm.PC + 0x1]<<8 | vm.rom[vm.PC]);
@@ -123,45 +123,47 @@ void vm_thread(void* v) {
vm.Vx[in>>8&0xF] ^= vm.Vx[in>>4&0xF];
break;
case 0x4: // ADD Vx, Vy
- vm.Vx[in>>8&0xF] += vm.Vx[in>>4&0xF];
- if (vm.Vx[in>>8&0xF] + vm.Vx[in>>4&0xF] > 255) {
- vm.Vx[15] = 1;
- vm.Vx[in>>8&0xF] &= 0xFF;
+ if ((vm.Vx[in>>8&0xF] + vm.Vx[in>>4&0xF]) > 0xFF) {
+ vm.Vx[0xF] = 1;
} else {
- vm.Vx[15] = 0;
+ vm.Vx[0xF] = 0;
}
+ vm.Vx[in>>8&0xF] += vm.Vx[in>>4&0xF];
+ vm.Vx[in>>8&0xF] &= 0xFF;
break;
case 0x5: // SUB Vx, Vy
if (vm.Vx[in>>8&0xF] > vm.Vx[in>>4&0xF]) {
- vm.Vx[15] = 1;
+ vm.Vx[0xF] = 1;
} else {
- vm.Vx[15] = 0;
+ vm.Vx[0xF] = 0;
}
vm.Vx[in>>8&0xF] -= vm.Vx[in>>4&0xF];
break;
case 0x6: // SHR Vx {, Vy}
if ((vm.Vx[in>>8&0xF] & 1) == 1) {
- vm.Vx[15] = 1;
+ vm.Vx[0xF] = 1;
+ printf("yeet\n");
} else {
- vm.Vx[15] = 0;
+ printf("unyeet\n");
+ vm.Vx[0xF] = 0;
}
vm.Vx[in>>8&0xF] /= 2;
break;
case 0x7: // SUBN Vx, Vy
if (vm.Vx[in>>8&0xF] < vm.Vx[in>>4&0xF]) {
- vm.Vx[15] = 1;
+ vm.Vx[0xF] = 1;
} else {
- vm.Vx[15] = 0;
+ vm.Vx[0xF] = 0;
}
vm.Vx[in>>8&0xF] = vm.Vx[in>>4&0xF] - vm.Vx[in>>8&0xF];
break;
case 0xE: // SHL Vx {, Vy}
if ((vm.Vx[in>>8&0xF] & 1) == 1) {
- vm.Vx[15] = 1;
+ vm.Vx[0xF] = 1;
} else {
- vm.Vx[15] = 0;
+ vm.Vx[0xF] = 0;
}
- vm.Vx[in>>8&0xF] *= 2;
+ vm.Vx[in>>8&0xF] *= 0x2;
break;
}
break;
@@ -174,12 +176,13 @@ void vm_thread(void* v) {
vm.I = in&0xFFF;
break;
case 0xB: // JP V0, addr
- vm.PC = ((in&0xFFF) + vm.Vx[0]) - 0x2;
+ vm.PC = ((in&0xFFF) + vm.Vx[0x0]) - 0x2;
break;
case 0xC: // RND Vx, byte
vm.Vx[in>>8&0xF] = (rand() % 255) & in&0xFF;
break;
case 0xD: // DRW Vx, Vy, nibble
+ vm.Vx[0xF] = 0;
memcpy(buf, &vm.rom[vm.I], in&0xF);
for (int i = 0; i < (in&0xF); i++) {
for (int s = 0; s < 8; s++) {
@@ -194,12 +197,14 @@ void vm_thread(void* v) {
if (vm.screen[x][y]) {
vm.screen[x][y] = 0;
+ vm.Vx[0xF] = 1;
} else {
vm.screen[x][y] = 1;
}
}
}
}
+ memset(buf, 0, 0xFF);
break;
case 0xE: switch (in&0xFF) {
case 0x9E: // SKP Vx
@@ -240,39 +245,32 @@ void vm_thread(void* v) {
vm.rom[vm.I+0x2] = (vm.Vx[in>>8&0xF] % 10);
break;
case 0x55: // LD [I], Vx
- for (int i = 0; i < (in>>8&0xF); i++) {
+ for (int i = 0; i <= (in>>8&0xF); i++) {
+ printf("%i\n", i);
vm.rom[(vm.I) + i] = vm.Vx[i];
}
break;
case 0x65: // LD Vx, [I]
- for (int i = 0; i < (in>>8&0xF); i++) {
- vm.Vx[i] = vm.rom[(vm.I) - i];
+ for (int i = 0; i <= (in>>8&0xF); i++) {
+ vm.Vx[i] = vm.rom[(vm.I) + i];
}
break;
}
break;
}
- vm.PC += 0x2;
- usleep(100);
- }
-}
-
-void *dt_thread(void* v) {
- while (1) {
- if (vm.DT > 0) {
+ while (vm.DT > 0) {
vm.DT--;
+ usleep(1000000/60);
}
- usleep(1000/60);
- }
-}
-void *st_thread(void* v) {
- while (1) {
- if (vm.ST > 0) {
+ // TODO: play sound
+ while(vm.ST > 0) {
vm.ST--;
+ usleep(1000000/60);
}
- usleep(1000/60);
+
+ vm.PC += 0x2;
}
}
@@ -285,8 +283,6 @@ int main(void) {
HANDLE vm = CreateThread(NULL, 0, vm_thread, NULL, 0, NULL);
#else
pthread_t vm; pthread_create(&vm, NULL, (void*)vm_thread, (void*)0);
- pthread_t dt; pthread_create(&dt, NULL, (void*)dt_thread, (void*)0);
- pthread_t st; pthread_create(&st, NULL, (void*)st_thread, (void*)0);
#endif
//vm_thread(0);
diff --git a/ui.c b/ui.c
index 13fd7d7..e6ee64a 100644
--- a/ui.c
+++ b/ui.c
@@ -17,6 +17,7 @@ void init_curses() {
}
void draw() {
+ erase();
for (int x = 0; x < 64; x++) {
for (int y = 0; y < 32; y++) {
if (vm.screen[x][y]) {
@@ -76,12 +77,12 @@ u8 ui_get_key(bool block) {
void curses_thread(void* v) {
u8 c;
while(1) {
- //erase();
draw();
- if ((c = ui_get_key(false)) <= 0xF) {
- vm.keyboard[c] = 1;
- }
- usleep(100);
+ c = getch();
+ //if ((c = ui_get_key(false)) <= 0xF) {
+ // vm.keyboard[c] = 1;
+ //}
+ usleep(10);
}
}