Mercurial > repos > blastem
diff m68k.cpu @ 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 | 1579b840a1af |
line wrap: on
line diff
--- 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