Previous 199869 Revisions Next

r20604 Tuesday 29th January, 2013 at 21:49:55 UTC by Angelo Salese
Added illegal opcode handling for SH-2 CPU [Angelo Salese]
[src/emu/cpu/sh2]sh2.c
[src/mame/machine]smpc.c

trunk/src/emu/cpu/sh2/sh2.c
r20603r20604
2727
2828/*****************************************************************************
2929    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
3036    20051129 Mariusz Wojcieszek
3137    - introduced memory_decrypted_read_word() for opcode fetching
3238
r20603r20604
839845   sh2->r[n] = sh2->r[m] & 0x0000ffff;
840846}
841847
848/*  ILLEGAL */
849INLINE 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
842865/*  JMP     @Rm */
843866INLINE void JMP(sh2_state *sh2, UINT32 m)
844867{
r20603r20604
18281851{
18291852   switch (opcode & 0x3F)
18301853   {
1831   case 0x00: NOP();                       break;
1832   case 0x01: NOP();                       break;
1854   case 0x00: ILLEGAL(sh2);                       break;
1855   case 0x01: ILLEGAL(sh2);                       break;
18331856   case 0x02: STCSR(sh2, Rn);                  break;
18341857   case 0x03: BSRF(sh2, Rn);                   break;
18351858   case 0x04: MOVBS0(sh2, Rm, Rn);             break;
r20603r20604
18371860   case 0x06: MOVLS0(sh2, Rm, Rn);             break;
18381861   case 0x07: MULL(sh2, Rm, Rn);               break;
18391862   case 0x08: CLRT(sh2);                       break;
1840   case 0x09: NOP();                       break;
1863   case 0x09: NOP();                           break;
18411864   case 0x0a: STSMACH(sh2, Rn);                break;
18421865   case 0x0b: RTS(sh2);                        break;
18431866   case 0x0c: MOVBL0(sh2, Rm, Rn);             break;
r20603r20604
18451868   case 0x0e: MOVLL0(sh2, Rm, Rn);             break;
18461869   case 0x0f: MAC_L(sh2, Rm, Rn);              break;
18471870
1848   case 0x10: NOP();                       break;
1849   case 0x11: NOP();                       break;
1871   case 0x10: ILLEGAL(sh2);                       break;
1872   case 0x11: ILLEGAL(sh2);                       break;
18501873   case 0x12: STCGBR(sh2, Rn);                 break;
1851   case 0x13: NOP();                       break;
1874   case 0x13: ILLEGAL(sh2);                       break;
18521875   case 0x14: MOVBS0(sh2, Rm, Rn);             break;
18531876   case 0x15: MOVWS0(sh2, Rm, Rn);             break;
18541877   case 0x16: MOVLS0(sh2, Rm, Rn);             break;
r20603r20604
18621885   case 0x1e: MOVLL0(sh2, Rm, Rn);             break;
18631886   case 0x1f: MAC_L(sh2, Rm, Rn);              break;
18641887
1865   case 0x20: NOP();                       break;
1866   case 0x21: NOP();                       break;
1888   case 0x20: ILLEGAL(sh2);                       break;
1889   case 0x21: ILLEGAL(sh2);                       break;
18671890   case 0x22: STCVBR(sh2, Rn);                 break;
18681891   case 0x23: BRAF(sh2, Rn);                   break;
18691892   case 0x24: MOVBS0(sh2, Rm, Rn);             break;
r20603r20604
18791902   case 0x2e: MOVLL0(sh2, Rm, Rn);             break;
18801903   case 0x2f: MAC_L(sh2, Rm, Rn);              break;
18811904
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;
18861909   case 0x34: MOVBS0(sh2, Rm, Rn);             break;
18871910   case 0x35: MOVWS0(sh2, Rm, Rn);             break;
18881911   case 0x36: MOVLS0(sh2, Rm, Rn);             break;
18891912   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;
18921915   case 0x3c: MOVBL0(sh2, Rm, Rn);             break;
18931916   case 0x3d: MOVWL0(sh2, Rm, Rn);             break;
18941917   case 0x3e: MOVLL0(sh2, Rm, Rn);             break;
18951918   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;
18981921
18991922
19001923
r20603r20604
19131936   case  0: MOVBS(sh2, Rm, Rn);                break;
19141937   case  1: MOVWS(sh2, Rm, Rn);                break;
19151938   case  2: MOVLS(sh2, Rm, Rn);                break;
1916   case  3: NOP();                         break;
1939   case  3: ILLEGAL(sh2);                         break;
19171940   case  4: MOVBM(sh2, Rm, Rn);                break;
19181941   case  5: MOVWM(sh2, Rm, Rn);                break;
19191942   case  6: MOVLM(sh2, Rm, Rn);                break;
r20603r20604
19341957   switch (opcode & 15)
19351958   {
19361959   case  0: CMPEQ(sh2, Rm, Rn);                break;
1937   case  1: NOP();                         break;
1960   case  1: ILLEGAL(sh2);                         break;
19381961   case  2: CMPHS(sh2, Rm, Rn);                break;
19391962   case  3: CMPGE(sh2, Rm, Rn);                break;
19401963   case  4: DIV1(sh2, Rm, Rn);                 break;
r20603r20604
19421965   case  6: CMPHI(sh2, Rm, Rn);                break;
19431966   case  7: CMPGT(sh2, Rm, Rn);                break;
19441967   case  8: SUB(sh2, Rm, Rn);                  break;
1945   case  9: NOP();                         break;
1968   case  9: ILLEGAL(sh2);                         break;
19461969   case 10: SUBC(sh2, Rm, Rn);                 break;
19471970   case 11: SUBV(sh2, Rm, Rn);                 break;
19481971   case 12: ADD(sh2, Rm, Rn);                  break;
r20603r20604
19681991   case 0x09: SHLR2(sh2, Rn);                  break;
19691992   case 0x0a: LDSMACH(sh2, Rn);                break;
19701993   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;
19731996   case 0x0e: LDCSR(sh2, Rn);                  break;
19741997   case 0x0f: MAC_W(sh2, Rm, Rn);              break;
19751998
r20603r20604
19772000   case 0x11: CMPPZ(sh2, Rn);                  break;
19782001   case 0x12: STSMMACL(sh2, Rn);               break;
19792002   case 0x13: STCMGBR(sh2, Rn);                break;
1980   case 0x14: NOP();                       break;
2003   case 0x14: ILLEGAL(sh2);                       break;
19812004   case 0x15: CMPPL(sh2, Rn);                  break;
19822005   case 0x16: LDSMMACL(sh2, Rn);               break;
19832006   case 0x17: LDCMGBR(sh2, Rn);                break;
r20603r20604
19852008   case 0x19: SHLR8(sh2, Rn);                  break;
19862009   case 0x1a: LDSMACL(sh2, Rn);                break;
19872010   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;
19902013   case 0x1e: LDCGBR(sh2, Rn);                 break;
19912014   case 0x1f: MAC_W(sh2, Rm, Rn);              break;
19922015
r20603r20604
20022025   case 0x29: SHLR16(sh2, Rn);                 break;
20032026   case 0x2a: LDSPR(sh2, Rn);                  break;
20042027   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;
20072030   case 0x2e: LDCVBR(sh2, Rn);                 break;
20082031   case 0x2f: MAC_W(sh2, Rm, Rn);              break;
20092032
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;
20252048   case 0x3f: MAC_W(sh2, Rm, Rn);              break;
20262049
20272050   }
r20603r20604
20662089   {
20672090   case  0 << 8: MOVBS4(sh2, opcode & 0x0f, Rm);   break;
20682091   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;
20712094   case  4<< 8: MOVBL4(sh2, Rm, opcode & 0x0f);    break;
20722095   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;
20752098   case  8<< 8: CMPIM(sh2, opcode & 0xff);     break;
20762099   case  9<< 8: BT(sh2, opcode & 0xff);        break;
2077   case 10<< 8: NOP();                 break;
2100   case 10<< 8: ILLEGAL(sh2);                 break;
20782101   case 11<< 8: BF(sh2, opcode & 0xff);        break;
2079   case 12<< 8: NOP();                 break;
2102   case 12<< 8: ILLEGAL(sh2);                 break;
20802103   case 13<< 8: BTS(sh2, opcode & 0xff);       break;
2081   case 14<< 8: NOP();                 break;
2104   case 14<< 8: ILLEGAL(sh2);                 break;
20822105   case 15<< 8: BFS(sh2, opcode & 0xff);       break;
20832106   }
20842107}
r20603r20604
21342157
21352158INLINE void op1111(sh2_state *sh2, UINT16 opcode)
21362159{
2137   NOP();
2160   ILLEGAL(sh2);
21382161}
21392162
21402163/*****************************************************************************
trunk/src/mame/machine/smpc.c
r20603r20604
852852 *
853853 *******************************************/
854854
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
875855UINT8 saturn_state::smpc_th_control_mode(UINT8 pad_n)
876856{
877857   int th;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team