comparison cpu_dsl.py @ 1719:fb5ae8c20b85

Fix cp instruction in new Z80 core and implement its DD/FD prefixes
author Michael Pavone <pavone@retrodev.com>
date Wed, 30 Jan 2019 21:47:35 -0800
parents 04cafe626118
children 0e5df2bc0f9f
comparison
equal deleted inserted replaced
1718:c7d18b8ec29a 1719:fb5ae8c20b85
377 output.append(decl) 377 output.append(decl)
378 parityDst = name 378 parityDst = name
379 else: 379 else:
380 raise Exception('Unknown flag calc type: ' + calc) 380 raise Exception('Unknown flag calc type: ' + calc)
381 if prog.carryFlowDst: 381 if prog.carryFlowDst:
382 output.append('\n\t{dst} = {tmpdst};'.format(dst = prog.resolveParam(prog.lastDst, None, {}), tmpdst = prog.carryFlowDst)) 382 if prog.lastOp.op != 'cmp':
383 output.append('\n\t{dst} = {tmpdst};'.format(dst = prog.resolveParam(prog.lastDst, None, {}), tmpdst = prog.carryFlowDst))
383 prog.carryFlowDst = None 384 prog.carryFlowDst = None
384 if parity: 385 if parity:
385 if paritySize > 8: 386 if paritySize > 8:
386 if paritySize > 16: 387 if paritySize > 16:
387 output.append('\n\t{dst} = {src} ^ ({src} >> 16);'.format(dst=parityDst, src=paritySrc)) 388 output.append('\n\t{dst} = {src} ^ ({src} >> 16);'.format(dst=parityDst, src=paritySrc))
415 else: 416 else:
416 reg = prog.resolveReg(location, None, {}) 417 reg = prog.resolveReg(location, None, {})
417 output.append('\n\t{reg} = {val};'.format(reg=reg, val=explicit[flag])) 418 output.append('\n\t{reg} = {val};'.format(reg=reg, val=explicit[flag]))
418 return ''.join(output) 419 return ''.join(output)
419 420
420 def _cmpCImpl(prog, params): 421 def _cmpCImpl(prog, params, rawParams, flagUpdates):
421 size = prog.paramSize(params[1]) 422 size = prog.paramSize(rawParams[1])
423 needsCarry = False
424 if flagUpdates:
425 for flag in flagUpdates:
426 calc = prog.flags.flagCalc[flag]
427 if calc == 'carry':
428 needsCarry = True
429 break
430 if needsCarry:
431 size *= 2
422 tmpvar = 'cmp_tmp{sz}__'.format(sz=size) 432 tmpvar = 'cmp_tmp{sz}__'.format(sz=size)
423 typename = '' 433 prog.carryFlowDst = tmpvar
434 prog.lastA = params[1]
435 prog.lastB = params[0]
436 prog.lastBFlow = params[0]
424 scope = prog.getRootScope() 437 scope = prog.getRootScope()
425 if not scope.resolveLocal(tmpvar): 438 if not scope.resolveLocal(tmpvar):
426 scope.addLocal(tmpvar, size) 439 scope.addLocal(tmpvar, size)
427 prog.lastDst = tmpvar 440 prog.lastDst = rawParams[1]
428 return '\n\t{var} = {b} - {a};'.format(var = tmpvar, a = params[0], b = params[1]) 441 return '\n\t{var} = {b} - {a};'.format(var = tmpvar, a = params[0], b = params[1])
429 442
430 def _asrCImpl(prog, params, rawParams): 443 def _asrCImpl(prog, params, rawParams):
431 shiftSize = prog.paramSize(rawParams[0]) 444 shiftSize = prog.paramSize(rawParams[0])
432 mask = 1 << (shiftSize - 1) 445 mask = 1 << (shiftSize - 1)