Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import os
- import sys
- instruction_set = [ 'live', 'ld', 'st', 'add', 'sub',
- 'and', 'or', 'xor', 'zjmp', 'ldi', 'sti',
- 'fork', 'lld', 'lldi', 'lfork', 'aff']
- class CorewarException(BaseException):
- msg = None
- def __init__(self, msg):
- self.msg = msg
- def asm(args):
- args = args.replace(',', ' ').replace(' ', ' ').split(' ')
- if not args[0] in instruction_set:
- raise CorewarException('Unknown instruction \'%s\'' % args[0])
- out = ['%02x' % (instruction_set.index(args[0]) + 1)]
- enc = ''
- for i,arg in enumerate(args[1:]):
- if arg[0] == 'r':
- try:
- register = int(arg[1:])
- if register < 1:
- raise ValueError()
- except ValueError:
- raise CorewarException('Invalid register number (argument %d)' % (i + 1))
- out.append('%02x' % register)
- enc += '01'
- elif arg[0] == '%':
- try:
- direct = int(arg[1:])
- except ValueError:
- raise CorewarException('Invalid direct value (argument %d)' % (i + 1))
- if not -0x80000000 <= direct <= 0x7fffffff:
- raise CorewarException('Direct value exceeds 32-bit limits (argument %d)' % (i + 1))
- direct &= 0xffffffff
- for k in reversed(range(4)):
- out.append('%02x' % ((direct >> (k*8)) & 0xff))
- enc += '10'
- else:
- try:
- indirect = int(arg)
- except ValueError:
- raise CorewarException('Invalid indirect value (argument %d)' % (i + 1))
- if not -0x8000 <= indirect <= 0x7fff:
- raise CorewarException('Indirect value exceeds 16-bit limits (argument %d)' % (i + 1))
- indirect &= 0xffff
- for k in reversed(range(2)):
- out.append('%02x' % ((indirect >> (k*8)) & 0xff))
- enc += '11'
- enc += '0' * max(0, 8 - len(enc))
- if not args[0] in ['live', 'fork', 'lfork', 'zjmp']:
- out.insert(1, '%02x' % int(enc, 2))
- return (' '.join(out))
- def smartinput(prompt=''):
- if os.isatty(0):
- print(prompt, end='', flush='True')
- for line in sys.stdin:
- if line:
- return line.replace('\n', '')
- return None
- def main(args):
- if len(args) < 2:
- while True:
- line = smartinput('> ')
- if line is None:
- if os.isatty(0):
- print()
- return 0
- if line:
- try:
- print(asm(line))
- except CorewarException as ex:
- print(ex.msg, file=sys.stderr)
- else:
- try:
- print(asm(' '.join(args[1:])))
- except CorewarException as ex:
- print(ex.msg, file=sys.stderr)
- return 1
- return 0
- if __name__ == '__main__':
- exit(main(sys.argv))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement