all repos — mgba @ c640819179b9ef6f441bd97327634bd70c8842a8

mGBA Game Boy Advance Emulator

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