summaryrefslogtreecommitdiff
path: root/emu/6502.h
blob: c462fcc59679c0736a7728feb9bddbc5a4830a13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef CPU_6502_H
#define CPU_6502_H

#include <inttypes.h>
#include <stdbool.h>

#include "bus.h"

typedef struct
{
	uint8_t A;
	uint8_t X;
	uint8_t Y;
	uint8_t SP;
	uint16_t PC;
	uint8_t PS;
	
	bus_t *bus;
	
	int debug_flags;
	
	int steps;
	int cycles;
	
	int error_state;
} cpu_6502_t;

// debug flags
enum {
	DEBUG_STATUS    = 0x01,
	DEBUG_ZERO_PAGE = 0x02,
	DEBUG_STACK     = 0x04
};

// error state
enum {
	ERROR_STATE_OK             = 0x00,
	ERROR_STATE_ILLEGAL_OPCODE = 0x01
};

// processor state bits
enum {
	PS_N = 0x80,
	PS_V = 0x40,
	PS_B = 0x10,
	PS_D = 0x08,
	PS_I = 0x04,
	PS_Z = 0x02,
	PS_C = 0x01
};

// opcodes
enum {
	LDX_IMM  = 0xA2,
	LDX_ZERO = 0xA6,
	LDY_IMM  = 0xA0,
	LDY_ZERO = 0xA4,
	LDA_IMM  = 0xA9,
	LDA_ZERO = 0xA5,
	STX_ZERO = 0x86,
	STX_ABS  = 0x8E,
	DEX_IMPL = 0xCA,
	DEY_IMPL = 0x88,
	INY_IMPL = 0xC8,
	INC_ZERO = 0xE6,
	ROL_ACC  = 0x2A,
	BNE_REL  = 0xD0,
	BCC_REL  = 0x90,
	BCS_REL  = 0xB0,
	JMP_ABS  = 0x4C,
	JSR_ABS  = 0x20,
	RTS_IMPL = 0x60,
	TXS_IMPL = 0x9A,
	CPX_IMM  = 0xE0,
	SBC_IMM  = 0xE9,
	NOP_IMPL = 0xEA
};

enum {
	MAX_OPCODE_MNEMONIC_STRING_LENGTH = 20,
	MAX_MENMONIC_LENGTH = 5,
	NOF_OPCODES = 256
};

void cpu_6502_init( cpu_6502_t *cpu, bus_t *bus, bool initialize );
void cpu_6502_reset( cpu_6502_t *cpu );

uint8_t cpu_6502_read_byte( cpu_6502_t *cpu, uint16_t addr );
uint16_t cpu_6502_read_word( cpu_6502_t *cpu, uint16_t addr );
void cpu_6502_write_byte( cpu_6502_t *cpu, uint16_t addr, uint8_t data );
void cpu_6502_push_byte( cpu_6502_t *cpu, uint8_t data );
void cpu_6502_push_word( cpu_6502_t *cpu, uint16_t data );
uint8_t cpu_6502_pop_byte( cpu_6502_t *cpu );
uint16_t cpu_6502_pop_word( cpu_6502_t *cpu );

void cpu_6502_run_steps( cpu_6502_t *cpu, int steps );
void cpu_6502_run_cycles( cpu_6502_t *cpu, int cycles );
void cpu_6502_step( cpu_6502_t *cpu );

void cpu_6502_get_opcode_mnemonic( cpu_6502_t *cpu, char *buf, int buflen, uint16_t addr );
void cpu_6502_print_debug( cpu_6502_t *cpu );
void cpu_6502_print_state( cpu_6502_t *cpu, uint16_t addr );
void cpu_6502_print_memory( cpu_6502_t *cpu, uint16_t base, uint8_t size );
void cpu_6502_print_stack( cpu_6502_t *cpu );
void cpu_6502_print_zerop_page( cpu_6502_t *cpu );

bool cpu_6502_is_negative( cpu_6502_t *cpu );
bool cpu_6502_is_overflow( cpu_6502_t *cpu );
bool cpu_6502_is_brk( cpu_6502_t *cpu );
bool cpu_6502_is_decimal( cpu_6502_t *cpu );
bool cpu_6502_is_interrupt( cpu_6502_t *cpu );
bool cpu_6502_is_zero( cpu_6502_t *cpu );
bool cpu_6502_is_carry( cpu_6502_t *cpu );

#endif