Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- # Address space is 0x00 00 - 0x07 FF or 0 - 2047
- # Address bits
- # 0000 0000 0000 0000
- # xxxx x - unused
- # .... .n - Mode switch 0 positive 1 = twos complement
- # .... ..nn - Digit select 00 = ones, 01 = tens, 10 = hundreds, 11 = sign
- # .... .... nnnn nnnn - Value
- # Two's Complement
- # 0-127 as positive
- # -128 1000 0000 0x80
- # -1 1111 1111 0xFF
- # Data bits
- # Dabc defg - Segments on display
- digits = [ 0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, 0x7F, 0x7B ]
- rom = bytearray([0x00] * 2048)
- # Positive values with leading zeros
- # For i in range(0-255)
- # Ones place 0-9 repeating over 0x00 00 - 0x00 FF digits[ i % 10 ]
- # Tens place 0-9 repeating over 0x01 00 - 0x01 FF digits[ int(i / 10) % 10 ]
- # Hundreds 0-9 repeating over 0x10 00 - 0x10 FF digits[ int(i / 100) % 10 ]
- # Sign 0x03 00 - 0x03 FF - everything initialized to 0x00
- # Positive values without leading zeros
- # Ones: 0x00 00 - 0x00 FF = digits[i % 10]
- for i in range(0x00,(0xFF + 1)):
- rom[i] = digits[i % 10]
- # Tens: 0x01 0A - 0x01 FF = digits[ int(i / 10) % 10]
- if(i >= 0x0A):
- rom[i + 0x100] = digits[int(i / 10) % 10]
- # Hundreds: 0x02 64 - 0x02 FF = digits[int(i / 100) % 10]
- if(i >= 0x64):
- rom[i + 0x200] = digits[int(i / 100) % 10]
- # Sign: Do nothing for rom[i + 0x0300]
- # ------------------
- # Two's Complement
- # Ones: 0x04 xx, Tens: 0x05 xx, Hundreds: 0x06 xx, Sign 0x07 xx
- # 0000 01xx 0000 0000 = 0 Ones: rom[0x04 00 - 0x04 7F]
- # 0000 01xx 0000 0001 = 1
- # 0000 01xx 0111 1111 = 127
- # 0000 01xx 1000 0000 = -128 0x80
- # 0000 01xx 1111 1111 = -1
- def twoComp(number):
- return 0xff & -number
- # This returns positive integers corresponding to 0x80 = 128 and 0xFF = 1
- # which can be chopped up by the usual dividing by ten and 100 to get the
- # right digits to display, and the sign digit is just always set
- for i in range(0x00,(0x7F + 1)):
- # Positive ones digit
- rom[i + 0x0400] = digits[i % 10]
- # Positive tens digit
- if(i >= 0x0A):
- rom[i + 0x500] = digits[int(i / 10) % 10]
- # Positive hundreds digit
- if(i >= 0x64):
- rom[i + 0x600] = digits[int(i / 100) % 10]
- # Positive sign digit do nothing 0x0700 - 0x077F
- for i in range(0x80,(0xFF + 1)):
- # Negative ones digit
- rom[i + 0x400] = digits[twoComp(i) % 10]
- # Negative tens digit
- if(i < 0xF7):
- rom[i + 0x500] = digits[int(twoComp(i) / 10) % 10]
- # Negative hundreds digit
- if(i < 0x9D):
- rom[i + 0x600] = digits[int(twoComp(i) / 100) % 10]
- # Negative sign 'digit' set pin D0 for the middle bar on the 7-segment
- rom[i + 0x700] = 0x01
- # -----------------
- with open('out.bin','wb') as out:
- out.write(rom)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement