1 /*
2 
3 						Extracted from original single fake6502.c file
4 
5 */
6 
7 #define saveaccum(n) a = (uint8_t)((n) & 0x00FF)
8 
9 
10 //flag modifier macros
11 #define setcarry() status |= FLAG_CARRY
12 #define clearcarry() status &= (~FLAG_CARRY)
13 #define setzero() status |= FLAG_ZERO
14 #define clearzero() status &= (~FLAG_ZERO)
15 #define setinterrupt() status |= FLAG_INTERRUPT
16 #define clearinterrupt() status &= (~FLAG_INTERRUPT)
17 #define setdecimal() status |= FLAG_DECIMAL
18 #define cleardecimal() status &= (~FLAG_DECIMAL)
19 #define setoverflow() status |= FLAG_OVERFLOW
20 #define clearoverflow() status &= (~FLAG_OVERFLOW)
21 #define setsign() status |= FLAG_SIGN
22 #define clearsign() status &= (~FLAG_SIGN)
23 
24 
25 //flag calculation macros
26 #define zerocalc(n) {\
27     if ((n) & 0x00FF) clearzero();\
28         else setzero();\
29 }
30 
31 #define signcalc(n) {\
32     if ((n) & 0x0080) setsign();\
33         else clearsign();\
34 }
35 
36 #define carrycalc(n) {\
37     if ((n) & 0xFF00) setcarry();\
38         else clearcarry();\
39 }
40 
41 #define overflowcalc(n, m, o) { /* n = result, m = accumulator, o = memory */ \
42     if (((n) ^ (uint16_t)(m)) & ((n) ^ (o)) & 0x0080) setoverflow();\
43         else clearoverflow();\
44 }
45 
46 //a few general functions used by various other functions
push16(uint16_t pushval)47 void push16(uint16_t pushval) {
48     write6502(BASE_STACK + sp, (pushval >> 8) & 0xFF);
49     write6502(BASE_STACK + ((sp - 1) & 0xFF), pushval & 0xFF);
50     sp -= 2;
51 }
52 
push8(uint8_t pushval)53 void push8(uint8_t pushval) {
54     write6502(BASE_STACK + sp--, pushval);
55 }
56 
pull16()57 uint16_t pull16() {
58     uint16_t temp16;
59     temp16 = read6502(BASE_STACK + ((sp + 1) & 0xFF)) | ((uint16_t)read6502(BASE_STACK + ((sp + 2) & 0xFF)) << 8);
60     sp += 2;
61     return(temp16);
62 }
63 
pull8()64 uint8_t pull8() {
65     return (read6502(BASE_STACK + ++sp));
66 }
67 
reset6502()68 void reset6502() {
69     pc = (uint16_t)read6502(0xFFFC) | ((uint16_t)read6502(0xFFFD) << 8);
70     a = 0;
71     x = 0;
72     y = 0;
73     sp = 0xFD;
74     status |= FLAG_CONSTANT;
75 }
76 
77