blob: cf95cbd3bfd0f73c6c822562233e91f1cfd787d3 (
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
|
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <assert.h>
struct CPU{
uint8_t register_a;
uint8_t status;
uint16_t pc;
};
struct CPU create_cpu(){
struct CPU cpu = {
.register_a = 0,
.status = 0,
.pc = 0
};
return cpu;
}
void interpret(struct CPU *cpu, uint8_t *program){
cpu->pc = 0;
while(1){
uint8_t opcode = program[cpu->pc];
cpu->pc += 1;
switch(opcode){
case 0x00:
return;
case 0xA9:
uint8_t param = program[cpu->pc];
cpu->pc += 1;
cpu->register_a = param;
if(cpu->register_a == 0)
cpu->status |= 0b00000010;
else
cpu->status &= 0b11111101;
if((cpu->register_a & 0b10000000) != 0)
cpu->status |= 0b10000000;
else
cpu->status &= 0b01111111;
default:
break;
}
}
return;
}
int main(){
printf("test_0xa9_lda_immediate_load_data: ");
struct CPU cpu_1 = create_cpu();
uint8_t program_1[] = {0xa9, 0x05, 0x00};
interpret(&cpu_1, program_1);
assert(cpu_1.register_a == 0x05);
assert((cpu_1.status & 0b00000010) == 0b00);
assert((cpu_1.status & 0b10000000) == 0);
printf("PASSED\n");
printf("test_0xa9_lda_zero_flag: ");
struct CPU cpu_2 = create_cpu();
uint8_t program_2[] = {0xa9, 0x00, 0x00};
interpret(&cpu_2, program_2);
assert((cpu_2.status & 0b00000010) == 0b00000010);
printf("PASSED\n");
}
|