comparison cpu_dsl.py @ 2448:d1eec03dca09

Fix some issues in new 68K core and add implementations of negx and clr instructions
author Michael Pavone <pavone@retrodev.com>
date Thu, 15 Feb 2024 21:49:17 -0800
parents 461fffc226e0
children edd73a009537
comparison
equal deleted inserted replaced
2447:414eb8c34198 2448:d1eec03dca09
46 elif parts[0] == 'end': 46 elif parts[0] == 'end':
47 raise Exception('end is only allowed inside a switch or if block') 47 raise Exception('end is only allowed inside a switch or if block')
48 else: 48 else:
49 if len(parts) > 1 and parts[1] in assignmentOps: 49 if len(parts) > 1 and parts[1] in assignmentOps:
50 dst = parts[0] 50 dst = parts[0]
51 dst,_,size = dst.partition(':')
51 op = parts[1] 52 op = parts[1]
52 parts = [assignmentOps[op]] + parts[2:] 53 parts = [assignmentOps[op]] + parts[2:]
53 if op == '=': 54 if op == '=':
54 if len(parts) > 2 and parts[2] in binaryOps: 55 if len(parts) > 2 and parts[2] in binaryOps:
55 op = parts[2] 56 op = parts[2]
67 if op == '<<=' or op == '>>=': 68 if op == '<<=' or op == '>>=':
68 parts.insert(1, dst) 69 parts.insert(1, dst)
69 else: 70 else:
70 parts.append(dst) 71 parts.append(dst)
71 parts.append(dst) 72 parts.append(dst)
73 if size:
74 parts.append(size)
72 self.addOp(NormalOp(parts)) 75 self.addOp(NormalOp(parts))
73 return self 76 return self
74 77
75 def processOps(self, prog, fieldVals, output, otype, oplist): 78 def processOps(self, prog, fieldVals, output, otype, oplist):
76 for i in range(0, len(oplist)): 79 for i in range(0, len(oplist)):
343 needsOflow = True 346 needsOflow = True
344 decl = '' 347 decl = ''
345 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust): 348 if needsCarry or needsOflow or needsHalf or (flagUpdates and needsSizeAdjust):
346 if len(params) <= 3: 349 if len(params) <= 3:
347 size = prog.paramSize(rawParams[2]) 350 size = prog.paramSize(rawParams[2])
348 if needsCarry and op != 'lsr': 351 if needsCarry and op != '>>':
349 size *= 2 352 size *= 2
350 decl,name = prog.getTemp(size) 353 decl,name = prog.getTemp(size)
351 dst = prog.carryFlowDst = name 354 dst = prog.carryFlowDst = name
352 prog.lastA = a 355 prog.lastA = a
353 prog.lastB = b 356 prog.lastB = b
487 myRes = lastDst 490 myRes = lastDst
488 if calc == 'sign': 491 if calc == 'sign':
489 resultBit = prog.getLastSize() - 1 492 resultBit = prog.getLastSize() - 1
490 elif calc == 'carry': 493 elif calc == 'carry':
491 if prog.lastOp.op in ('asr', 'lsr'): 494 if prog.lastOp.op in ('asr', 'lsr'):
492 resultBit = 0 495 if type(prog.lastB) is int:
496 resultBit = prog.lastB - 1
497 else:
498 #FIXME!!!!!
499 resultBit = 0
493 myRes = prog.lastA 500 myRes = prog.lastA
494 else: 501 else:
495 resultBit = prog.getLastSize() 502 resultBit = prog.getLastSize()
496 if prog.lastOp.op == 'ror': 503 if prog.lastOp.op == 'ror':
497 resultBit -= 1 504 resultBit -= 1