changeset 2611:9bd90cd94000

Fix asr and lsr in new 68K core
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Feb 2025 23:06:49 -0800
parents 2de52352936c
children 7e04620c9dc1
files cpu_dsl.py m68k.cpu
diffstat 2 files changed, 105 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/cpu_dsl.py	Sat Feb 15 19:11:40 2025 -0800
+++ b/cpu_dsl.py	Sat Feb 15 23:06:49 2025 -0800
@@ -646,11 +646,9 @@
 			if after:
 				output.append(after)
 		elif calc == 'zero':
-			if prog.carryFlowDst:
-				realSize = prog.getLastSize()
-				output.append(f'\n\t//realSize = {realSize}, carryFlowDst size = {prog.paramSize(prog.carryFlowDst)}, carryFLowDst = {prog.carryFlowDst}')
-				if realSize != prog.paramSize(prog.carryFlowDst):
-					lastDst = '({res} & {mask})'.format(res=lastDst, mask = (1 << realSize) - 1)
+			realSize = prog.getLastSize()
+			if realSize != prog.paramSize(lastDst):
+				lastDst = '({res} & {mask})'.format(res=lastDst, mask = (1 << realSize) - 1)
 			if type(storage) is tuple:
 				reg,storageBit = storage
 				reg = prog.resolveParam(reg, None, {})
@@ -793,18 +791,18 @@
 		prog.lastB = params[1]
 		if needsSizeAdjust:
 			sizeMask = (1 << size) - 1
-			return decl + '\n\t{name} = (({a} & {sizeMask}) >> ({b} & {sizeMask})) | ({a} & {mask} ? 0xFFFFFFFFU << ({size} - ({b} & {sizeMask})) : 0);'.format(
+			return decl + '\n\t{name} = (({a} & {sizeMask}) >> ({b} & {sizeMask})) | (({a} & {mask}) && {b} ? 0xFFFFFFFFU << ({size} - ({b} & {sizeMask})) : 0);'.format(
 				name = name, a = params[0], b = params[1], dst = dst, mask = mask, size=size, sizeMask=sizeMask)
 	elif needsSizeAdjust:
 		decl,name = prog.getTemp(size)
 		sizeMask = (1 << size) - 1
-		return decl + ('\n\t{name} = (({a} & {sizeMask}) >> ({b} & {sizeMask})) | ({a} & {mask} ? 0xFFFFFFFFU << ({size} - ({b} & {sizeMask})) : 0);' +
+		return decl + ('\n\t{name} = (({a} & {sizeMask}) >> ({b} & {sizeMask})) | (({a} & {mask}) && {b} ? 0xFFFFFFFFU << ({size} - ({b} & {sizeMask})) : 0);' +
 			'\n\t{dst} = ({dst} & ~{sizeMask}) | {name};').format(
-			name = name, a = params[0], b = params[1], dst = dst, mask = mask, size=size, sizeMask=sizeMask)
+			name = name, a = params[0], b = params[1], dst = params[2], mask = mask, size=size, sizeMask=sizeMask)
 	else:
 		dst = params[2]
 	
-	return decl + '\n\t{dst} = ({a} >> {b}) | ({a} & {mask} ? 0xFFFFFFFFU << ({size} - {b}) : 0);'.format(
+	return decl + '\n\t{dst} = ({a} >> {b}) | (({a} & {mask}) && {b} ? 0xFFFFFFFFU << ({size} - {b}) : 0);'.format(
 		a = params[0], b = params[1], dst = dst, mask = mask, size=size)
 	
 def _sext(size, src):
--- a/m68k.cpu	Sat Feb 15 19:11:40 2025 -0800
+++ b/m68k.cpu	Sat Feb 15 23:06:49 2025 -0800
@@ -1442,8 +1442,59 @@
 	invalid Z 3
 	local shift 8
 	and dregs.C 63 shift
-	lsr dregs.R shift dregs.R Z
-	update_flags XNZV0C
+	switch Z
+	case 2
+		if shift >=U 32
+			if shift = 32
+				lsr dregs.R 31 dregs.R Z
+				lsr dregs.R 1 dregs.R Z
+				update_flags XN0Z1V0C
+			else
+				dregs.R:Z = 0
+				update_flags X0N0Z1V0C0
+			end
+		else
+			lsr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
+			end
+		end
+	case 1
+		if shift >=U 16
+			if shift = 16
+				lsr dregs.R 15 dregs.R Z
+				lsr dregs.R 1 dregs.R Z
+				update_flags XN0Z1V0C
+			else
+				dregs.R:Z = 0
+				update_flags X0N0Z1V0C0
+			end
+		else
+			lsr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
+			end
+		end
+	case 0
+		if shift >=U 8
+			if shift = 8
+				lsr dregs.R 7 dregs.R Z
+				lsr dregs.R 1 dregs.R Z
+				update_flags XN0Z1V0C
+			else
+				dregs.R:Z = 0
+				update_flags X0N0Z1V0C0
+			end
+		else
+			lsr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
+			end
+		end
+	end
 	add shift shift shift
 	switch Z
 	case 2
@@ -1496,38 +1547,59 @@
 1110CCC0ZZ100RRR asr_dn
 	invalid Z 3
 	local shift 32
-	local shift_cycles 32
 	and dregs.C 63 shift
-	shift_cycles = shift
-	if shift = 0
-		cmp 0 dregs.R Z
-		update_flags NZV0C0
-	else
-		switch Z
-		case 0
-			if shift >=U 9
-				shift = 8
-			end
-		case 1
-			if shift >=U 17
-				shift = 16
-			end
-		case 2
-			if shift >=U 33
-				shift = 32
+	switch Z
+	case 2
+		if shift >=U 32
+			asr dregs.R 31 dregs.R Z
+			asr dregs.R 1 dregs.R Z
+			update_flags NZV0
+			cflag = nflag
+			xflag = nflag
+		else
+			asr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
 			end
 		end
-		asr dregs.R shift dregs.R Z
-		update_flags XNZV0C
+	case 1
+		if shift >=U 16
+			asr dregs.R 15 dregs.R Z
+			asr dregs.R 1 dregs.R Z
+			update_flags NZV0
+			cflag = nflag
+			xflag = nflag
+		else
+			asr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
+			end
+		end
+	case 0
+		if shift >=U 8
+			asr dregs.R 7 dregs.R Z
+			asr dregs.R 1 dregs.R Z
+			update_flags NZV0
+			cflag = nflag
+			xflag = nflag
+		else
+			asr dregs.R shift dregs.R Z
+			update_flags NZV0C
+			if shift
+				xflag = cflag
+			end
+		end
 	end
-	shift_cycles += shift_cycles
+	shift += shift
 	switch Z
 	case 2
-		shift_cycles += 4
+		shift += 4
 	default
-		shift_cycles += 2
+		shift += 2
 	end
-	cycles shift_cycles
+	cycles shift
 	#TODO: should this happen before or after the majority of the shift?
 	m68k_prefetch