Add disassembler
diff --git a/cpu.h b/cpu.h
new file mode 100644
index 0000000..bbe6c60
--- /dev/null
+++ b/cpu.h
@@ -0,0 +1,117 @@
+#pragma once
+
+#include <stdint.h>
+
+enum // Registers
+{
+ A, X, Y, SR, SP
+};
+
+enum // Flags
+{
+ CARRY = 1 << 0,
+ ZERO = 1 << 1,
+ NO_INT = 1 << 2,
+ DECIMAL = 1 << 3,
+ BREAK = 1 << 4,
+ UNUSED = 1 << 5,
+ OVERFLW = 1 << 6,
+ NEGATIV = 1 << 7,
+};
+
+enum // Address Modes
+{
+ AM_ACC, // Accumulator implied as operand
+ AM_IMP, // Implied operand
+ AM_IMM, // Immediate operand (8 bit)
+ AM_ABS, // Absolute operand (16 bit)
+ AM_ZP, // Zero-page operand
+ AM_REL, // Relative operand (signed 8 bit)
+ AM_IND, // Absolute indirect operand (16 bit address of 16 bit address)
+ AM_AX, // Absolute indexed with X
+ AM_AY, // Absolute indexed with Y
+ AM_ZPX, // Zero-page indexed with X
+ AM_ZPY, // Zero-page indexed with Y
+ AM_ZIX, // Zero-page indexed indirect (zp,x)
+ AM_ZIY, // Zero-page indirect indexed (zp),y
+};
+
+enum // Opcodes
+{
+ LDA,
+ LDX,
+ LDY,
+ STA,
+ STX,
+ STY,
+ ADC,
+ SBC,
+ INC,
+ INX,
+ INY,
+ DEC,
+ DEX,
+ DEY,
+ ASL,
+ LSR,
+ ROL,
+ ROR,
+ AND,
+ ORA,
+ EOR,
+ CMP,
+ CPX,
+ CPY,
+ BIT,
+ BCC,
+ BCS,
+ BNE,
+ BEQ,
+ BPL,
+ BMI,
+ BVC,
+ BVS,
+ TAX,
+ TXA,
+ TAY,
+ TYA,
+ TSX,
+ TXS,
+ PHA,
+ PLA,
+ PHP,
+ PLP,
+ JMP,
+ JSR,
+ RTS,
+ RTI,
+ CLC,
+ SEC,
+ CLD,
+ SED,
+ CLI,
+ SEI,
+ CLV,
+ BRK,
+ NOP,
+};
+
+// Emulator instance, create with new_cpu()
+typedef struct
+{
+ uint8_t regs[5]; // A, X, Y, SP and SR registers
+ uint16_t pc;
+ uint8_t *mem;
+} cpu_t;
+
+// Argument type, includes both pointer and its value
+typedef struct
+{
+ uint16_t val; // Value at pointer (used by most instructions)
+ uint16_t ptr; // Pointer (used by jumps, etc)
+} arg_t;
+
+cpu_t new_cpu();
+void free_cpu(cpu_t *cpu);
+void die(const char *message);
+void disas(cpu_t *cpu);