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)47void 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)53void push8(uint8_t pushval) { 54 write6502(BASE_STACK + sp--, pushval); 55 } 56 pull16()57uint16_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()64uint8_t pull8() { 65 return (read6502(BASE_STACK + ++sp)); 66 } 67 reset6502()68void 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