summaryrefslogtreecommitdiff
path: root/emu/6502.h
blob: 1af25bc9ef3661948477445165e50434c1b6eb63 (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
#ifndef CPU_6502_H
#define CPU_6502_H

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

typedef struct
{
	uint8_t A;
	uint8_t X;
	uint8_t Y;
	uint8_t SP;
	uint16_t PC;
	uint8_t PS;
	
	struct memory_t *memory;
	
	bool debug;
} cpu_6502_t;

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

enum {
	LDX_IMM = 0xA2,
	LDX_ZERO = 0xA6,
	LDY_IMM = 0xA0,
	LDY_ZERO = 0xA4,
	LDA_IMM = 0xA9,
	LDA_ZERO = 0xA5,
	JMP_ABS = 0x4C,
	JSR_ABS = 0x20,
	RTS_IMPL = 0x60,
	TXS_IMPL = 0x9A
};

void cpu_6502_init( cpu_6502_t *cpu, struct memory_t *memory );
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 );
void cpu_6502_print_state( cpu_6502_t *cpu, uint8_t opcode );
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 );
void cpu_6502_step( cpu_6502_t *cpu );

#endif