comparison m68k.cpu @ 2621:ce9386a7b21e

Fix V flag for asl in new CPU core
author Michael Pavone <pavone@retrodev.com>
date Sat, 22 Feb 2025 01:31:51 -0800
parents 1579b840a1af
children adff015dc94f
comparison
equal deleted inserted replaced
2620:b58ca7af1e60 2621:ce9386a7b21e
1730 m68k_save_dst 0 1730 m68k_save_dst 0
1731 m68k_prefetch 1731 m68k_prefetch
1732 1732
1733 1110CCC1ZZ000RRR asli 1733 1110CCC1ZZ000RRR asli
1734 invalid Z 3 1734 invalid Z 3
1735 local vtmp 8
1736 local shift 8
1737 vtmp = 0
1735 switch C 1738 switch C
1736 case 0 1739 case 0
1737 meta shift 8 1740 shift = 8
1738 default 1741 default
1739 meta shift C 1742 shift = C
1740 end 1743 end
1741 lsl dregs.R shift dregs.R Z 1744 shift -= 1
1742 update_flags XNZV0C 1745 loop shift
1746 lsl dregs.R 1 dregs.R Z
1747 update_flags V
1748 vtmp |= vflag
1749 end
1750 shift += 1
1751 lsl dregs.R 1 dregs.R Z
1752 update_flags XNZVC
1753 vflag |= vtmp
1743 local cyc 32 1754 local cyc 32
1744 cyc = shift + shift 1755 cyc = shift + shift
1745 switch Z 1756 switch Z
1746 case 2 1757 case 2
1747 cyc += 4 1758 cyc += 4
1753 m68k_prefetch 1764 m68k_prefetch
1754 1765
1755 1110CCC1ZZ100RRR asl_dn 1766 1110CCC1ZZ100RRR asl_dn
1756 invalid Z 3 1767 invalid Z 3
1757 local shift 8 1768 local shift 8
1769 local vtmp 8
1758 and dregs.C 63 shift 1770 and dregs.C 63 shift
1759 #TODO: implement loops and do this a bit at a time to implement V flag 1771 vtmp = 0
1760 switch Z 1772 if shift
1761 case 2 1773 shift -= 1
1762 if shift >=U 32 1774 loop shift
1763 if shift = 32 1775 lsl dregs.R 1 dregs.R Z
1764 lsl dregs.R 31 dregs.R Z 1776 update_flags V
1765 lsl dregs.R 1 dregs.R Z 1777 vtmp |= vflag
1766 update_flags XNZ1V0C 1778 end
1767 else 1779 shift += 1
1768 dregs.R:Z = 0 1780 lsl dregs.R 1 dregs.R Z
1769 update_flags X0N0Z1V0C0 1781 update_flags XNZVC
1770 end 1782 vflag |= vtmp
1771 else 1783 else
1772 lsl dregs.R shift dregs.R Z 1784 cmp 0 dregs.R Z
1773 update_flags NZV0C 1785 update_flags NZV0C
1774 if shift 1786 end
1775 xflag = cflag 1787 shift += shift
1776 end 1788 switch Z
1777 end 1789 case 2
1778 case 1 1790 shift += 4
1779 if shift >=U 16 1791 default
1780 if shift = 16 1792 shift += 2
1781 lsl dregs.R 15 dregs.R Z
1782 lsl dregs.R 1 dregs.R Z
1783 update_flags XN0Z1V0C
1784 else
1785 dregs.R:Z = 0
1786 update_flags X0N0Z1V0C0
1787 end
1788 else
1789 lsl dregs.R shift dregs.R Z
1790 update_flags NZV0C
1791 if shift
1792 xflag = cflag
1793 end
1794 end
1795 case 0
1796 if shift >=U 8
1797 if shift = 8
1798 lsl dregs.R 7 dregs.R Z
1799 lsl dregs.R 1 dregs.R Z
1800 update_flags XN0Z1V0C
1801 else
1802 dregs.R:Z = 0
1803 update_flags X0N0Z1V0C0
1804 end
1805 else
1806 lsl dregs.R shift dregs.R Z
1807 update_flags NZV0C
1808 if shift
1809 xflag = cflag
1810 end
1811 end
1812 end
1813 add shift shift shift
1814 switch Z
1815 case 2
1816 add 4 shift shift
1817 default
1818 add 2 shift shift
1819 end 1793 end
1820 cycles shift 1794 cycles shift
1821 #TODO: should this happen before or after the majority of the shift? 1795 #TODO: should this happen before or after the majority of the shift?
1822 m68k_prefetch 1796 m68k_prefetch
1823 1797