#ifndef __CPU_H__ #define __CPU_H__ #include #include #include #include "mapper.h" typedef struct cpu6502_t cpu6502_t; typedef struct opcode_t { int inst; int addr_mode; int size; int cycles; /* DEBUG */ char* inst_name; } opcode_t; /* Addressing modes */ #define ADDRMODE_ZP 0 #define ADDRMODE_REL 1 #define ADDRMODE_IMP 2 #define ADDRMODE_ABS 3 #define ADDRMODE_ACC 4 #define ADDRMODE_IMM 5 #define ADDRMODE_ZPX 6 #define ADDRMODE_ZPY 7 #define ADDRMODE_ABSX 8 #define ADDRMODE_ABSY 9 #define ADDRMODE_PREIDXIND 10 #define ADDRMODE_POSTIDXIND 11 #define ADDRMODE_INDABS 12 /* Processor status flags */ #define FLAG_CARRY 1 #define FLAG_ZERO 2 #define FLAG_INTERRUPT 4 #define FLAG_DECIMAL 8 #define FLAG_BREAK 16 #define FLAG_UNUSED 32 #define FLAG_OVERFLOW 64 #define FLAG_NEGATIVE 128 /* IRQs */ #define IRQ_NORMAL 0 #define IRQ_NMI 1 #define IRQ_RESET 2 /* cpu_init * Initializes the cpu6502_t struct. * [in/out] cpu6502_t** cpu - The return pointer. Expects NULL. */ void cpu_init(cpu6502_t** cpu); /* cpu_kill * Kills the cpu6502_t struct. * [in] cpu6502_t* cpu - The emulated cpu. */ void cpu_kill(cpu6502_t* cpu); /* cpu_reset * Resets the cpu. * [in] cpu6502_t* cpu - The emulated cpu. */ void cpu_reset(cpu6502_t* cpu); /* cpu_set_mapper * Gives a memory mapper to the cpu. * [in] cpu6502_t* cpu - The emulated cpu. * [in] mapper_t* mapper - The mapper to use. */ void cpu_set_mapper(cpu6502_t* cpu, mapper_t* mapper); /* cpu_request_irq * Requests an IRQ. * [in] cpu6502_t* cpu - The emulated cpu. * [in] int type - The IRQ type. */ void cpu_request_irq(cpu6502_t* cpu, int type); /* cpu_emulate * Emulates a single instruction. * [in] cpu6502_t* cpu - The emulated cpu. * Returns: Number of cycles. */ int cpu_emulate(cpu6502_t* cpu); /* cpu_dump_instructionlist * Dumps the instructionlist to stdout. * [in] cpu6502_t* cpu - The emulated cpu. */ void cpu_dump_instructiontable(cpu6502_t* cpu); /* cpu_get_pc * Gets the program counter. * [in] cpu6502_t* cpu - The emulated cpu. * Returns: The program counter. */ int cpu_get_pc(cpu6502_t* cpu); /* cpu_get_a * Gets the accumulator. * [in] cpu6502_t* cpu - The emulated cpu. * Returns: The accumulator. */ int cpu_get_a(cpu6502_t* cpu); /* cpu_get_x * Gets the x register. * [in] cpu6502_t* cpu - The emulated cpu. * Returns: The x register. */ int cpu_get_x(cpu6502_t* cpu); /* cpu_get_y * Gets the y register. * [in] cpu6502_t* cpu - The emulated cpu. * Returns: The y register. */ int cpu_get_y(cpu6502_t* cpu); /* cpu_get_op * Translates a hex into an opcode_t struct. * [in] cpu6502_t* cpu - The emulated cpu. * [in] int hex - The hex to translate. * Returns: The correct opcode. */ opcode_t cpu_get_op(cpu6502_t* cpu, int hex); #endif