Previous 199869 Revisions Next

r34030 Tuesday 23rd December, 2014 at 13:25:14 UTC by David Haywood
more arcompact ops, continues to move forward (nw)
[src/emu/cpu/arcompact]arcompact.c arcompact.h arcompact_execute.c arcompactdasm_ops.c

trunk/src/emu/cpu/arcompact/arcompact.c
r242541r242542
6161   m_program = &space(AS_PROGRAM);
6262
6363   state_add( 0,  "PC", m_debugger_temp).callimport().callexport().formatstr("%08X");
64
65   state_add( 0x10,  "STATUS32", m_debugger_temp).callimport().callexport().formatstr("%08X");
66
6467   state_add(STATE_GENPC, "GENPC", m_debugger_temp).callexport().noshow();
6568
6669   for (int i = 0x100; i < 0x140; i++)
r242541r242542
8285         m_debugger_temp = m_pc;
8386         break;
8487
88      case 0x10:
89         m_debugger_temp = m_status32;
90         break;
91
8592      case STATE_GENPC:
8693         m_debugger_temp = m_pc;
8794         break;
r242541r242542
106113         m_pc = (m_debugger_temp & 0xfffffffe);
107114         break;
108115
116      case 0x10:
117         m_status32 = m_debugger_temp;
118         break;
119
109120      default:
110121         if ((index >= 0x100) && (index < 0x140))
111122         {
r242541r242542
121132
122133   m_delayactive = 0;
123134   m_delayjump = 0x00000000;
135
136   for (int i = 0; i < 0x40; i++)
137      m_regs[i] = 0;
138
139   m_status32 = 0;
124140}
125141
126142/*****************************************************************************/
trunk/src/emu/cpu/arcompact/arcompact.h
r242541r242542
150150   ARCOMPACT_RETTYPE arcompact_handle04_01(OPS_32);
151151   ARCOMPACT_RETTYPE arcompact_handle04_02(OPS_32);
152152   ARCOMPACT_RETTYPE arcompact_handle04_03(OPS_32);
153   ARCOMPACT_RETTYPE arcompact_handle04_04(OPS_32);
153//   ARCOMPACT_RETTYPE arcompact_handle04_04(OPS_32);
154154   ARCOMPACT_RETTYPE arcompact_handle04_05(OPS_32);
155   ARCOMPACT_RETTYPE arcompact_handle04_06(OPS_32);
155//   ARCOMPACT_RETTYPE arcompact_handle04_06(OPS_32);
156156   ARCOMPACT_RETTYPE arcompact_handle04_07(OPS_32);
157157   ARCOMPACT_RETTYPE arcompact_handle04_08(OPS_32);
158158   ARCOMPACT_RETTYPE arcompact_handle04_09(OPS_32);
r242541r242542
768768   ARCOMPACT_RETTYPE get_insruction(OPS_32);
769769
770770   ARCOMPACT_HANDLER04_TYPE_PM(04_00);
771   ARCOMPACT_HANDLER04_TYPE_PM(04_04);
772   ARCOMPACT_HANDLER04_TYPE_PM(04_06);
771773   ARCOMPACT_HANDLER04_TYPE_PM(04_0a);
772774   ARCOMPACT_HANDLER04_TYPE_PM(04_20);
773775
r242541r242542
796798   int m_delaylinks;
797799   UINT32 m_delayjump;
798800
799
801//   f  e  d  c| b  a  9  8| 7  6  5  4| 3  2  1  0
802//  -  -  -  L| Z  N  C  V| U DE AE A2|A1 E2 E1  H
803   UINT32 m_status32;
800804};
801805
806#define V_OVERFLOW_FLAG (0x00000100)
807#define C_CARRY_FLAG (0x00000200)
808#define N_NEGATIVE_FLAG (0x00000400)
809#define Z_ZERO_FLAG (0x00000800)
802810
811// V = overflow (set if signed operation would overflow)
812#define STATUS32_SET_V   (m_status32 |=  V_OVERFLOW_FLAG)
813#define STATUS32_CLEAR_V (m_status32 &= ~V_OVERFLOW_FLAG)
814#define STATUS32_CHECK_V (m_status32 &   V_OVERFLOW_FLAG)
815
816// C = carry (unsigned op, carry set is same condition as LO Lower Than, carry clear is same condition as HS Higher Same)
817#define STATUS32_SET_C   (m_status32 |=  C_CARRY_FLAG)
818#define STATUS32_CLEAR_C (m_status32 &= ~C_CARRY_FLAG)
819#define STATUS32_CHECK_C (m_status32 &   C_CARRY_FLAG)
820
821// N = negative (set if most significant bit of result is set)
822#define STATUS32_SET_N   (m_status32 |=  N_NEGATIVE_FLAG)
823#define STATUS32_CLEAR_N (m_status32 &= ~N_NEGATIVE_FLAG)
824#define STATUS32_CHECK_N (m_status32 &   N_NEGATIVE_FLAG)
825
826// Z = zero (set if result is zero, ie both values the same for CMP)
827#define STATUS32_SET_Z   (m_status32 |=  Z_ZERO_FLAG)
828#define STATUS32_CLEAR_Z (m_status32 &= ~Z_ZERO_FLAG)
829#define STATUS32_CHECK_Z (m_status32 &   Z_ZERO_FLAG)
830
831
803832extern const device_type ARCA5;
804833
805834
trunk/src/emu/cpu/arcompact/arcompact_execute.c
r242541r242542
1717
1818   while (m_icount > 0)
1919   {
20      debugger_instruction_hook(this, m_pc<<1);
20      debugger_instruction_hook(this, m_pc);
2121
2222//      printf("new pc %04x\n", m_pc);
2323
r242541r242542
17511751   return arcompact_handle04_helper(PARAMS, opcodes_04[0x03], /*"SBC"*/ 0,0);
17521752}
17531753
1754ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04(OPS_32) 
1754
1755ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04_p00(OPS_32)
17551756{
1756   return arcompact_handle04_helper(PARAMS, opcodes_04[0x04], /*"AND"*/ 0,0);
1757   int size = 4;
1758   UINT32 limm = 0;
1759   int got_limm = 0;
1760
1761   COMMON32_GET_breg;
1762   COMMON32_GET_F;
1763   COMMON32_GET_creg
1764   COMMON32_GET_areg
1765
1766   UINT32 b, c;
1767
1768   if (breg == LIMM_REG)
1769   {
1770      GET_LIMM_32;
1771      size = 8;
1772      got_limm = 1;
1773      b = limm;
1774   }
1775   else
1776   {
1777      b = m_regs[breg];
1778   }
1779
1780   if (creg == LIMM_REG)
1781   {
1782      if (!got_limm)
1783      {
1784         GET_LIMM_32;
1785         size = 8;
1786      }
1787      c = limm;
1788   }
1789   else
1790   {
1791      c = m_regs[creg];
1792   }
1793   // todo: is and a, limm, limm valid? (it's pointless.)
1794
1795   // todo: if areg = LIMM then there is no result (but since that register can never be read, I guess it doesn't matter if we store it there anyway?)
1796   m_regs[areg] = b & c;
1797
1798   if (F)
1799   {
1800      arcompact_fatal("arcompact_handle04_04_p00 (AND) (F set)\n"); // not yet supported
1801   }
1802
1803   return m_pc + (size >> 0);}
1804
1805ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04_p01(OPS_32)
1806{
1807   int size = 4;
1808   arcompact_fatal("arcompact_handle04_04_p01 (AND)\n");
1809   return m_pc + (size >> 0);
17571810}
17581811
1812ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04_p10(OPS_32)
1813{
1814   int size = 4;
1815   arcompact_fatal("arcompact_handle04_04_p10 (AND)\n");
1816   return m_pc + (size >> 0);
1817}
1818
1819ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04_p11_m0(OPS_32)
1820{
1821   int size = 4;
1822   arcompact_fatal("arcompact_handle04_04_p11_m0 (AND)\n");
1823   return m_pc + (size >> 0);
1824}
1825
1826ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_04_p11_m1(OPS_32)
1827{
1828   int size = 4;
1829   arcompact_fatal("arcompact_handle04_04_p11_m1 (AND)\n");
1830   return m_pc + (size >> 0);
1831}
1832
1833
17591834ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_05(OPS_32) 
17601835{
17611836   return arcompact_handle04_helper(PARAMS, opcodes_04[0x05], /*"OR"*/ 0,0);
17621837}
17631838
1764ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06(OPS_32) 
1839
1840ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06_p00(OPS_32)
17651841{
1766   return arcompact_handle04_helper(PARAMS, opcodes_04[0x06], /*"BIC"*/ 0,0);
1842   int size = 4;
1843   arcompact_fatal("arcompact_handle04_06_p00 (BIC)\n");
1844   return m_pc + (size >> 0);
1845
17671846}
17681847
1848ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06_p01(OPS_32)
1849{
1850   int size = 4;
1851   arcompact_fatal("arcompact_handle04_06_p01 (BIC)\n");
1852   return m_pc + (size >> 0);
1853}
1854
1855ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06_p10(OPS_32)
1856{
1857   int size = 4;
1858   arcompact_fatal("arcompact_handle04_06_p10 (BIC)\n");
1859   return m_pc + (size >> 0);
1860}
1861
1862ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06_p11_m0(OPS_32)
1863{
1864   int size = 4;
1865   arcompact_fatal("arcompact_handle04_06_p11_m0 (BIC)\n");
1866   return m_pc + (size >> 0);
1867}
1868
1869ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_06_p11_m1(OPS_32)
1870{
1871   int size = 4;
1872   arcompact_fatal("arcompact_handle04_06_p11_m1 (BIC)\n");
1873   return m_pc + (size >> 0);
1874}
1875
1876
17691877ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_07(OPS_32) 
17701878{
17711879   return arcompact_handle04_helper(PARAMS, opcodes_04[0x07], /*"XOR"*/ 0,0);
r242541r242542
26602768ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_01(OPS_16)  { arcompact_log("UNIMP_S"); return m_pc + (2 >> 0);} // Unimplemented Instruction, same as illegal, but recommended to fill blank space
26612769ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_04(OPS_16)  { arcompact_log("JEQ_S [blink]"); return m_pc + (2 >> 0);}
26622770ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_05(OPS_16)  { arcompact_log("JNE_S [blink]"); return m_pc + (2 >> 0);}
2663ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_06(OPS_16)  { arcompact_log("J_S [blink]"); return m_pc + (2 >> 0);}
2771
2772ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_06(OPS_16) // J_S [blink]
2773{
2774   return m_regs[REG_BLINK];
2775}
2776
2777
26642778ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_07_07(OPS_16)  { arcompact_log("J_S.D [blink]"); return m_pc + (2 >> 0);}
26652779
26662780
r242541r242542
29173031}
29183032
29193033// op bits remaining for 0x18_06_xx subgroups 0x0700
2920ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_06_01(OPS_16)
3034ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_06_01(OPS_16) // POP_S b
29213035{
2922   arcompact_log("unimplemented POP_S %04x", op);
3036   int breg;
3037   COMMON16_GET_breg;
3038   REG_16BIT_RANGE(breg);
3039   
3040   m_regs[breg] = READ32(m_regs[REG_SP] >> 2);
3041   m_regs[REG_SP] += 4;
3042
29233043   return m_pc + (2 >> 0);
29243044}
29253045
2926ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_06_11(OPS_16)
3046ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_06_11(OPS_16) // POP_S blink
29273047{
2928   arcompact_log("unimplemented POP_S [BLINK] %04x", op);
3048   // breg bits are reserved
3049   m_regs[REG_BLINK] = READ32(m_regs[REG_SP] >> 2 );
3050   m_regs[REG_SP] += 4;
3051
29293052   return m_pc + (2 >> 0);
29303053}
29313054
29323055// op bits remaining for 0x18_07_xx subgroups 0x0700
2933ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_07_01(OPS_16)
3056ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_07_01(OPS_16) // PUSH_S b
29343057{
29353058   int breg;
29363059   COMMON16_GET_breg;
r242541r242542
29443067}
29453068
29463069
2947ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_07_11(OPS_16)
3070ARCOMPACT_RETTYPE arcompact_device::arcompact_handle18_07_11(OPS_16) // PUSH_S [blink]
29483071{
29493072   // breg bits are reserved
29503073
r242541r242542
29753098
29763099ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1b(OPS_16) // MOV_S b, u8
29773100{
2978   int breg, u;
3101   int breg;
3102   UINT32 u;
29793103   COMMON16_GET_breg;
29803104   COMMON16_GET_u8;
29813105   REG_16BIT_RANGE(breg);
r242541r242542
29873111
29883112ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1c_00(OPS_16) // ADD_S b, b, u7
29893113{
2990   int breg, u;
3114   int breg;
3115   UINT32 u;
29913116   COMMON16_GET_breg;
29923117   COMMON16_GET_u7;
29933118   REG_16BIT_RANGE(breg);
r242541r242542
29973122   return m_pc + (2 >> 0);
29983123}
29993124
3000ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1c_01(OPS_16)
3125ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1c_01(OPS_16) // CMP b, u7
30013126{
3002   arcompact_log("unimplemented CMP_S %04x",  op);
3127   int breg;
3128   UINT32 u;
3129   COMMON16_GET_breg;
3130   COMMON16_GET_u7;
3131   REG_16BIT_RANGE(breg);
3132
3133   // flag setting ALWAYS occurs on CMP operations, even 16-bit ones even without a .F opcode type
3134
3135   // TODO: verify this flag setting logic
3136
3137   // unsigned checks
3138   if (m_regs[breg] == u)
3139   {
3140      STATUS32_SET_Z;
3141   }
3142   else
3143   {
3144      STATUS32_CLEAR_Z;
3145   }
3146
3147   if (m_regs[breg] < u)
3148   {
3149      STATUS32_SET_C;
3150   }
3151   else
3152   {
3153      STATUS32_CLEAR_C;
3154   }
3155   // signed checks
3156   INT32 temp = (INT32)m_regs[breg] - (INT32)u;
3157
3158   if (temp < 0)
3159   {
3160      STATUS32_SET_N;
3161   }
3162   else
3163   {
3164      STATUS32_CLEAR_N;
3165   }
3166
3167   // if signs of source values don't match, and sign of result doesn't match the first source value, then we've overflowed?
3168   if ((m_regs[breg] & 0x80000000) != (u & 0x80000000))
3169   {
3170      if ((m_regs[breg] & 0x80000000) != (temp & 0x80000000))
3171      {
3172         STATUS32_SET_V;
3173      }
3174      else
3175      {
3176         STATUS32_CLEAR_V;
3177      }
3178   }
3179
3180   // only sets flags, no result written
3181
30033182   return m_pc + (2 >> 0);
30043183}
30053184
r242541r242542
30103189}
30113190
30123191
3013ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1d_00(OPS_16)  { return arcompact_handle1d_helper(PARAMS,"BREQ_S"); }
3192ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1d_00(OPS_16) // BREQ b,0,s8
3193{
3194   int breg;
3195   COMMON16_GET_breg;
3196   REG_16BIT_RANGE(breg);
3197
3198   if (!m_regs[breg])
3199   {
3200      int s = (op & 0x007f) >> 0;   op &= ~0x007f;
3201      if (s & 0x40) s = -0x40 + (s & 0x3f);
3202      UINT32 realaddress = PC_ALIGNED32 + (s * 2);
3203      //m_regs[REG_BLINK] = m_pc + (2 >> 0); // don't link
3204      return realaddress;
3205   }
3206
3207   return m_pc + (2 >> 0);
3208}
3209
3210
30143211ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1d_01(OPS_16)  { return arcompact_handle1d_helper(PARAMS,"BRNE_S"); }
30153212
30163213
r242541r242542
30223219
30233220
30243221
3025ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_00(OPS_16)  { return arcompact_handle1e_0x_helper(PARAMS, "BL_S");  }
3222ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_00(OPS_16) // B_S s10  (branch always)
3223{
3224   int s = (op & 0x01ff) >> 0;   op &= ~0x01ff;
3225   if (s & 0x100) s = -0x100 + (s & 0xff);
3226   UINT32 realaddress = PC_ALIGNED32 + (s * 2);
3227   //m_regs[REG_BLINK] = m_pc + (2 >> 0); // don't link
3228   return realaddress;
3229}
3230
30263231ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_01(OPS_16)  { return arcompact_handle1e_0x_helper(PARAMS, "BEQ_S"); }
3027ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_02(OPS_16)  { return arcompact_handle1e_0x_helper(PARAMS, "BNE_S"); }
30283232
3233ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_02(OPS_16) // BNE_S s10  (branch if zero bit isn't set)
3234{
3235   if (!STATUS32_CHECK_Z)
3236   {
3237      int s = (op & 0x01ff) >> 0;   op &= ~0x01ff;
3238      if (s & 0x100) s = -0x100 + (s & 0xff);
3239      UINT32 realaddress = PC_ALIGNED32 + (s * 2);
3240      //m_regs[REG_BLINK] = m_pc + (2 >> 0); // don't link
3241      return realaddress;
3242   }
3243
3244   return m_pc + (2 >> 0);
3245}
3246
30293247ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_0x_helper(OPS_16, const char* optext)
30303248{
30313249   arcompact_log("unimplemented %s %04x", optext, op);
trunk/src/emu/cpu/arcompact/arcompactdasm_ops.c
r242541r242542
19111911   int s = (op & 0x007f) >> 0;   op &= ~0x007f;
19121912   if (s & 0x40) s = -0x40 + (s & 0x3f);
19131913
1914   print("%s %s %08x", optext, regnames[breg], PC_ALIGNED32 + s*2);
1914   print("%s %s, 0 to 0x%08x", optext, regnames[breg], PC_ALIGNED32 + s*2);
19151915   return 2;
19161916}
19171917
r242541r242542
19311931
19321932
19331933
1934int arcompact_handle1e_00_dasm(DASM_OPS_16)  { return arcompact_handle1e_0x_helper_dasm(DASM_PARAMS, "BL_S");  }
1934int arcompact_handle1e_00_dasm(DASM_OPS_16)  { return arcompact_handle1e_0x_helper_dasm(DASM_PARAMS, "B_S");  }
19351935int arcompact_handle1e_01_dasm(DASM_OPS_16)  { return arcompact_handle1e_0x_helper_dasm(DASM_PARAMS, "BEQ_S"); }
19361936int arcompact_handle1e_02_dasm(DASM_OPS_16)  { return arcompact_handle1e_0x_helper_dasm(DASM_PARAMS, "BNE_S"); }
19371937


Previous 199869 Revisions Next


© 1997-2024 The MAME Team