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
|