summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2019-01-28 22:49:02 -0800
committerMichael Pavone <pavone@retrodev.com>2019-01-28 22:49:02 -0800
commit90e1a8d54d506bc932b43c721016b1f20fc8a0b6 (patch)
treed509b2954eb8fd0af788b7b4af7ce1feba79a1d5
parent4c0f1c402fee72a4b57cfb0dde9870265eab622a (diff)
Implementation of carry/overflow flags for adc instructions in CPU DSL
-rwxr-xr-xcpu_dsl.py30
1 files changed, 26 insertions, 4 deletions
diff --git a/cpu_dsl.py b/cpu_dsl.py
index 3bef9e7..34da6d0 100755
--- a/cpu_dsl.py
+++ b/cpu_dsl.py
@@ -420,10 +420,32 @@ def _getCarryCheck(prog):
else:
return prog.resolveReg(carryStorage, None, (), False)
-def _adcCImpl(prog, params, rawParams):
-
- return '\n\t{dst} = {a} + {b} + ({check} ? 1 : 0);'.format(dst = params[2],
- a = params[0], b = params[1], check=_getCarryCheck(prog)
+def _adcCImpl(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[0]
+ prog.lastB = '({b} ^ ({check} ? 1 : 0))'.format(b = params[1], check = carryCheck)
+ prog.lastBFlow = prog.lastB
+ else:
+ dst = params[2]
+ return decl + '\n\t{dst} = {a} + {b} + ({check} ? 1 : 0);'.format(dst = dst,
+ a = params[0], b = params[1], check = carryCheck
)
def _sbcCImpl(prog, params, rawParams):