Mercurial > repos > blastem
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('|'), |