changeset 1701:4fd34fde390c

Added adc instruction to CPU DSL
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Jan 2019 05:55:08 -0800
parents e4b4e21a37fa
children 73ac2e59fa3f
files cpu_dsl.py
diffstat 1 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/cpu_dsl.py	Fri Jan 25 14:30:55 2019 -0800
+++ b/cpu_dsl.py	Sun Jan 27 05:55:08 2019 -0800
@@ -385,13 +385,31 @@
 	else:
 		fmt = '\n\t{dst} = {src} & 0x8000 ? {src} | 0xFFFF0000 : {src};'
 	return fmt.format(src=params[1], dst=params[2])
-		
+
+def _adcCImpl(prog, params, rawParams):
+	carryFlag = None
+	for flag in prog.flags.flagCalc:
+		if prog.flags.flagCalc[flag] == 'carry':
+			carryFlag = flag
+	if carryFlag is None:
+		raise Exception('adc requires a defined carry flag')
+	base = '\n\t{dst} = {a} + {b} + ('.format(dst = params[2], a = params[0], b = params[1])
+	carryStorage = prog.flags.getStorage(carryFlag)
+	if type(carryStorage) is tuple:
+		reg,bit = carryStorage
+		reg = prog.resolveReg(reg, None, (), False)
+		check = '({reg} & 1 << {bit})'.format(reg=reg, bit=bit)
+	else:
+		check = prog.resolveReg(carryStorage, None, (), False)
+	return base + check + ' ? 1 : 0);'
+
 _opMap = {
 	'mov': Op(lambda val: val).cUnaryOperator(''),
 	'not': Op(lambda val: ~val).cUnaryOperator('~'),
 	'lnot': Op(lambda val: 0 if val else 1).cUnaryOperator('!'),
 	'neg': Op(lambda val: -val).cUnaryOperator('-'),
 	'add': Op(lambda a, b: a + b).cBinaryOperator('+'),
+	'adc': Op().addImplementation('c', 2, _adcCImpl),
 	'sub': Op(lambda a, b: b - a).cBinaryOperator('-'),
 	'lsl': Op(lambda a, b: a << b).cBinaryOperator('<<'),
 	'lsr': Op(lambda a, b: a >> b).cBinaryOperator('>>'),