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)
|