|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * |
|
16 */ |
|
17 using System; |
|
18 using System.Collections.Generic; |
|
19 using System.Text; |
|
20 using SymbianUtils.Enum; |
|
21 |
|
22 namespace SymbianStructuresLib.Arm.Registers |
|
23 { |
|
24 public class ArmRegister |
|
25 { |
|
26 #region Delegates & events |
|
27 public delegate void ValueChangedHandler( ArmRegister aReg ); |
|
28 public event ValueChangedHandler ValueChanged; |
|
29 #endregion |
|
30 |
|
31 #region Constructors |
|
32 public ArmRegister( ArmRegister aCopy ) |
|
33 : this( aCopy.OriginalName, aCopy.Value ) |
|
34 { |
|
35 } |
|
36 |
|
37 public ArmRegister( string aOriginalName ) |
|
38 : this( aOriginalName, 0 ) |
|
39 { |
|
40 } |
|
41 |
|
42 public ArmRegister( TArmRegisterType aType ) |
|
43 : this( aType, 0 ) |
|
44 { |
|
45 } |
|
46 |
|
47 public ArmRegister( TArmRegisterType aType, uint aValue ) |
|
48 : this( GetTypeName( aType ), aValue ) |
|
49 { |
|
50 } |
|
51 |
|
52 public ArmRegister( string aOriginalName, uint aValue ) |
|
53 : this( GetTypeByName( aOriginalName ), aOriginalName, aValue ) |
|
54 { |
|
55 } |
|
56 |
|
57 public ArmRegister( TArmRegisterType aType, string aOriginalName, uint aValue ) |
|
58 { |
|
59 Value = aValue; |
|
60 |
|
61 // Save original name - used for UI presentation only |
|
62 iOriginalName = aOriginalName; |
|
63 |
|
64 // First map the name to a native type (if possible) |
|
65 RegType = aType; |
|
66 |
|
67 // Then map that type back onto a name, replacing |
|
68 // what the client originally supplied. This is because |
|
69 // we want to keep names consistent, e.g. R09 everwhere |
|
70 // instead of R9 and R09 depending on client behaviour. |
|
71 Name = GetTypeName( RegType ); |
|
72 } |
|
73 #endregion |
|
74 |
|
75 #region API |
|
76 public static TArmRegisterType GetTypeByName( string aName ) |
|
77 { |
|
78 TArmRegisterType ret = TArmRegisterType.EArmReg_Other; |
|
79 // |
|
80 switch ( aName.ToUpper() ) |
|
81 { |
|
82 case "R0": |
|
83 case "R00": |
|
84 ret = TArmRegisterType.EArmReg_00; |
|
85 break; |
|
86 case "R1": |
|
87 case "R01": |
|
88 ret = TArmRegisterType.EArmReg_01; |
|
89 break; |
|
90 case "R2": |
|
91 case "R02": |
|
92 ret = TArmRegisterType.EArmReg_02; |
|
93 break; |
|
94 case "R3": |
|
95 case "R03": |
|
96 ret = TArmRegisterType.EArmReg_03; |
|
97 break; |
|
98 case "R4": |
|
99 case "R04": |
|
100 ret = TArmRegisterType.EArmReg_04; |
|
101 break; |
|
102 case "R5": |
|
103 case "R05": |
|
104 ret = TArmRegisterType.EArmReg_05; |
|
105 break; |
|
106 case "R6": |
|
107 case "R06": |
|
108 ret = TArmRegisterType.EArmReg_06; |
|
109 break; |
|
110 case "R7": |
|
111 case "R07": |
|
112 ret = TArmRegisterType.EArmReg_07; |
|
113 break; |
|
114 case "R8": |
|
115 case "R08": |
|
116 case "R8_FIQ": |
|
117 case "R08_FIQ": |
|
118 ret = TArmRegisterType.EArmReg_08; |
|
119 break; |
|
120 case "R9": |
|
121 case "R09": |
|
122 case "R9_FIQ": |
|
123 case "R09_FIQ": |
|
124 ret = TArmRegisterType.EArmReg_09; |
|
125 break; |
|
126 case "R10": |
|
127 case "R10_FIQ": |
|
128 ret = TArmRegisterType.EArmReg_10; |
|
129 break; |
|
130 case "R11": |
|
131 case "R11_FIQ": |
|
132 ret = TArmRegisterType.EArmReg_11; |
|
133 break; |
|
134 case "R12": |
|
135 case "R12_FIQ": |
|
136 ret = TArmRegisterType.EArmReg_12; |
|
137 break; |
|
138 case "R13": |
|
139 case "R13_USR": |
|
140 case "R13_FIQ": |
|
141 case "R13_SVC": |
|
142 case "R13_SYS": |
|
143 case "R13_IRQ": |
|
144 case "R13_ABT": |
|
145 case "R13_UND": |
|
146 case "SP": |
|
147 ret = TArmRegisterType.EArmReg_SP; |
|
148 break; |
|
149 case "R14": |
|
150 case "R14_USR": |
|
151 case "R14_FIQ": |
|
152 case "R14_SVC": |
|
153 case "R14_IRQ": |
|
154 case "R14_ABT": |
|
155 case "R14_UND": |
|
156 case "R14_SYS": |
|
157 case "LR": |
|
158 ret = TArmRegisterType.EArmReg_LR; |
|
159 break; |
|
160 case "R15": |
|
161 case "R15_USR": |
|
162 case "R15_FIQ": |
|
163 case "R15_SVC": |
|
164 case "R15_IRQ": |
|
165 case "R15_ABT": |
|
166 case "R15_UND": |
|
167 case "R15_SYS": |
|
168 case "PC": |
|
169 ret = TArmRegisterType.EArmReg_PC; |
|
170 break; |
|
171 case "CPSR": |
|
172 ret = TArmRegisterType.EArmReg_CPSR; |
|
173 break; |
|
174 case "SPSR": |
|
175 case "SPSR_USR": |
|
176 case "SPSR_SVC": |
|
177 case "SPSR_IRQ": |
|
178 case "SPSR_FIQ": |
|
179 case "SPSR_ABT": |
|
180 case "SPSR_UND": |
|
181 case "SPSR_SYS": |
|
182 ret = TArmRegisterType.EArmReg_SPSR; |
|
183 break; |
|
184 case "DACR": |
|
185 ret = TArmRegisterType.EArmReg_DACR; |
|
186 break; |
|
187 case "FAR": |
|
188 ret = TArmRegisterType.EArmReg_FAR; |
|
189 break; |
|
190 case "FSR": |
|
191 ret = TArmRegisterType.EArmReg_FSR; |
|
192 break; |
|
193 case "CAR": |
|
194 ret = TArmRegisterType.EArmReg_CAR; |
|
195 break; |
|
196 case "MMUID": |
|
197 ret = TArmRegisterType.EArmReg_MMUID; |
|
198 break; |
|
199 case "MMUCR": |
|
200 ret = TArmRegisterType.EArmReg_MMUCR; |
|
201 break; |
|
202 case "AUXCR": |
|
203 ret = TArmRegisterType.EArmReg_AUXCR; |
|
204 break; |
|
205 case "FPEXC": |
|
206 ret = TArmRegisterType.EArmReg_FPEXC; |
|
207 break; |
|
208 case "CTYPE": |
|
209 ret = TArmRegisterType.EArmReg_CTYPE; |
|
210 break; |
|
211 case "EXC_CODE": |
|
212 ret = TArmRegisterType.EArmReg_EXCCODE; |
|
213 break; |
|
214 case "EXC_PC": |
|
215 ret = TArmRegisterType.EArmReg_EXCPC; |
|
216 break; |
|
217 |
|
218 ///////////////////////////////// |
|
219 // CO-PROCESSOR SYSTEM CONTROL |
|
220 ///////////////////////////////// |
|
221 case "SYSCON_CONTROL": |
|
222 ret = TArmRegisterType.EArmReg_SysCon_Control; |
|
223 break; |
|
224 |
|
225 ///////////////////// |
|
226 // ETM |
|
227 ///////////////////// |
|
228 case "ETM_CONTROL": |
|
229 ret = TArmRegisterType.EArmReg_ETM_Control; |
|
230 break; |
|
231 case "ETM_ID": |
|
232 ret = TArmRegisterType.EArmReg_ETM_Id; |
|
233 break; |
|
234 |
|
235 ///////////////////// |
|
236 // ETB |
|
237 ///////////////////// |
|
238 case "ETB_RAM_DEPTH": |
|
239 ret = TArmRegisterType.EArmReg_ETB_RamDepth; |
|
240 break; |
|
241 case "ETB_RAM_WIDTH": |
|
242 ret = TArmRegisterType.EArmReg_ETB_RamWidth; |
|
243 break; |
|
244 case "ETB_STATUS": |
|
245 ret = TArmRegisterType.EArmReg_ETB_Status; |
|
246 break; |
|
247 case "ETB_RAM_WRITE_POINTER": |
|
248 ret = TArmRegisterType.EArmReg_ETB_RamWritePointer; |
|
249 break; |
|
250 case "ETB_TRIGGER_COUNTER": |
|
251 ret = TArmRegisterType.EArmReg_ETB_TriggerCounter; |
|
252 break; |
|
253 case "ETB_CONTROL": |
|
254 ret = TArmRegisterType.EArmReg_ETB_Control; |
|
255 break; |
|
256 case "ETB_ID": |
|
257 ret = TArmRegisterType.EArmReg_ETB_Id; |
|
258 break; |
|
259 |
|
260 ///////////////////// |
|
261 // CATCH ALL |
|
262 ///////////////////// |
|
263 default: |
|
264 break; |
|
265 } |
|
266 // |
|
267 return ret; |
|
268 } |
|
269 |
|
270 public static string GetTypeName( TArmRegisterType aType ) |
|
271 { |
|
272 string ret = "??"; |
|
273 // |
|
274 try |
|
275 { |
|
276 ret = EnumUtils.ToString( aType ); |
|
277 } |
|
278 catch ( Exception ) |
|
279 { |
|
280 } |
|
281 // |
|
282 return ret; |
|
283 } |
|
284 #endregion |
|
285 |
|
286 #region Properties |
|
287 public uint Value |
|
288 { |
|
289 get { return iValue; } |
|
290 set |
|
291 { |
|
292 if ( iValue != value ) |
|
293 { |
|
294 iValue = value; |
|
295 |
|
296 if ( ValueChanged != null ) |
|
297 { |
|
298 ValueChanged( this ); |
|
299 } |
|
300 } |
|
301 } |
|
302 } |
|
303 |
|
304 public string Name |
|
305 { |
|
306 get { return iName; } |
|
307 set { iName = value; } |
|
308 } |
|
309 |
|
310 public string OriginalName |
|
311 { |
|
312 get { return iOriginalName; } |
|
313 } |
|
314 |
|
315 public string TypeName |
|
316 { |
|
317 get { return GetTypeName( RegType ); } |
|
318 } |
|
319 |
|
320 public TArmRegisterType RegType |
|
321 { |
|
322 get { return iType; } |
|
323 set { iType = value; } |
|
324 } |
|
325 |
|
326 public ArmRegisterCollection Parent |
|
327 { |
|
328 get { return iParent; } |
|
329 set { iParent = value; } |
|
330 } |
|
331 |
|
332 public object Tag |
|
333 { |
|
334 get { return iTag; } |
|
335 set { iTag = value; } |
|
336 } |
|
337 #endregion |
|
338 |
|
339 #region Operators |
|
340 public static implicit operator ArmRegister( uint aValue ) |
|
341 { |
|
342 return new ArmRegister( TArmRegisterType.EArmReg_Other, aValue ); |
|
343 } |
|
344 |
|
345 public static implicit operator uint( ArmRegister aRegister ) |
|
346 { |
|
347 return aRegister.Value; |
|
348 } |
|
349 #endregion |
|
350 |
|
351 #region Internal methods |
|
352 #endregion |
|
353 |
|
354 #region Internal constants |
|
355 #endregion |
|
356 |
|
357 #region From System.Object |
|
358 public override string ToString() |
|
359 { |
|
360 StringBuilder ret = new StringBuilder(); |
|
361 // |
|
362 ret.AppendFormat( "{0,-12} = 0x{1:x8}", OriginalName, Value ); |
|
363 // |
|
364 return ret.ToString(); |
|
365 } |
|
366 #endregion |
|
367 |
|
368 #region Data members |
|
369 private readonly string iOriginalName; |
|
370 private uint iValue = 0; |
|
371 private string iName = string.Empty; |
|
372 private TArmRegisterType iType = TArmRegisterType.EArmReg_00; |
|
373 private ArmRegisterCollection iParent = null; |
|
374 private object iTag = null; |
|
375 #endregion |
|
376 } |
|
377 } |