summaryrefslogtreecommitdiff
path: root/CPU.h
blob: dbfd9edd2c46071085947169abfaeca1f7bcdbf1 (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
#ifndef _CPU
#define _CPU
#include <stdint.h>

#define CARRY              0b00000001
#define ZERO               0b00000010
#define INTERRUPT_DISABLE  0b00000100
#define DECIMAL_MODE       0b00001000
#define BREAK              0b00010000
#define BREAK2             0b00100000
#define OVERFLOW           0b01000000
#define NEGATIV            0b10000000

struct CPU{
	uint8_t register_a;
	uint8_t register_x;
	uint8_t register_y;
	uint8_t status;
	uint16_t pc;
	uint8_t sp; // stack pointer
	uint8_t memory[0xFFFF];
};

enum adressing_mode{
	Immediate = 1,
	ZeroPage,
	ZeroPage_X,
	ZeroPage_Y,
	Absolute,
	Absolute_X,
	Absolute_Y,
	Indirect_X,
	Indirect_Y,
	NoneAddressing,
};


uint8_t stack_pop(struct CPU *cpu);
void stack_push(struct CPU *cpu, uint8_t data);
void stack_push_u16(struct CPU *cpu, uint16_t data);
uint16_t stack_pop_u16(struct CPU *cpu);

struct CPU create_cpu();
uint8_t mem_read(struct CPU *cpu, uint16_t addr);
void mem_write(struct CPU *cpu, uint16_t addr, uint8_t data);
void load(struct CPU *cpu, uint8_t *program, int size_of_program);
void load_and_run(struct CPU *cpu, uint8_t *program, int size_of_program);
void reset_cpu(struct CPU *cpu);
void update_zero_and_negative_flags(struct CPU *cpu, uint8_t result);
void lda(struct CPU *cpu, enum adressing_mode mode);
void interpret(struct CPU *cpu);
uint16_t mem_read_u16(struct CPU *cpu, uint16_t pos);
uint16_t get_operand_address(struct CPU *cpu, enum adressing_mode mode);
void and(struct CPU *cpu, enum adressing_mode mode);
void enable_flag(struct CPU *cpu, uint8_t flag);
void disable_flag(struct CPU *cpu, uint8_t flag);
int test_flag(struct CPU *cpu, uint8_t flag);
void asl(struct CPU *cpu, enum adressing_mode mode);
void branch(struct CPU *cpu, bool cond);

void dec(struct CPU *cpu, enum adressing_mode mode);
void eor(struct CPU *cpu, enum adressing_mode mode);
void inc(struct CPU *cpu, enum adressing_mode mode);

void compare(struct CPU *cpu, enum adressing_mode mode, uint8_t comp_val);
void ldx(struct CPU *cpu, enum adressing_mode mode);
void ldy(struct CPU *cpu, enum adressing_mode mode);
void lsr(struct CPU *cpu, enum adressing_mode mode);
void ora(struct CPU *cpu, enum adressing_mode mode);
void rol(struct CPU *cpu, enum adressing_mode mode);
void ror(struct CPU *cpu, enum adressing_mode mode);
void adc(struct CPU *cpu, enum adressing_mode mode);
void stx(struct CPU *cpu, enum adressing_mode mode);
void sty(struct CPU *cpu, enum adressing_mode mode);
void bit(struct CPU *cpu, enum adressing_mode mode);

#endif