trunk/src/emu/cpu/sh2/sh2.c
| r20603 | r20604 | |
| 27 | 27 | |
| 28 | 28 | /***************************************************************************** |
| 29 | 29 | Changes |
| 30 | 20130129 Angelo Salese |
| 31 | - added illegal opcode exception handling, side effect of some Saturn games |
| 32 | on loading like Feda or Falcom Classics Vol. 1 |
| 33 | (i.e. Master CPU Incautiously transfers memory from CD to work RAM H, and |
| 34 | wipes out Slave CPU program code too while at it). |
| 35 | |
| 30 | 36 | 20051129 Mariusz Wojcieszek |
| 31 | 37 | - introduced memory_decrypted_read_word() for opcode fetching |
| 32 | 38 | |
| r20603 | r20604 | |
| 839 | 845 | sh2->r[n] = sh2->r[m] & 0x0000ffff; |
| 840 | 846 | } |
| 841 | 847 | |
| 848 | /* ILLEGAL */ |
| 849 | INLINE void ILLEGAL(sh2_state *sh2) |
| 850 | { |
| 851 | logerror("SH2.%s: Illegal opcode at %08x\n", sh2->device->tag(), sh2->pc); |
| 852 | sh2->r[15] -= 4; |
| 853 | WL( sh2, sh2->r[15], sh2->sr ); /* push SR onto stack */ |
| 854 | sh2->r[15] -= 4; |
| 855 | WL( sh2, sh2->r[15], sh2->pc ); /* push PC onto stack */ |
| 856 | |
| 857 | /* fetch PC */ |
| 858 | sh2->pc = RL( sh2, sh2->vbr + 4 * 4 ); |
| 859 | |
| 860 | /* TODO: timing is a guess */ |
| 861 | sh2->icount -= 5; |
| 862 | } |
| 863 | |
| 864 | |
| 842 | 865 | /* JMP @Rm */ |
| 843 | 866 | INLINE void JMP(sh2_state *sh2, UINT32 m) |
| 844 | 867 | { |
| r20603 | r20604 | |
| 1828 | 1851 | { |
| 1829 | 1852 | switch (opcode & 0x3F) |
| 1830 | 1853 | { |
| 1831 | | case 0x00: NOP(); break; |
| 1832 | | case 0x01: NOP(); break; |
| 1854 | case 0x00: ILLEGAL(sh2); break; |
| 1855 | case 0x01: ILLEGAL(sh2); break; |
| 1833 | 1856 | case 0x02: STCSR(sh2, Rn); break; |
| 1834 | 1857 | case 0x03: BSRF(sh2, Rn); break; |
| 1835 | 1858 | case 0x04: MOVBS0(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1837 | 1860 | case 0x06: MOVLS0(sh2, Rm, Rn); break; |
| 1838 | 1861 | case 0x07: MULL(sh2, Rm, Rn); break; |
| 1839 | 1862 | case 0x08: CLRT(sh2); break; |
| 1840 | | case 0x09: NOP(); break; |
| 1863 | case 0x09: NOP(); break; |
| 1841 | 1864 | case 0x0a: STSMACH(sh2, Rn); break; |
| 1842 | 1865 | case 0x0b: RTS(sh2); break; |
| 1843 | 1866 | case 0x0c: MOVBL0(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1845 | 1868 | case 0x0e: MOVLL0(sh2, Rm, Rn); break; |
| 1846 | 1869 | case 0x0f: MAC_L(sh2, Rm, Rn); break; |
| 1847 | 1870 | |
| 1848 | | case 0x10: NOP(); break; |
| 1849 | | case 0x11: NOP(); break; |
| 1871 | case 0x10: ILLEGAL(sh2); break; |
| 1872 | case 0x11: ILLEGAL(sh2); break; |
| 1850 | 1873 | case 0x12: STCGBR(sh2, Rn); break; |
| 1851 | | case 0x13: NOP(); break; |
| 1874 | case 0x13: ILLEGAL(sh2); break; |
| 1852 | 1875 | case 0x14: MOVBS0(sh2, Rm, Rn); break; |
| 1853 | 1876 | case 0x15: MOVWS0(sh2, Rm, Rn); break; |
| 1854 | 1877 | case 0x16: MOVLS0(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1862 | 1885 | case 0x1e: MOVLL0(sh2, Rm, Rn); break; |
| 1863 | 1886 | case 0x1f: MAC_L(sh2, Rm, Rn); break; |
| 1864 | 1887 | |
| 1865 | | case 0x20: NOP(); break; |
| 1866 | | case 0x21: NOP(); break; |
| 1888 | case 0x20: ILLEGAL(sh2); break; |
| 1889 | case 0x21: ILLEGAL(sh2); break; |
| 1867 | 1890 | case 0x22: STCVBR(sh2, Rn); break; |
| 1868 | 1891 | case 0x23: BRAF(sh2, Rn); break; |
| 1869 | 1892 | case 0x24: MOVBS0(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1879 | 1902 | case 0x2e: MOVLL0(sh2, Rm, Rn); break; |
| 1880 | 1903 | case 0x2f: MAC_L(sh2, Rm, Rn); break; |
| 1881 | 1904 | |
| 1882 | | case 0x30: NOP(); break; |
| 1883 | | case 0x31: NOP(); break; |
| 1884 | | case 0x32: NOP(); break; |
| 1885 | | case 0x33: NOP(); break; |
| 1905 | case 0x30: ILLEGAL(sh2); break; |
| 1906 | case 0x31: ILLEGAL(sh2); break; |
| 1907 | case 0x32: ILLEGAL(sh2); break; |
| 1908 | case 0x33: ILLEGAL(sh2); break; |
| 1886 | 1909 | case 0x34: MOVBS0(sh2, Rm, Rn); break; |
| 1887 | 1910 | case 0x35: MOVWS0(sh2, Rm, Rn); break; |
| 1888 | 1911 | case 0x36: MOVLS0(sh2, Rm, Rn); break; |
| 1889 | 1912 | case 0x37: MULL(sh2, Rm, Rn); break; |
| 1890 | | case 0x38: NOP(); break; |
| 1891 | | case 0x39: NOP(); break; |
| 1913 | case 0x38: ILLEGAL(sh2); break; |
| 1914 | case 0x39: ILLEGAL(sh2); break; |
| 1892 | 1915 | case 0x3c: MOVBL0(sh2, Rm, Rn); break; |
| 1893 | 1916 | case 0x3d: MOVWL0(sh2, Rm, Rn); break; |
| 1894 | 1917 | case 0x3e: MOVLL0(sh2, Rm, Rn); break; |
| 1895 | 1918 | case 0x3f: MAC_L(sh2, Rm, Rn); break; |
| 1896 | | case 0x3a: NOP(); break; |
| 1897 | | case 0x3b: NOP(); break; |
| 1919 | case 0x3a: ILLEGAL(sh2); break; |
| 1920 | case 0x3b: ILLEGAL(sh2); break; |
| 1898 | 1921 | |
| 1899 | 1922 | |
| 1900 | 1923 | |
| r20603 | r20604 | |
| 1913 | 1936 | case 0: MOVBS(sh2, Rm, Rn); break; |
| 1914 | 1937 | case 1: MOVWS(sh2, Rm, Rn); break; |
| 1915 | 1938 | case 2: MOVLS(sh2, Rm, Rn); break; |
| 1916 | | case 3: NOP(); break; |
| 1939 | case 3: ILLEGAL(sh2); break; |
| 1917 | 1940 | case 4: MOVBM(sh2, Rm, Rn); break; |
| 1918 | 1941 | case 5: MOVWM(sh2, Rm, Rn); break; |
| 1919 | 1942 | case 6: MOVLM(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1934 | 1957 | switch (opcode & 15) |
| 1935 | 1958 | { |
| 1936 | 1959 | case 0: CMPEQ(sh2, Rm, Rn); break; |
| 1937 | | case 1: NOP(); break; |
| 1960 | case 1: ILLEGAL(sh2); break; |
| 1938 | 1961 | case 2: CMPHS(sh2, Rm, Rn); break; |
| 1939 | 1962 | case 3: CMPGE(sh2, Rm, Rn); break; |
| 1940 | 1963 | case 4: DIV1(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1942 | 1965 | case 6: CMPHI(sh2, Rm, Rn); break; |
| 1943 | 1966 | case 7: CMPGT(sh2, Rm, Rn); break; |
| 1944 | 1967 | case 8: SUB(sh2, Rm, Rn); break; |
| 1945 | | case 9: NOP(); break; |
| 1968 | case 9: ILLEGAL(sh2); break; |
| 1946 | 1969 | case 10: SUBC(sh2, Rm, Rn); break; |
| 1947 | 1970 | case 11: SUBV(sh2, Rm, Rn); break; |
| 1948 | 1971 | case 12: ADD(sh2, Rm, Rn); break; |
| r20603 | r20604 | |
| 1968 | 1991 | case 0x09: SHLR2(sh2, Rn); break; |
| 1969 | 1992 | case 0x0a: LDSMACH(sh2, Rn); break; |
| 1970 | 1993 | case 0x0b: JSR(sh2, Rn); break; |
| 1971 | | case 0x0c: NOP(); break; |
| 1972 | | case 0x0d: NOP(); break; |
| 1994 | case 0x0c: ILLEGAL(sh2); break; |
| 1995 | case 0x0d: ILLEGAL(sh2); break; |
| 1973 | 1996 | case 0x0e: LDCSR(sh2, Rn); break; |
| 1974 | 1997 | case 0x0f: MAC_W(sh2, Rm, Rn); break; |
| 1975 | 1998 | |
| r20603 | r20604 | |
| 1977 | 2000 | case 0x11: CMPPZ(sh2, Rn); break; |
| 1978 | 2001 | case 0x12: STSMMACL(sh2, Rn); break; |
| 1979 | 2002 | case 0x13: STCMGBR(sh2, Rn); break; |
| 1980 | | case 0x14: NOP(); break; |
| 2003 | case 0x14: ILLEGAL(sh2); break; |
| 1981 | 2004 | case 0x15: CMPPL(sh2, Rn); break; |
| 1982 | 2005 | case 0x16: LDSMMACL(sh2, Rn); break; |
| 1983 | 2006 | case 0x17: LDCMGBR(sh2, Rn); break; |
| r20603 | r20604 | |
| 1985 | 2008 | case 0x19: SHLR8(sh2, Rn); break; |
| 1986 | 2009 | case 0x1a: LDSMACL(sh2, Rn); break; |
| 1987 | 2010 | case 0x1b: TAS(sh2, Rn); break; |
| 1988 | | case 0x1c: NOP(); break; |
| 1989 | | case 0x1d: NOP(); break; |
| 2011 | case 0x1c: ILLEGAL(sh2); break; |
| 2012 | case 0x1d: ILLEGAL(sh2); break; |
| 1990 | 2013 | case 0x1e: LDCGBR(sh2, Rn); break; |
| 1991 | 2014 | case 0x1f: MAC_W(sh2, Rm, Rn); break; |
| 1992 | 2015 | |
| r20603 | r20604 | |
| 2002 | 2025 | case 0x29: SHLR16(sh2, Rn); break; |
| 2003 | 2026 | case 0x2a: LDSPR(sh2, Rn); break; |
| 2004 | 2027 | case 0x2b: JMP(sh2, Rn); break; |
| 2005 | | case 0x2c: NOP(); break; |
| 2006 | | case 0x2d: NOP(); break; |
| 2028 | case 0x2c: ILLEGAL(sh2); break; |
| 2029 | case 0x2d: ILLEGAL(sh2); break; |
| 2007 | 2030 | case 0x2e: LDCVBR(sh2, Rn); break; |
| 2008 | 2031 | case 0x2f: MAC_W(sh2, Rm, Rn); break; |
| 2009 | 2032 | |
| 2010 | | case 0x30: NOP(); break; |
| 2011 | | case 0x31: NOP(); break; |
| 2012 | | case 0x32: NOP(); break; |
| 2013 | | case 0x33: NOP(); break; |
| 2014 | | case 0x34: NOP(); break; |
| 2015 | | case 0x35: NOP(); break; |
| 2016 | | case 0x36: NOP(); break; |
| 2017 | | case 0x37: NOP(); break; |
| 2018 | | case 0x38: NOP(); break; |
| 2019 | | case 0x39: NOP(); break; |
| 2020 | | case 0x3a: NOP(); break; |
| 2021 | | case 0x3b: NOP(); break; |
| 2022 | | case 0x3c: NOP(); break; |
| 2023 | | case 0x3d: NOP(); break; |
| 2024 | | case 0x3e: NOP(); break; |
| 2033 | case 0x30: ILLEGAL(sh2); break; |
| 2034 | case 0x31: ILLEGAL(sh2); break; |
| 2035 | case 0x32: ILLEGAL(sh2); break; |
| 2036 | case 0x33: ILLEGAL(sh2); break; |
| 2037 | case 0x34: ILLEGAL(sh2); break; |
| 2038 | case 0x35: ILLEGAL(sh2); break; |
| 2039 | case 0x36: ILLEGAL(sh2); break; |
| 2040 | case 0x37: ILLEGAL(sh2); break; |
| 2041 | case 0x38: ILLEGAL(sh2); break; |
| 2042 | case 0x39: ILLEGAL(sh2); break; |
| 2043 | case 0x3a: ILLEGAL(sh2); break; |
| 2044 | case 0x3b: ILLEGAL(sh2); break; |
| 2045 | case 0x3c: ILLEGAL(sh2); break; |
| 2046 | case 0x3d: ILLEGAL(sh2); break; |
| 2047 | case 0x3e: ILLEGAL(sh2); break; |
| 2025 | 2048 | case 0x3f: MAC_W(sh2, Rm, Rn); break; |
| 2026 | 2049 | |
| 2027 | 2050 | } |
| r20603 | r20604 | |
| 2066 | 2089 | { |
| 2067 | 2090 | case 0 << 8: MOVBS4(sh2, opcode & 0x0f, Rm); break; |
| 2068 | 2091 | case 1 << 8: MOVWS4(sh2, opcode & 0x0f, Rm); break; |
| 2069 | | case 2<< 8: NOP(); break; |
| 2070 | | case 3<< 8: NOP(); break; |
| 2092 | case 2<< 8: ILLEGAL(sh2); break; |
| 2093 | case 3<< 8: ILLEGAL(sh2); break; |
| 2071 | 2094 | case 4<< 8: MOVBL4(sh2, Rm, opcode & 0x0f); break; |
| 2072 | 2095 | case 5<< 8: MOVWL4(sh2, Rm, opcode & 0x0f); break; |
| 2073 | | case 6<< 8: NOP(); break; |
| 2074 | | case 7<< 8: NOP(); break; |
| 2096 | case 6<< 8: ILLEGAL(sh2); break; |
| 2097 | case 7<< 8: ILLEGAL(sh2); break; |
| 2075 | 2098 | case 8<< 8: CMPIM(sh2, opcode & 0xff); break; |
| 2076 | 2099 | case 9<< 8: BT(sh2, opcode & 0xff); break; |
| 2077 | | case 10<< 8: NOP(); break; |
| 2100 | case 10<< 8: ILLEGAL(sh2); break; |
| 2078 | 2101 | case 11<< 8: BF(sh2, opcode & 0xff); break; |
| 2079 | | case 12<< 8: NOP(); break; |
| 2102 | case 12<< 8: ILLEGAL(sh2); break; |
| 2080 | 2103 | case 13<< 8: BTS(sh2, opcode & 0xff); break; |
| 2081 | | case 14<< 8: NOP(); break; |
| 2104 | case 14<< 8: ILLEGAL(sh2); break; |
| 2082 | 2105 | case 15<< 8: BFS(sh2, opcode & 0xff); break; |
| 2083 | 2106 | } |
| 2084 | 2107 | } |
| r20603 | r20604 | |
| 2134 | 2157 | |
| 2135 | 2158 | INLINE void op1111(sh2_state *sh2, UINT16 opcode) |
| 2136 | 2159 | { |
| 2137 | | NOP(); |
| 2160 | ILLEGAL(sh2); |
| 2138 | 2161 | } |
| 2139 | 2162 | |
| 2140 | 2163 | /***************************************************************************** |
trunk/src/mame/machine/smpc.c
| r20603 | r20604 | |
| 852 | 852 | * |
| 853 | 853 | *******************************************/ |
| 854 | 854 | |
| 855 | | /* |
| 856 | | PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 857 | | PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 858 | | PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 859 | | PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 860 | | PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 861 | | PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 862 | | PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 863 | | PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 864 | | PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 R") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 865 | | PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 866 | | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 867 | | PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 868 | | PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P1 L") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 869 | | PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ |
| 870 | | PORT_BIT( 0x0003, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) |
| 871 | | |
| 872 | | 0 Start A 0 0 Down Up |
| 873 | | */ |
| 874 | | |
| 875 | 855 | UINT8 saturn_state::smpc_th_control_mode(UINT8 pad_n) |
| 876 | 856 | { |
| 877 | 857 | int th; |