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
|
#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;
int steps;
} 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, int steps );
void cpu_6502_step( 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 );
#endif
|