comparison cpu_dsl.py @ 1702:73ac2e59fa3f

Implemented sbc instruction in CPU DSL
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Jan 2019 14:37:37 -0800
parents 4fd34fde390c
children 49a52c737bf0
comparison
equal deleted inserted replaced
1701:4fd34fde390c 1702:73ac2e59fa3f
383 if params[0] == 16: 383 if params[0] == 16:
384 fmt = '\n\t{dst} = {src} & 0x80 ? {src} | 0xFF00 : {src};' 384 fmt = '\n\t{dst} = {src} & 0x80 ? {src} | 0xFF00 : {src};'
385 else: 385 else:
386 fmt = '\n\t{dst} = {src} & 0x8000 ? {src} | 0xFFFF0000 : {src};' 386 fmt = '\n\t{dst} = {src} & 0x8000 ? {src} | 0xFFFF0000 : {src};'
387 return fmt.format(src=params[1], dst=params[2]) 387 return fmt.format(src=params[1], dst=params[2])
388 388
389 def _adcCImpl(prog, params, rawParams): 389 def _getCarryCheck(prog):
390 carryFlag = None 390 carryFlag = None
391 for flag in prog.flags.flagCalc: 391 for flag in prog.flags.flagCalc:
392 if prog.flags.flagCalc[flag] == 'carry': 392 if prog.flags.flagCalc[flag] == 'carry':
393 carryFlag = flag 393 carryFlag = flag
394 if carryFlag is None: 394 if carryFlag is None:
395 raise Exception('adc requires a defined carry flag') 395 raise Exception('adc requires a defined carry flag')
396 base = '\n\t{dst} = {a} + {b} + ('.format(dst = params[2], a = params[0], b = params[1])
397 carryStorage = prog.flags.getStorage(carryFlag) 396 carryStorage = prog.flags.getStorage(carryFlag)
398 if type(carryStorage) is tuple: 397 if type(carryStorage) is tuple:
399 reg,bit = carryStorage 398 reg,bit = carryStorage
400 reg = prog.resolveReg(reg, None, (), False) 399 reg = prog.resolveReg(reg, None, (), False)
401 check = '({reg} & 1 << {bit})'.format(reg=reg, bit=bit) 400 return '({reg} & 1 << {bit})'.format(reg=reg, bit=bit)
402 else: 401 else:
403 check = prog.resolveReg(carryStorage, None, (), False) 402 return prog.resolveReg(carryStorage, None, (), False)
404 return base + check + ' ? 1 : 0);' 403
404 def _adcCImpl(prog, params, rawParams):
405
406 return '\n\t{dst} = {a} + {b} + ({check} ? 1 : 0);'.format(dst = params[2],
407 a = params[0], b = params[1], check=_getCarryCheck(prog)
408 )
409
410 def _sbcCImpl(prog, params, rawParams):
411 return '\n\t{dst} = {a} - {b} - ({check} ? 1 : 0);'.format(dst = params[2],
412 a = params[0], b = params[1], check=_getCarryCheck(prog)
413 )
405 414
406 _opMap = { 415 _opMap = {
407 'mov': Op(lambda val: val).cUnaryOperator(''), 416 'mov': Op(lambda val: val).cUnaryOperator(''),
408 'not': Op(lambda val: ~val).cUnaryOperator('~'), 417 'not': Op(lambda val: ~val).cUnaryOperator('~'),
409 'lnot': Op(lambda val: 0 if val else 1).cUnaryOperator('!'), 418 'lnot': Op(lambda val: 0 if val else 1).cUnaryOperator('!'),
410 'neg': Op(lambda val: -val).cUnaryOperator('-'), 419 'neg': Op(lambda val: -val).cUnaryOperator('-'),
411 'add': Op(lambda a, b: a + b).cBinaryOperator('+'), 420 'add': Op(lambda a, b: a + b).cBinaryOperator('+'),
412 'adc': Op().addImplementation('c', 2, _adcCImpl), 421 'adc': Op().addImplementation('c', 2, _adcCImpl),
413 'sub': Op(lambda a, b: b - a).cBinaryOperator('-'), 422 'sub': Op(lambda a, b: b - a).cBinaryOperator('-'),
423 'sbc': Op().addImplementation('c', 2, _sbcCImpl),
414 'lsl': Op(lambda a, b: a << b).cBinaryOperator('<<'), 424 'lsl': Op(lambda a, b: a << b).cBinaryOperator('<<'),
415 'lsr': Op(lambda a, b: a >> b).cBinaryOperator('>>'), 425 'lsr': Op(lambda a, b: a >> b).cBinaryOperator('>>'),
416 'asr': Op(lambda a, b: a >> b).addImplementation('c', 2, _asrCImpl), 426 'asr': Op(lambda a, b: a >> b).addImplementation('c', 2, _asrCImpl),
417 'and': Op(lambda a, b: a & b).cBinaryOperator('&'), 427 'and': Op(lambda a, b: a & b).cBinaryOperator('&'),
418 'or': Op(lambda a, b: a | b).cBinaryOperator('|'), 428 'or': Op(lambda a, b: a | b).cBinaryOperator('|'),