summaryrefslogtreecommitdiff
path: root/emu/6502.h
blob: 1880c906f9523ac87f8dcb4a91603aded56dae76 (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
#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;
} cpu_6502_t;

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

// 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( cpu_6502_t *cpu, int steps );
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_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 );

#endif