Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/alt/smp/algorithms.cpp
2 views
1
uint8 SMP::op_adc(uint8 x, uint8 y) {
2
int r = x + y + regs.p.c;
3
regs.p.n = r & 0x80;
4
regs.p.v = ~(x ^ y) & (x ^ r) & 0x80;
5
regs.p.h = (x ^ y ^ r) & 0x10;
6
regs.p.z = (uint8)r == 0;
7
regs.p.c = r > 0xff;
8
return r;
9
}
10
11
uint16 SMP::op_addw(uint16 x, uint16 y) {
12
uint16 r;
13
regs.p.c = 0;
14
r = op_adc(x, y);
15
r |= op_adc(x >> 8, y >> 8) << 8;
16
regs.p.z = r == 0;
17
return r;
18
}
19
20
uint8 SMP::op_and(uint8 x, uint8 y) {
21
x &= y;
22
regs.p.n = x & 0x80;
23
regs.p.z = x == 0;
24
return x;
25
}
26
27
uint8 SMP::op_cmp(uint8 x, uint8 y) {
28
int r = x - y;
29
regs.p.n = r & 0x80;
30
regs.p.z = (uint8)r == 0;
31
regs.p.c = r >= 0;
32
return x;
33
}
34
35
uint16 SMP::op_cmpw(uint16 x, uint16 y) {
36
int r = x - y;
37
regs.p.n = r & 0x8000;
38
regs.p.z = (uint16)r == 0;
39
regs.p.c = r >= 0;
40
return x;
41
}
42
43
uint8 SMP::op_eor(uint8 x, uint8 y) {
44
x ^= y;
45
regs.p.n = x & 0x80;
46
regs.p.z = x == 0;
47
return x;
48
}
49
50
uint8 SMP::op_or(uint8 x, uint8 y) {
51
x |= y;
52
regs.p.n = x & 0x80;
53
regs.p.z = x == 0;
54
return x;
55
}
56
57
uint8 SMP::op_sbc(uint8 x, uint8 y) {
58
int r = x - y - !regs.p.c;
59
regs.p.n = r & 0x80;
60
regs.p.v = (x ^ y) & (x ^ r) & 0x80;
61
regs.p.h = !((x ^ y ^ r) & 0x10);
62
regs.p.z = (uint8)r == 0;
63
regs.p.c = r >= 0;
64
return r;
65
}
66
67
uint16 SMP::op_subw(uint16 x, uint16 y) {
68
uint16 r;
69
regs.p.c = 1;
70
r = op_sbc(x, y);
71
r |= op_sbc(x >> 8, y >> 8) << 8;
72
regs.p.z = r == 0;
73
return r;
74
}
75
76
uint8 SMP::op_inc(uint8 x) {
77
x++;
78
regs.p.n = x & 0x80;
79
regs.p.z = x == 0;
80
return x;
81
}
82
83
uint8 SMP::op_dec(uint8 x) {
84
x--;
85
regs.p.n = x & 0x80;
86
regs.p.z = x == 0;
87
return x;
88
}
89
90
uint8 SMP::op_asl(uint8 x) {
91
regs.p.c = x & 0x80;
92
x <<= 1;
93
regs.p.n = x & 0x80;
94
regs.p.z = x == 0;
95
return x;
96
}
97
98
uint8 SMP::op_lsr(uint8 x) {
99
regs.p.c = x & 0x01;
100
x >>= 1;
101
regs.p.n = x & 0x80;
102
regs.p.z = x == 0;
103
return x;
104
}
105
106
uint8 SMP::op_rol(uint8 x) {
107
unsigned carry = (unsigned)regs.p.c;
108
regs.p.c = x & 0x80;
109
x = (x << 1) | carry;
110
regs.p.n = x & 0x80;
111
regs.p.z = x == 0;
112
return x;
113
}
114
115
uint8 SMP::op_ror(uint8 x) {
116
unsigned carry = (unsigned)regs.p.c << 7;
117
regs.p.c = x & 0x01;
118
x = carry | (x >> 1);
119
regs.p.n = x & 0x80;
120
regs.p.z = x == 0;
121
return x;
122
}
123
124