Mercurial > repos > blastem
changeset 1710:2344b3650b38
Fix sbc and implement carry/overflow flags for it in CPU DSL
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Jan 2019 22:56:43 -0800 |
parents | 9c058ea77b7a |
children | 87d4f0b4bf1d |
files | cpu_dsl.py |
diffstat | 1 files changed, 25 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/cpu_dsl.py Mon Jan 28 22:49:02 2019 -0800 +++ b/cpu_dsl.py Mon Jan 28 22:56:43 2019 -0800 @@ -448,8 +448,31 @@ a = params[0], b = params[1], check = carryCheck ) -def _sbcCImpl(prog, params, rawParams): - return '\n\t{dst} = {a} - {b} - ({check} ? 1 : 0);'.format(dst = params[2], +def _sbcCImpl(prog, params, rawParams, flagUpdates): + needsCarry = needsOflow = needsHalf = False + if flagUpdates: + for flag in flagUpdates: + calc = prog.flags.flagCalc[flag] + if calc == 'carry': + needsCarry = True + elif calc == 'half-carry': + needsHalf = True + elif calc == 'overflow': + needsOflow = True + decl = '' + carryCheck = _getCarryCheck(prog) + if needsCarry or needsOflow or needsHalf: + size = prog.paramSize(rawParams[2]) + if needsCarry: + size *= 2 + decl,name = prog.getTemp(size) + dst = prog.carryFlowDst = name + prog.lastA = params[1] + prog.lastB = '({b} ^ ({check} ? 1 : 0))'.format(b = params[0], check = carryCheck) + prog.lastBFlow = '((-{b}) ^ ({check} ? -1 : 0))'.format(b = params[0], check = carryCheck) + else: + dst = params[2] + return decl + '\n\t{dst} = {b} - {a} - ({check} ? 1 : 0);'.format(dst = dst, a = params[0], b = params[1], check=_getCarryCheck(prog) )