Implementing an 8 bit fixed point register
Mel
mwilson at the-wire.com
Tue Jul 1 08:47:18 EDT 2008
nickooooola wrote:
> Hello to all
> I'm about to write a simulator for a microcontroller in python
> (why python? because I love it!!!)
[...]
> The registry of this processor are all 8 bit long (and 10 bit for some
> other strange register)
> and I need to simulate the fixed point behaviour of the register,
> and to access the single bit.
>
> f.x. (this is a pseudo python session, only for understanding)
>
>>>> reg1 = fixed_int(8)
>>>> reg2 = fixed_int(10)
>>>> reg1[0].set()
> or
>>>> reg1[0] = 1 # or True? how to rapresent a binary bit
>>>> reg1[0]
> 1
>>>> reg1[1]
> 0
>>>> reg1[9]
> <exception .... blah blah not in range>
>>>> reg2 = 0x7FE # in binary 11111111110 , or 11 bit long
>>>> reg2
> 0x7FE
> #or 1111111110, the memorization truncate the upper bits ( or perhaps
> generate an exception?)
>>>> reg2 += 0x02 #the result is 10000000000, again not contained in 10 bit
>>>> reg2
> 0x00
> # truncated again
>>>> myprocessor.flags['z']
> 1
> # or True? Z flag indicated an overflow in arithmetic operations
>
> Is possibile to do so in python?
I did this for a PIC, and generally just used brute force, e.g.
temp = reg2 + 0x02
reg2 = temp & 0xFF
if temp & 0x100:
flags |= CARRY_MASK
else:
flags &= ~CARRY_MASK
if temp & 0xFF:
flags &= ~ZERO_MASK
else:
flags |= ZERO_MASK
Since it was a PIC, and there were only a half-dozen arithmetic/logical
operations, the code stayed in this form. With something bigger, it would
have been attractive to wrap these operations up in a class, as you
suggest.. (just a sketch) ..
class fixed_register (object):
def __init__ (self, size, val=0):
self.mask = ~(-1 << size)
self.ovfmask = 1 << size
self.val = val & self.mask
with appropriate __add__, __sub__, etc. Perhaps __getitem__, __setitem__ to
manipulate bits.
Good Luck, Mel.
More information about the Python-list
mailing list