src/platform/python/mgba/arm.py (view raw)
1# Copyright (c) 2013-2016 Jeffrey Pfau
2#
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6from ._pylib import ffi, lib # pylint: disable=no-name-in-module
7
8
9class _ARMRegisters:
10 def __init__(self, cpu):
11 self._cpu = cpu
12
13 def __getitem__(self, reg):
14 if reg > lib.ARM_PC:
15 raise IndexError("Register out of range")
16 return self._cpu._native.gprs[reg]
17
18 def __setitem__(self, reg, value):
19 if reg >= lib.ARM_PC:
20 raise IndexError("Register out of range")
21 self._cpu._native.gprs[reg] = value
22
23
24class ARMCore:
25 SP = 13
26 LR = 14
27 PC = 15
28
29 def __init__(self, native):
30 self._native = ffi.cast("struct ARMCore*", native)
31 self.gprs = _ARMRegisters(self)
32 self.cpsr = self._native.cpsr
33 self.spsr = self._native.spsr
34
35 @property
36 def sp(self):
37 return self.gprs[self.SP]
38
39 @sp.setter
40 def sp(self, value):
41 self.gprs[self.SP] = value
42
43 @property
44 def lr(self):
45 return self.gprs[self.LR]
46
47 @lr.setter
48 def lr(self, value):
49 self.gprs[self.LR] = value
50
51 @property
52 def pc(self):
53 return self.gprs[self.PC]
54
55 @pc.setter
56 def pc(self, value):
57 self.gprs[self.PC] = value