v6502
The MOS 6502 Virtual Machine and Toolchain Infrastructure
Data Structures | Enumerations | Functions
cpu.h File Reference

Virtual CPU. More...

#include <stdint.h>
#include <v6502/mem.h>

Go to the source code of this file.

Data Structures

struct  v6502_cpu
 Virtual CPU Object. More...
 

Enumerations

enum  v6502_opcode {
  v6502_opcode_brk = 0x00, v6502_opcode_nop = 0xEA, v6502_opcode_clc = 0x18, v6502_opcode_cld = 0xD8,
  v6502_opcode_cli = 0x58, v6502_opcode_clv = 0xB8, v6502_opcode_sec = 0x38, v6502_opcode_sed = 0xF8,
  v6502_opcode_sei = 0x78, v6502_opcode_dex = 0xCA, v6502_opcode_dey = 0x88, v6502_opcode_tax = 0xAA,
  v6502_opcode_tay = 0xA8, v6502_opcode_tsx = 0xBA, v6502_opcode_txa = 0x8A, v6502_opcode_txs = 0x9A,
  v6502_opcode_tya = 0x98, v6502_opcode_inx = 0xE8, v6502_opcode_iny = 0xC8, v6502_opcode_jsr = 0x20,
  v6502_opcode_rti = 0x40, v6502_opcode_rts = 0x60, v6502_opcode_pha = 0x48, v6502_opcode_php = 0x08,
  v6502_opcode_pla = 0x68, v6502_opcode_plp = 0x28, v6502_opcode_bcc = 0x90, v6502_opcode_bcs = 0xB0,
  v6502_opcode_beq = 0xF0, v6502_opcode_bne = 0xD0, v6502_opcode_bmi = 0x30, v6502_opcode_bpl = 0x10,
  v6502_opcode_bvc = 0x50, v6502_opcode_bvs = 0x70, v6502_opcode_adc_imm = 0x69, v6502_opcode_adc_zpg = 0x65,
  v6502_opcode_adc_zpgx = 0x75, v6502_opcode_adc_abs = 0x6D, v6502_opcode_adc_absx = 0x7D, v6502_opcode_adc_absy = 0x79,
  v6502_opcode_adc_indx = 0x61, v6502_opcode_adc_indy = 0x71, v6502_opcode_and_imm = 0x29, v6502_opcode_and_zpg = 0x25,
  v6502_opcode_and_zpgx = 0x35, v6502_opcode_and_abs = 0x2D, v6502_opcode_and_absx = 0x3D, v6502_opcode_and_absy = 0x39,
  v6502_opcode_and_indx = 0x21, v6502_opcode_and_indy = 0x31, v6502_opcode_asl_acc = 0x0A, v6502_opcode_asl_zpg = 0x06,
  v6502_opcode_asl_zpgx = 0x16, v6502_opcode_asl_abs = 0x0E, v6502_opcode_asl_absx = 0x1E, v6502_opcode_bit_zpg = 0x24,
  v6502_opcode_bit_abs = 0x2C, v6502_opcode_cmp_imm = 0xC9, v6502_opcode_cmp_zpg = 0xC5, v6502_opcode_cmp_zpgx = 0xD5,
  v6502_opcode_cmp_abs = 0xCD, v6502_opcode_cmp_absx = 0xDD, v6502_opcode_cmp_absy = 0xD9, v6502_opcode_cmp_indx = 0xC1,
  v6502_opcode_cmp_indy = 0xD1, v6502_opcode_cpx_imm = 0xE0, v6502_opcode_cpx_zpg = 0xE4, v6502_opcode_cpx_abs = 0xEC,
  v6502_opcode_cpy_imm = 0xC0, v6502_opcode_cpy_zpg = 0xC4, v6502_opcode_cpy_abs = 0xCC, v6502_opcode_dec_zpg = 0xC6,
  v6502_opcode_dec_zpgx = 0xD6, v6502_opcode_dec_abs = 0xCE, v6502_opcode_dec_absx = 0xDE, v6502_opcode_eor_imm = 0x49,
  v6502_opcode_eor_zpg = 0x45, v6502_opcode_eor_zpgx = 0x55, v6502_opcode_eor_abs = 0x4D, v6502_opcode_eor_absx = 0x5D,
  v6502_opcode_eor_absy = 0x59, v6502_opcode_eor_indx = 0x41, v6502_opcode_eor_indy = 0x51, v6502_opcode_inc_zpg = 0xE6,
  v6502_opcode_inc_zpgx = 0xF6, v6502_opcode_inc_abs = 0xEE, v6502_opcode_inc_absx = 0xFE, v6502_opcode_jmp_abs = 0x4C,
  v6502_opcode_jmp_ind = 0x6C, v6502_opcode_ora_imm = 0x09, v6502_opcode_ora_zpg = 0x05, v6502_opcode_ora_zpgx = 0x15,
  v6502_opcode_ora_abs = 0x0D, v6502_opcode_ora_absx = 0x1D, v6502_opcode_ora_absy = 0x19, v6502_opcode_ora_indx = 0x01,
  v6502_opcode_ora_indy = 0x11, v6502_opcode_lda_imm = 0xA9, v6502_opcode_lda_zpg = 0xA5, v6502_opcode_lda_zpgx = 0xB5,
  v6502_opcode_lda_abs = 0xAD, v6502_opcode_lda_absx = 0xBD, v6502_opcode_lda_absy = 0xB9, v6502_opcode_lda_indx = 0xA1,
  v6502_opcode_lda_indy = 0xB1, v6502_opcode_ldx_imm = 0xA2, v6502_opcode_ldx_zpg = 0xA6, v6502_opcode_ldx_zpgy = 0xB6,
  v6502_opcode_ldx_abs = 0xAE, v6502_opcode_ldx_absy = 0xBE, v6502_opcode_ldy_imm = 0xA0, v6502_opcode_ldy_zpg = 0xA4,
  v6502_opcode_ldy_zpgx = 0xB4, v6502_opcode_ldy_abs = 0xAC, v6502_opcode_ldy_absx = 0xBC, v6502_opcode_lsr_acc = 0x4A,
  v6502_opcode_lsr_zpg = 0x46, v6502_opcode_lsr_zpgx = 0x56, v6502_opcode_lsr_abs = 0x4E, v6502_opcode_lsr_absx = 0x5E,
  v6502_opcode_rol_acc = 0x2A, v6502_opcode_rol_zpg = 0x26, v6502_opcode_rol_zpgx = 0x36, v6502_opcode_rol_abs = 0x2E,
  v6502_opcode_rol_absx = 0x3E, v6502_opcode_ror_acc = 0x6A, v6502_opcode_ror_zpg = 0x66, v6502_opcode_ror_zpgx = 0x76,
  v6502_opcode_ror_abs = 0x6E, v6502_opcode_ror_absx = 0x7E, v6502_opcode_sbc_imm = 0xE9, v6502_opcode_sbc_zpg = 0xE5,
  v6502_opcode_sbc_zpgx = 0xF5, v6502_opcode_sbc_abs = 0xED, v6502_opcode_sbc_absx = 0xFD, v6502_opcode_sbc_absy = 0xF9,
  v6502_opcode_sbc_indx = 0xE1, v6502_opcode_sbc_indy = 0xF1, v6502_opcode_sta_zpg = 0x85, v6502_opcode_sta_zpgx = 0x95,
  v6502_opcode_sta_abs = 0x8D, v6502_opcode_sta_absx = 0x9D, v6502_opcode_sta_absy = 0x99, v6502_opcode_sta_indx = 0x81,
  v6502_opcode_sta_indy = 0x91, v6502_opcode_stx_zpg = 0x86, v6502_opcode_stx_zpgy = 0x96, v6502_opcode_stx_abs = 0x8E,
  v6502_opcode_sty_zpg = 0x84, v6502_opcode_sty_zpgx = 0x94, v6502_opcode_sty_abs = 0x8C, v6502_opcode_wai = 0xCB
}
 Instruction Set.
 
enum  v6502_cpu_status {
  v6502_cpu_status_carry = 1 << 0, v6502_cpu_status_zero = 1 << 1, v6502_cpu_status_interrupt = 1 << 2, v6502_cpu_status_decimal = 1 << 3,
  v6502_cpu_status_break = 1 << 4, v6502_cpu_status_ignored = 1 << 5, v6502_cpu_status_overflow = 1 << 6, v6502_cpu_status_negative = 1 << 7
}
 Status Register Flags.
 
enum  v6502_address_mode {
  v6502_address_mode_symbol = -2, v6502_address_mode_unknown = -1, v6502_address_mode_implied = 0, v6502_address_mode_accumulator = 1,
  v6502_address_mode_immediate = 2, v6502_address_mode_absolute = 3, v6502_address_mode_absolute_x = 4, v6502_address_mode_absolute_y = 5,
  v6502_address_mode_indirect = 6, v6502_address_mode_indirect_x = 7, v6502_address_mode_indirect_y = 8, v6502_address_mode_relative = 9,
  v6502_address_mode_zeropage = 10, v6502_address_mode_zeropage_x = 11, v6502_address_mode_zeropage_y = 12
}
 Address Modes.
 

Functions

v6502_cpuv6502_createCPU (void)
 Create a v6502_cpu.
 
void v6502_destroyCPU (v6502_cpu *cpu)
 Destroy a v6502_cpu.
 
int v6502_instructionLengthForOpcode (v6502_opcode opcode)
 Return the byte-length of an instruction based on the opcode (See: Karnaugh Map Analysis)
 
v6502_address_mode v6502_addressModeForOpcode (v6502_opcode opcode)
 Return the v6502_address_mode of an instruction based on the opcode (See: Karnaugh Map Analysis)
 
void v6502_execute (v6502_cpu *cpu, uint8_t opcode, uint8_t low, uint8_t high)
 Execute an instruction on a v6502_cpu. More...
 
void v6502_step (v6502_cpu *cpu)
 Single step a v6502_cpu.
 
void v6502_reset (v6502_cpu *cpu)
 Hardware reset a v6502_cpu.
 
void v6502_nmi (v6502_cpu *cpu)
 Send an NMI to a v6502_cpu.
 

Detailed Description

Virtual CPU.