Mercurial > repos > blastem
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) |