From 975e8939d0c6dec105c10b8caa0b42e76e4d8feb Mon Sep 17 00:00:00 2001 From: Toni Date: Fri, 11 Jul 2025 14:48:48 +0200 Subject: [PATCH] implement more ops --- chip8.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/chip8.c b/chip8.c index ade09d2..8fc1783 100644 --- a/chip8.c +++ b/chip8.c @@ -59,6 +59,8 @@ void chip8_disassemble(CHIP8 *c, size_t ins_count) { for (size_t i = 0; i < ins_count; i++) { READ_INS(); + printf("0x%x: ", c->pc); + switch ((ins >> 12) & 0xF) { case 0x0: { switch (nnn) { @@ -73,7 +75,7 @@ void chip8_disassemble(CHIP8 *c, size_t ins_count) { } } break; case 0x1: { - printf("JP %u\n", nnn); + printf("JP 0x%x\n", nnn); } break; case 0x2: { printf("CALL %u\n", nnn); @@ -130,7 +132,7 @@ void chip8_disassemble(CHIP8 *c, size_t ins_count) { printf("SNE V%x, V%x\n", x, y); } break; case 0xA: { - printf("LD I, %u\n", nnn); + printf("LD I, 0x%x\n", nnn); } break; case 0xB: { printf("JP V0, %u\n", nnn); @@ -253,20 +255,26 @@ void chip8_execute(CHIP8 *c) { case 0x3: c->reg[x] ^= c->reg[y]; break; - case 0x4: - printf("TODO: ADD V%x, V%x\n", x, y); - break; + case 0x4: { + uint16_t res = (uint16_t)(c->reg[x]) + (uint16_t)c->reg[y]; + c->reg[0xF] = res > 0xFF; + c->reg[x] = (uint8_t)(res & 0xFF); + } break; case 0x5: - printf("TODO: SUB V%x, V%x\n", x, y); + c->reg[0xF] = c->reg[x] > c->reg[y]; + c->reg[x] -= c->reg[y]; break; case 0x6: - printf("TODO: SHR V%x\n", x); + c->reg[0xF] = c->reg[x] & 0x1; + c->reg[x] >>= 1; break; case 0x7: - printf("TODO: SUBN V%x, V%x\n", x, y); + c->reg[0xF] = c->reg[y] > c->reg[x]; + c->reg[x] = c->reg[y] - c->reg[x]; break; case 0xE: - printf("TODO: SHL V%x\n", x); + c->reg[0xF] = (c->reg[x] & 0b10000000) >> 7; + c->reg[x] <<= 1; break; default: BAD_INS(); @@ -319,7 +327,7 @@ void chip8_execute(CHIP8 *c) { c->I += c->reg[x]; break; case 0x29: - printf("TODO: LD F, V%x\n", x); + c->I = c->reg[x] * 5; break; case 0x33: c->memory[c->I] = c->reg[x] / 100; @@ -327,10 +335,14 @@ void chip8_execute(CHIP8 *c) { c->memory[c->I + 2] = c->reg[x] % 10; break; case 0x55: - printf("TODO: LD [I], V%x\n", x); + for (size_t i = 0; i <= x; i++) { + c->memory[c->I + i] = c->reg[i]; + } break; case 0x65: - printf("TODO: LD V%x, [I]\n", x); + for (size_t i = 0; i <= x; i++) { + c->reg[i] = c->memory[c->I + i]; + } break; default: BAD_INS(); @@ -361,6 +373,7 @@ int main(int argc, char *argv[]) { c.memory[0x200 + i] = buffer[i]; } + // chip8_disassemble(&c, n / 2); chip8_execute(&c); chip8_free(c);