jb302@36: C51 COMPILER V9.02 MEM 04/17/2014 15:17:34 PAGE 1 jb302@36: jb302@36: jb302@36: C51 COMPILER V9.02, COMPILATION OF MODULE MEM jb302@36: OBJECT MODULE PLACED IN mem.obj jb302@36: COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\mem.c OMF2 BROWSE DEBUG PRINT(.\mem.lst) OBJECT(mem.obj) jb302@36: jb302@36: line level source jb302@36: jb302@36: 1 /* mem.c jb302@36: 2 * functions for accessing emulator memory */ jb302@36: 3 #include "mem.h" jb302@36: 4 jb302@36: 5 /* get flag value jb302@36: 6 * if invalid flag is requested value is 0 */ jb302@36: 7 BYTE jb302@36: 8 get_flag(BYTE flag) { jb302@36: 9 1 if (flag > 7) { jb302@36: 10 2 return 0; jb302@36: 11 2 } jb302@36: 12 1 else { jb302@36: 13 2 return GBIT(flags, flag); jb302@36: 14 2 } jb302@36: 15 1 } jb302@36: 16 jb302@36: 17 /* set flag to 0 if on == 0 jb302@36: 18 * otherwise set flag to 1 */ jb302@36: 19 void jb302@36: 20 set_flag(BYTE flag, BYTE on) { jb302@36: 21 1 if (flag <= 7) { jb302@36: 22 2 if (on == 0x00) { jb302@36: 23 3 flags = CBIT(flags, flag); jb302@36: 24 3 } jb302@36: 25 2 else { jb302@36: 26 3 flags = SBIT(flags, flag); jb302@36: 27 3 } jb302@36: 28 2 } jb302@36: 29 1 } jb302@36: 30 jb302@36: 31 /* sets zero and parity flags based on content of byte */ jb302@36: 32 void jb302@36: 33 set_zp(BYTE val){ jb302@36: 34 1 if (val == 0) { jb302@36: 35 2 set_flag(Z, 1); jb302@36: 36 2 set_flag(P, 0); jb302@36: 37 2 } jb302@36: 38 1 else { jb302@36: 39 2 /* check parity jb302@36: 40 2 * think of this as folding */ jb302@36: 41 2 val ^= val >> 4; jb302@36: 42 2 val ^= val >> 2; jb302@36: 43 2 val ^= val >> 1; jb302@36: 44 2 val &= 1; jb302@36: 45 2 if (val == 0) { jb302@36: 46 3 set_flag(P, 1); jb302@36: 47 3 } jb302@36: 48 2 else { jb302@36: 49 3 set_flag(P, 0); jb302@36: 50 3 } jb302@36: 51 2 } jb302@36: 52 1 } jb302@36: 53 jb302@36: 54 WIDE jb302@36: 55 get_wide(BYTE reg) { jb302@36: C51 COMPILER V9.02 MEM 04/17/2014 15:17:34 PAGE 2 jb302@36: jb302@36: 56 1 /* high, low */ jb302@36: 57 1 return MWIDE(regs[reg + 4], regs[reg + 12]); jb302@36: 58 1 } jb302@36: 59 jb302@36: 60 void jb302@36: 61 set_wide(BYTE reg, WIDE val) { jb302@36: 62 1 regs[reg + 4] = GHIGH(val); /* high */ jb302@36: 63 1 regs[reg + 12] = GLOW(val); /* low */ jb302@36: 64 1 } jb302@36: 65 jb302@36: 66 void jb302@36: 67 inc_pc(BYTE n) { jb302@36: 68 1 if ((regs[PCL] + n) > 0xFF) { jb302@36: 69 2 regs[PCH]++; jb302@36: 70 2 } jb302@36: 71 1 regs[PCL] += n; jb302@36: 72 1 } jb302@36: 73 jb302@36: 74 BYTE jb302@36: 75 fetch(void) { jb302@36: 76 1 BYTE val = mem[get_wide(PC)]; jb302@36: 77 1 inc_pc(1); jb302@36: 78 1 return val; jb302@36: 79 1 } jb302@36: 80 jb302@36: 81 WIDE jb302@36: 82 fetch_wide(void) { jb302@36: 83 1 WIDE val = MWIDE(mem[get_wide(PC)], mem[get_wide(PC) + 1]); jb302@36: 84 1 inc_pc(2); jb302@36: 85 1 return val; jb302@36: 86 1 } jb302@36: 87 jb302@36: 88 /* 0b000 = R0 jb302@36: 89 * 0b001 = R1 jb302@36: 90 * 0b010 = R2 jb302@36: 91 * 0b011 = R3 jb302@36: 92 * 0b100 = DPH jb302@36: 93 * 0b101 = DPL jb302@36: 94 * 0b110 = SPH jb302@36: 95 * 0b111 = SPL */ jb302@36: 96 BYTE jb302@36: 97 get_reg(BYTE reg) { jb302@36: 98 1 if (reg < 4) { jb302@36: 99 2 return regs[reg | (get_flag(BS) << 3)]; jb302@36: 100 2 } jb302@36: 101 1 else { jb302@36: 102 2 switch (reg) { jb302@36: 103 3 jb302@36: 104 3 case 4: jb302@36: 105 3 return regs[DPH]; jb302@36: 106 3 case 5: jb302@36: 107 3 return regs[DPL]; jb302@36: 108 3 case 6: jb302@36: 109 3 return regs[SPH]; jb302@36: 110 3 case 7: jb302@36: 111 3 return regs[SPL]; jb302@36: 112 3 default: jb302@36: 113 3 return 0; jb302@36: 114 3 } jb302@36: 115 2 } jb302@36: 116 1 } jb302@36: 117 jb302@36: C51 COMPILER V9.02 MEM 04/17/2014 15:17:34 PAGE 3 jb302@36: jb302@36: 118 void jb302@36: 119 set_reg(BYTE reg, BYTE val) { jb302@36: 120 1 if (reg < 4) { jb302@36: 121 2 regs[reg | (get_flag(BS) << 3)] = val; jb302@36: 122 2 } jb302@36: 123 1 else { jb302@36: 124 2 switch (reg) { jb302@36: 125 3 jb302@36: 126 3 case 4: jb302@36: 127 3 regs[DPH] = val; jb302@36: 128 3 break; jb302@36: 129 3 case 5: jb302@36: 130 3 regs[DPL] = val; jb302@36: 131 3 break; jb302@36: 132 3 case 6: jb302@36: 133 3 regs[SPH] = val; jb302@36: 134 3 break; jb302@36: 135 3 case 7: jb302@36: 136 3 regs[SPL] = val; jb302@36: 137 3 break; jb302@36: 138 3 default: jb302@36: 139 3 break; jb302@36: 140 3 } jb302@36: 141 2 } jb302@36: 142 1 } jb302@36: jb302@36: jb302@36: MODULE INFORMATION: STATIC OVERLAYABLE jb302@36: CODE SIZE = 369 ---- jb302@36: CONSTANT SIZE = ---- ---- jb302@36: XDATA SIZE = ---- ---- jb302@36: PDATA SIZE = ---- ---- jb302@36: DATA SIZE = ---- ---- jb302@36: IDATA SIZE = ---- ---- jb302@36: BIT SIZE = ---- ---- jb302@36: EDATA SIZE = ---- ---- jb302@36: HDATA SIZE = ---- ---- jb302@36: XDATA CONST SIZE = ---- ---- jb302@36: FAR CONST SIZE = ---- ---- jb302@36: END OF MODULE INFORMATION. jb302@36: jb302@36: jb302@36: C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)