diff options
author | dweller <dweller@cabin.digital> | 2025-03-26 20:37:01 +0200 |
---|---|---|
committer | dweller <dweller@cabin.digital> | 2025-03-26 20:37:01 +0200 |
commit | 750cd23d7afac165502defa1d259ace00ca0e414 (patch) | |
tree | ff28a5649a4ba2b19a93c924536634106b65816e /sources/chip8.c | |
parent | 202712187e6ea7ce39dafad744c1e729e5279db6 (diff) |
clean up chip-8 into its own file
Diffstat (limited to '')
-rw-r--r-- | sources/chip8.c (renamed from sources/instr.c) | 108 |
1 files changed, 105 insertions, 3 deletions
diff --git a/sources/instr.c b/sources/chip8.c index 72511f1..f5a28a8 100644 --- a/sources/instr.c +++ b/sources/chip8.c @@ -1,3 +1,64 @@ +#define C8_RESET_VECTOR 0x200 +#define C8_CYCLES_PER_FRAME 1000 + +static const u8 fnt[] = +{ + 0xF0, 0x90, 0x90, 0x90, 0xF0, /* 0 */ + 0x20, 0x60, 0x20, 0x20, 0x70, /* 1 */ + 0xF0, 0x10, 0xF0, 0x80, 0xF0, /* 2 */ + 0xF0, 0x10, 0xF0, 0x10, 0xF0, /* 3 */ + 0x90, 0x90, 0xF0, 0x10, 0x10, /* 4 */ + 0xF0, 0x80, 0xF0, 0x10, 0xF0, /* 5 */ + 0xF0, 0x80, 0xF0, 0x90, 0xF0, /* 6 */ + 0xF0, 0x10, 0x20, 0x40, 0x40, /* 7 */ + 0xF0, 0x90, 0xF0, 0x90, 0xF0, /* 8 */ + 0xF0, 0x90, 0xF0, 0x10, 0xF0, /* 9 */ + 0xF0, 0x90, 0xF0, 0x90, 0x90, /* A */ + 0xE0, 0x90, 0xE0, 0x90, 0xE0, /* B */ + 0xF0, 0x80, 0x80, 0x80, 0xF0, /* C */ + 0xE0, 0x90, 0x90, 0x90, 0xE0, /* D */ + 0xF0, 0x80, 0xF0, 0x80, 0xF0, /* E */ + 0xF0, 0x80, 0xF0, 0x80, 0x80 /* F */ +}; + + +typedef struct +{ + u16 pc; + u8 sp; + + u16 i; + u16 keys; + + u64 cycles; + + /* timers: */ + u8 dt; /* - delay */ + u8 st; /* - sound */ + + bool running; + + union + { + struct + { + u8 v[16]; + u64 disp[32]; + u8 font[sizeof(fnt)]; + u16 stack[16]; + + } sys; + u8 ram[4*KB]; + } mem; + +} chip8; + +#define V mem.sys.v +#define STACK mem.sys.stack +#define DISPLAY mem.sys.disp +#define FONT mem.sys.font +#define RAM mem.ram + typedef enum { C8_ILL, @@ -44,6 +105,46 @@ typedef enum } chip8_op; +void c8_reset(chip8* c8) +{ + assert(c8); + assert(sizeof(c8->mem) > sizeof(fnt)); + assert(sizeof(c8->mem) >= 4*KB); + + memcpy(c8->FONT, fnt, sizeof(fnt)); + + c8->pc = C8_RESET_VECTOR; + c8->running = true; +} + +void c8_dump_state(chip8* c8, bool stack) +{ + int i = 0; + + for(i = 0; i < (int)sizeof(c8->V); i += 4) + { + printf(" V%x: %02X (%3d) ", i+0, c8->V[i+0], c8->V[i+0]); + printf("V%x: %02X (%3d) ", i+1, c8->V[i+1], c8->V[i+1]); + printf("V%x: %02X (%3d) ", i+2, c8->V[i+2], c8->V[i+2]); + printf("V%x: %02X (%3d)\n", i+3, c8->V[i+3], c8->V[i+3]); + } + + printf(" I:%04X SP: %02X DT: %02X ST: %02X CYCLES: %llu\n", + c8->i, c8->sp, c8->dt, c8->st, c8->cycles); + + if(stack) + { + printf("stack:\n"); + for(i = 0; i < (int)sizeof(c8->STACK); i += 2) + { + printf(" %-2d: %04X ", i+0, c8->STACK[i+0]); + printf("%-2d: %04X\n", i+1, c8->STACK[i+1]); + } + } +} + + + #define c8_decode_generate(name) \ void c8_##name(u8* code, u16 offset, void* usrdat) \ { \ @@ -68,6 +169,8 @@ void c8_##name(u8* code, u16 offset, void* usrdat) \ (void)n; \ (void)kk; \ \ + X_C8_PRELUDE; \ + \ if(o == 0 && nnn == 0x0E0) X_C8_CLS; \ else if(o == 0 && nnn == 0x0EE) X_C8_RET; \ else if(o == 0) X_C8_SYS; \ @@ -104,7 +207,6 @@ void c8_##name(u8* code, u16 offset, void* usrdat) \ else if(o == 9 && n == 0) X_C8_SNE; \ else if(o == 0xD) X_C8_DRW; \ else X_C8_ILL; \ + \ + X_C8_EPILOGUE; \ } - -#include "meta/disasm.c" -#include "meta/exec.c" |