diff options
author | Michael Pavone <pavone@retrodev.com> | 2019-01-30 21:47:35 -0800 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2019-01-30 21:47:35 -0800 |
commit | dd49801256757e0239c6e6107863d511ad79da76 (patch) | |
tree | 227da63b0b30c591ca6512ea8fb96c8affe24fae /cpu_dsl.py | |
parent | 3245674518c239ae9ebf69bf04554db2c351adfb (diff) |
Fix cp instruction in new Z80 core and implement its DD/FD prefixes
Diffstat (limited to 'cpu_dsl.py')
-rwxr-xr-x | cpu_dsl.py | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -379,7 +379,8 @@ def _updateFlagsCImpl(prog, params, rawParams): else: raise Exception('Unknown flag calc type: ' + calc) if prog.carryFlowDst: - output.append('\n\t{dst} = {tmpdst};'.format(dst = prog.resolveParam(prog.lastDst, None, {}), tmpdst = prog.carryFlowDst)) + if prog.lastOp.op != 'cmp': + output.append('\n\t{dst} = {tmpdst};'.format(dst = prog.resolveParam(prog.lastDst, None, {}), tmpdst = prog.carryFlowDst)) prog.carryFlowDst = None if parity: if paritySize > 8: @@ -417,14 +418,26 @@ def _updateFlagsCImpl(prog, params, rawParams): output.append('\n\t{reg} = {val};'.format(reg=reg, val=explicit[flag])) return ''.join(output) -def _cmpCImpl(prog, params): - size = prog.paramSize(params[1]) +def _cmpCImpl(prog, params, rawParams, flagUpdates): + size = prog.paramSize(rawParams[1]) + needsCarry = False + if flagUpdates: + for flag in flagUpdates: + calc = prog.flags.flagCalc[flag] + if calc == 'carry': + needsCarry = True + break + if needsCarry: + size *= 2 tmpvar = 'cmp_tmp{sz}__'.format(sz=size) - typename = '' + prog.carryFlowDst = tmpvar + prog.lastA = params[1] + prog.lastB = params[0] + prog.lastBFlow = params[0] scope = prog.getRootScope() if not scope.resolveLocal(tmpvar): scope.addLocal(tmpvar, size) - prog.lastDst = tmpvar + prog.lastDst = rawParams[1] return '\n\t{var} = {b} - {a};'.format(var = tmpvar, a = params[0], b = params[1]) def _asrCImpl(prog, params, rawParams): |