49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
from collections import defaultdict
|
|
|
|
class Memory:
|
|
def __init__(self):
|
|
self._mem = defaultdict(int)
|
|
|
|
def read32(self, address):
|
|
assert (address & 0b11) == 0, address
|
|
a = self._mem[address + 0]
|
|
b = self._mem[address + 1]
|
|
c = self._mem[address + 2]
|
|
d = self._mem[address + 3]
|
|
return (
|
|
(a << 24)
|
|
| (b << 16)
|
|
| (c << 8 )
|
|
| (d << 0 )
|
|
)
|
|
|
|
def read16(self, address):
|
|
assert (address & 0b1) == 0, address
|
|
a = self._mem[address + 0]
|
|
b = self._mem[address + 1]
|
|
return (
|
|
(a << 8 )
|
|
| (b << 0 )
|
|
)
|
|
|
|
def read8(self, address):
|
|
return self._mem[address + 0]
|
|
|
|
def write32(self, address, value):
|
|
assert type(value) is int
|
|
assert (address & 0b11) == 0, address
|
|
self._mem[address + 0] = (value >> 24) & 0xff
|
|
self._mem[address + 1] = (value >> 16) & 0xff
|
|
self._mem[address + 2] = (value >> 8 ) & 0xff
|
|
self._mem[address + 3] = (value >> 0 ) & 0xff
|
|
|
|
def write16(self, address, value):
|
|
assert type(value) is int
|
|
assert (address & 0b1 ) == 0, address
|
|
self._mem[address + 0] = (value >> 8 ) & 0xff
|
|
self._mem[address + 1] = (value >> 0 ) & 0xff
|
|
|
|
def write8(self, address, value):
|
|
assert type(value) is int
|
|
self._mem[address + 0] = (value >> 0 ) & 0xff
|