sh-dis/python/emulator/operations.py
Zack Buhman b6c629baad initial SH4 emulator implementation in C
This currently only implements the SH2 instructions.
2024-04-21 20:54:32 +08:00

95 lines
1.5 KiB
Python

__all__ = [
'sign_extend64',
'sign_extend32',
'sign_extend16',
'sign_extend12',
'sign_extend8',
'zero_extend32',
'zero_extend16',
'zero_extend8',
'zero_extend4',
'zero_extend1',
'signed_saturate48',
'signed_saturate32',
'register',
'bit',
]
#
# sign_extend
#
def sign_extend(x, b):
m = 1 << (b - 1)
x = x & ((1 << b) - 1)
r = (x ^ m) - m
return r
def sign_extend64(x):
return sign_extend(x, 64)
def sign_extend32(x):
return sign_extend(x, 32)
def sign_extend16(x):
return sign_extend(x, 16)
def sign_extend12(x):
return sign_extend(x, 12)
def sign_extend8(x):
return sign_extend(x, 8)
#
# zero_extend
#
def zero_extend(x, b):
x = x & ((1 << b) - 1)
return x
def zero_extend32(x):
return zero_extend(x, 32)
def zero_extend16(x):
return zero_extend(x, 16)
def zero_extend8(x):
return zero_extend(x, 8)
def zero_extend4(x):
return zero_extend(x, 4)
def zero_extend1(x):
return zero_extend(x, 1)
#
# signed_saturate
#
def signed_saturate(x, b):
upper = (2 ** (b - 1)) - 1
lower = -(2 ** (b - 1))
if x > upper:
return upper
elif x < lower:
return lower
else:
return x
def signed_saturate48(x):
return signed_saturate(x, 48)
def signed_saturate32(x):
return signed_saturate(x, 32)
#
# "convenience" functions
#
def register(x):
return zero_extend(x, 32)
def bit(x):
return zero_extend(x, 1)