annotate emu52/mem.lst @ 42:792da050d8c4 tip

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