#pragma once #define VCPU_FREQ 600 #define DTST_FREQ 60 #define SCREEN_FREQ 60 #define REG_FLAG 0xF typedef struct VCPU_State { // Program Counter (16 bits but only 12 bits used (4096 memory addresses)) unsigned short PC; // Index register (16 bits but only 12 bits used (4096 memory addresses)) unsigned short I; // Stack register (16 bits) unsigned short S; unsigned short stack[100]; // Emulated stack // General purpose registers (8 bits each) // Note last one often used as a flag register unsigned char V[16]; // Delay timer (8 bits) unsigned char DT; // Sound timer (8 bits) unsigned char ST; // Intruction (opcode + decoded fields) unsigned short opcode; unsigned char X; unsigned char Y; unsigned char N; unsigned char NN; unsigned short NNN; // Keypressed int keypressed; // Not 0 if a key was pressed unsigned char key; // Count VCPU ticks int dt_ticks; int st_ticks; int screen_ticks; } VCPU_State; void VCPUInit(); void VCPUFetch(); void VCPUDecode(); void VCPUExecute(); void VCPUTick(); void VCPUDoubleDabble(unsigned char x, unsigned char *u, unsigned char *t, unsigned char *h); void VCPUDump();