Path: blob/master/libsnes/bsnes/snes/alt/smp/algorithms.cpp
2 views
uint8 SMP::op_adc(uint8 x, uint8 y) {1int r = x + y + regs.p.c;2regs.p.n = r & 0x80;3regs.p.v = ~(x ^ y) & (x ^ r) & 0x80;4regs.p.h = (x ^ y ^ r) & 0x10;5regs.p.z = (uint8)r == 0;6regs.p.c = r > 0xff;7return r;8}910uint16 SMP::op_addw(uint16 x, uint16 y) {11uint16 r;12regs.p.c = 0;13r = op_adc(x, y);14r |= op_adc(x >> 8, y >> 8) << 8;15regs.p.z = r == 0;16return r;17}1819uint8 SMP::op_and(uint8 x, uint8 y) {20x &= y;21regs.p.n = x & 0x80;22regs.p.z = x == 0;23return x;24}2526uint8 SMP::op_cmp(uint8 x, uint8 y) {27int r = x - y;28regs.p.n = r & 0x80;29regs.p.z = (uint8)r == 0;30regs.p.c = r >= 0;31return x;32}3334uint16 SMP::op_cmpw(uint16 x, uint16 y) {35int r = x - y;36regs.p.n = r & 0x8000;37regs.p.z = (uint16)r == 0;38regs.p.c = r >= 0;39return x;40}4142uint8 SMP::op_eor(uint8 x, uint8 y) {43x ^= y;44regs.p.n = x & 0x80;45regs.p.z = x == 0;46return x;47}4849uint8 SMP::op_or(uint8 x, uint8 y) {50x |= y;51regs.p.n = x & 0x80;52regs.p.z = x == 0;53return x;54}5556uint8 SMP::op_sbc(uint8 x, uint8 y) {57int r = x - y - !regs.p.c;58regs.p.n = r & 0x80;59regs.p.v = (x ^ y) & (x ^ r) & 0x80;60regs.p.h = !((x ^ y ^ r) & 0x10);61regs.p.z = (uint8)r == 0;62regs.p.c = r >= 0;63return r;64}6566uint16 SMP::op_subw(uint16 x, uint16 y) {67uint16 r;68regs.p.c = 1;69r = op_sbc(x, y);70r |= op_sbc(x >> 8, y >> 8) << 8;71regs.p.z = r == 0;72return r;73}7475uint8 SMP::op_inc(uint8 x) {76x++;77regs.p.n = x & 0x80;78regs.p.z = x == 0;79return x;80}8182uint8 SMP::op_dec(uint8 x) {83x--;84regs.p.n = x & 0x80;85regs.p.z = x == 0;86return x;87}8889uint8 SMP::op_asl(uint8 x) {90regs.p.c = x & 0x80;91x <<= 1;92regs.p.n = x & 0x80;93regs.p.z = x == 0;94return x;95}9697uint8 SMP::op_lsr(uint8 x) {98regs.p.c = x & 0x01;99x >>= 1;100regs.p.n = x & 0x80;101regs.p.z = x == 0;102return x;103}104105uint8 SMP::op_rol(uint8 x) {106unsigned carry = (unsigned)regs.p.c;107regs.p.c = x & 0x80;108x = (x << 1) | carry;109regs.p.n = x & 0x80;110regs.p.z = x == 0;111return x;112}113114uint8 SMP::op_ror(uint8 x) {115unsigned carry = (unsigned)regs.p.c << 7;116regs.p.c = x & 0x01;117x = carry | (x >> 1);118regs.p.n = x & 0x80;119regs.p.z = x == 0;120return x;121}122123124