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
|
// 6502.h
// Main elements of the 6502 CPU
#include"6502.h"
byte getFlag(byte flag) {
return ((P & flag) == flag) ? 1 : 0;
}
void setFlag(byte flag, int x) {
if (x == 1){
if ((P & flag) == 0x0) P += flag;
}else if (x == 0){
if ((P & flag) == flag) P -= flag;
}
else{
fprintf(stderr, "setFlag() passed arg neither 0 or 1");
}
}
void flagSet(byte flag){
P |= flag;
}
void flagClear(byte flag){
P &= ~flag;
}
// Functions which perform reusable routines for finding if a specific flag should be set.
void setFlagN(byte x){
if ((x & flag_N) == flag_N)
setFlag(flag_N, 1);
else
setFlag(flag_N, 0);
}
//Perform prior to any changes
void setFlagV(byte x, byte y){
if ((x & flag_N) == (y & flag_N)){
if (((x + y) & (flag_N ^ 0xFF)) > 0x7F) setFlag(flag_V, 1);
else setFlag(flag_V, 0);
}else{
if (((x - y) & (flag_N ^ 0xFF)) > 0x7F) setFlag(flag_V, 1);
else setFlag(flag_V, 0);
}
}
/*void setFlagB(){ //WORK ON
setFlag(flag_B, 1);
}*/
/*void setFlagD(){
setFlag(flag_D, 1);
}*/
/*void setFlagI(){ //WORK ON
setFlag(flag_Z, 1);
}*/
void setFlagZ(int x){
if (x == 0)
setFlag(flag_Z, 1);
else
setFlag(flag_Z, 0);
}
/*void setFlagC(){
setFlag(flag_Z, 1);
}*/
/*byte getMemory(address x){
return Memory[x];
}
void setMemory(address x, byte y){
Memory[x] = y;
}*/
byte getStack() {
return getMemory(0x01FF - S);
}
void setStack(byte z) {
setMemory(0x01FF - S, z);
}
|