Previous 199869 Revisions Next

r35204 Sunday 22nd February, 2015 at 14:31:04 UTC by Samuele Zannoli
i386.c: updates for the future and more [Samuele Zannoli]
- add infrastructure to support opcodes ?? 0f 38 ?? and ?? 0f 3a ??
- add placeholders in opcode table for all instructions not yet implemented
- fix opcode group 0f 73
- add opcode group 66 0f 73
- move sse opcodes movd movdqa to their own routine
- move sse opcodes pinsrw pextrw to ther own routine
- add opcodes punpcklbw punpcklwd punpckldq punpcklqdq
[src/emu/cpu/i386]i386.c i386.h i386ops.h pentops.inc
[src/mess]mess.mak
[src/mess/audio]gamate.c
[src/mess/drivers]gamate.c
[src/mess/includes]gamate.h

trunk/src/emu/cpu/i386/i386.c
r243715r243716
28762876      (this->*m_opcode_table1_16[m_opcode])();
28772877}
28782878
2879/* Two-byte opcode prefix */
2879/* Two-byte opcode 0f xx */
28802880void i386_device::i386_decode_two_byte()
28812881{
28822882   m_opcode = FETCH();
r243715r243716
28902890      (this->*m_opcode_table2_16[m_opcode])();
28912891}
28922892
2893/* Three-byte opcode prefix 66 0f */
2893/* Three-byte opcode 0f 38 xx */
2894void i386_device::i386_decode_three_byte38()
2895{
2896   m_opcode = FETCH();
2897
2898   if (m_operand_size)
2899      (this->*m_opcode_table338_32[m_opcode])();
2900   else
2901      (this->*m_opcode_table338_16[m_opcode])();
2902}
2903
2904/* Three-byte opcode 0f 3a xx */
2905void i386_device::i386_decode_three_byte3a()
2906{
2907   m_opcode = FETCH();
2908
2909   if (m_operand_size)
2910      (this->*m_opcode_table33a_32[m_opcode])();
2911   else
2912      (this->*m_opcode_table33a_16[m_opcode])();
2913}
2914
2915/* Three-byte opcode prefix 66 0f xx */
28942916void i386_device::i386_decode_three_byte66()
28952917{
28962918   m_opcode = FETCH();
r243715r243716
29002922      (this->*m_opcode_table366_16[m_opcode])();
29012923}
29022924
2903/* Three-byte opcode prefix f2 0f */
2925/* Three-byte opcode prefix f2 0f xx */
29042926void i386_device::i386_decode_three_bytef2()
29052927{
29062928   m_opcode = FETCH();
r243715r243716
29202942      (this->*m_opcode_table3f3_16[m_opcode])();
29212943}
29222944
2945/* Four-byte opcode prefix 66 0f 38 xx */
2946void i386_device::i386_decode_four_byte3866()
2947{
2948   m_opcode = FETCH();
2949   if (m_operand_size)
2950      (this->*m_opcode_table46638_32[m_opcode])();
2951   else
2952      (this->*m_opcode_table46638_16[m_opcode])();
2953}
2954
2955/* Four-byte opcode prefix 66 0f 3a xx */
2956void i386_device::i386_decode_four_byte3a66()
2957{
2958   m_opcode = FETCH();
2959   if (m_operand_size)
2960      (this->*m_opcode_table4663a_32[m_opcode])();
2961   else
2962      (this->*m_opcode_table4663a_16[m_opcode])();
2963}
2964
2965/* Four-byte opcode prefix f2 0f 38 xx */
2966void i386_device::i386_decode_four_byte38f2()
2967{
2968   m_opcode = FETCH();
2969   if (m_operand_size)
2970      (this->*m_opcode_table4f238_32[m_opcode])();
2971   else
2972      (this->*m_opcode_table4f238_16[m_opcode])();
2973}
2974
2975/* Four-byte opcode prefix f2 0f 3a xx */
2976void i386_device::i386_decode_four_byte3af2()
2977{
2978   m_opcode = FETCH();
2979   if (m_operand_size)
2980      (this->*m_opcode_table4f23a_32[m_opcode])();
2981   else
2982      (this->*m_opcode_table4f23a_16[m_opcode])();
2983}
2984
2985/* Four-byte opcode prefix f3 0f 38 xx */
2986void i386_device::i386_decode_four_byte38f3()
2987{
2988   m_opcode = FETCH();
2989   if (m_operand_size)
2990      (this->*m_opcode_table4f338_32[m_opcode])();
2991   else
2992      (this->*m_opcode_table4f338_16[m_opcode])();
2993}
2994
2995
29232996/*************************************************************************/
29242997
29252998UINT8 i386_device::read8_debug(UINT32 ea, UINT8 *data)
r243715r243716
35013574            m_opcode_table3f3_32[op->opcode] = op->handler32;
35023575            m_opcode_table3f3_16[op->opcode] = op->handler16;
35033576         }
3577         else if (op->flags & OP_3BYTE38)
3578         {
3579            m_opcode_table338_32[op->opcode] = op->handler32;
3580            m_opcode_table338_16[op->opcode] = op->handler16;
3581         }
3582         else if (op->flags & OP_3BYTE3A)
3583         {
3584            m_opcode_table33a_32[op->opcode] = op->handler32;
3585            m_opcode_table33a_16[op->opcode] = op->handler16;
3586         }
3587         else if (op->flags & OP_4BYTE3866)
3588         {
3589            m_opcode_table46638_32[op->opcode] = op->handler32;
3590            m_opcode_table46638_16[op->opcode] = op->handler16;
3591         }
3592         else if (op->flags & OP_4BYTE3A66)
3593         {
3594            m_opcode_table4663a_32[op->opcode] = op->handler32;
3595            m_opcode_table4663a_16[op->opcode] = op->handler16;
3596         }
3597         else if (op->flags & OP_4BYTE38F2)
3598         {
3599            m_opcode_table4f238_32[op->opcode] = op->handler32;
3600            m_opcode_table4f238_16[op->opcode] = op->handler16;
3601         }
3602         else if (op->flags & OP_4BYTE3AF2)
3603         {
3604            m_opcode_table4f23a_32[op->opcode] = op->handler32;
3605            m_opcode_table4f23a_16[op->opcode] = op->handler16;
3606         }
3607         else if (op->flags & OP_4BYTE38F3)
3608         {
3609            m_opcode_table4f338_32[op->opcode] = op->handler32;
3610            m_opcode_table4f338_16[op->opcode] = op->handler16;
3611         }
35043612         else
35053613         {
35063614            m_opcode_table1_32[op->opcode] = op->handler32;
trunk/src/emu/cpu/i386/i386.h
r243715r243716
239239   i386_op_func m_opcode_table1_32[256];
240240   i386_op_func m_opcode_table2_16[256];
241241   i386_op_func m_opcode_table2_32[256];
242   i386_op_func m_opcode_table338_16[256];
243   i386_op_func m_opcode_table338_32[256];
244   i386_op_func m_opcode_table33a_16[256];
245   i386_op_func m_opcode_table33a_32[256];
242246   i386_op_func m_opcode_table366_16[256];
243247   i386_op_func m_opcode_table366_32[256];
244248   i386_op_func m_opcode_table3f2_16[256];
245249   i386_op_func m_opcode_table3f2_32[256];
246250   i386_op_func m_opcode_table3f3_16[256];
247251   i386_op_func m_opcode_table3f3_32[256];
252   i386_op_func m_opcode_table46638_16[256];
253   i386_op_func m_opcode_table46638_32[256];
254   i386_op_func m_opcode_table4f238_16[256];
255   i386_op_func m_opcode_table4f238_32[256];
256   i386_op_func m_opcode_table4f338_16[256];
257   i386_op_func m_opcode_table4f338_32[256];
258   i386_op_func m_opcode_table4663a_16[256];
259   i386_op_func m_opcode_table4663a_32[256];
260   i386_op_func m_opcode_table4f23a_16[256];
261   i386_op_func m_opcode_table4f23a_32[256];
248262
249263   bool m_lock_table[2][256];
250264
r243715r243716
366380   void report_invalid_modrm(const char* opcode, UINT8 modrm);
367381   void i386_decode_opcode();
368382   void i386_decode_two_byte();
383   void i386_decode_three_byte38();
384   void i386_decode_three_byte3a();
369385   void i386_decode_three_byte66();
370386   void i386_decode_three_bytef2();
371387   void i386_decode_three_bytef3();
388   void i386_decode_four_byte3866();
389   void i386_decode_four_byte3a66();
390   void i386_decode_four_byte38f2();
391   void i386_decode_four_byte3af2();
392   void i386_decode_four_byte38f3();
372393   UINT8 read8_debug(UINT32 ea, UINT8 *data);
373394   UINT32 i386_get_debug_desc(I386_SREG *seg);
374395   inline void CYCLES(int x);
r243715r243716
10031024   void mmx_punpckhwd_r64_rm64();
10041025   void mmx_punpckhdq_r64_rm64();
10051026   void mmx_packssdw_r64_rm64();
1006   void sse_sse_group0fae();
1027   void sse_group_0fae();
1028   void sse_group_660f73();
10071029   void sse_cvttps2dq_r128_rm128();
10081030   void sse_cvtss2sd_r128_r128m32();
10091031   void sse_cvttss2si_r32_r128m32();
r243715r243716
10331055   void sse_movq2dq_r128_r64();
10341056   void sse_movdqu_r128_rm128();
10351057   void sse_movdqu_rm128_r128();
1058   void sse_movd_m128_rm32();
1059   void sse_movdqa_m128_rm128();
10361060   void sse_movq_r128_r128m64();
1061   void sse_movd_rm32_r128();
1062   void sse_movdqa_rm128_r128();
10371063   void sse_pmovmskb_r16_r64();
10381064   void sse_pmovmskb_r32_r64();
10391065   void sse_xorps();
r243715r243716
10611087   void sse_comiss_r128_r128m32();
10621088   void sse_ucomiss_r128_r128m32();
10631089   void sse_shufps();
1090   void sse_punpcklbw_r128_rm128();
1091   void sse_punpcklwd_r128_rm128();
1092   void sse_punpckldq_r128_rm128();
1093   void sse_punpcklqdq_r128_rm128();
10641094   void sse_unpcklps_r128_rm128();
10651095   void sse_unpckhps_r128_rm128();
10661096   void sse_cmpps_r128_rm128_i8();
10671097   void sse_cmpss_r128_r128m32_i8();
10681098   void sse_pinsrw_r64_r16m16_i8();
10691099   void sse_pinsrw_r64_r32m16_i8();
1100   void sse_pinsrw_r128_r32m16_i8();
10701101   void sse_pextrw_r16_r64_i8();
10711102   void sse_pextrw_r32_r64_i8();
1103   void sse_pextrw_reg_r128_i8();
10721104   void sse_pminub_r64_rm64();
10731105   void sse_pmaxub_r64_rm64();
10741106   void sse_pavgb_r64_rm64();
trunk/src/emu/cpu/i386/i386ops.h
r243715r243716
1414#define OP_3BYTE66      0x40000000
1515#define OP_3BYTEF2      0x20000000
1616#define OP_3BYTEF3      0x10000000
17#define OP_3BYTE38      0x08000000
18#define OP_3BYTE3A      0x04000000
19#define OP_4BYTE3866    0x02000000
20#define OP_4BYTE3A66    0x01000000
21#define OP_4BYTE38F2    0x00800000
22#define OP_4BYTE3AF2    0x00400000
23#define OP_4BYTE38F3    0x00200000
1724
1825const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] =
1926{
r243715r243716
320327   { 0x30,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_wrmsr,               &i386_device::pentium_wrmsr,           false},
321328   { 0x31,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_rdtsc,               &i386_device::pentium_rdtsc,           false},
322329   { 0x32,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_rdmsr,               &i386_device::pentium_rdmsr,           false},
323   { 0x40,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovo_r16_rm16,      &i386_device::pentium_cmovo_r32_rm32,  false},
330   { 0x38,     OP_2BYTE|OP_PENTIUM,        &i386_device::i386_decode_three_byte38,    &i386_device::i386_decode_three_byte38,false},
331   { 0x3A,     OP_2BYTE|OP_PENTIUM,        &i386_device::i386_decode_three_byte3a,    &i386_device::i386_decode_three_byte3a,false},
332   { 0x40,       OP_2BYTE|OP_PENTIUM,   &i386_device::pentium_cmovo_r16_rm16,      &i386_device::pentium_cmovo_r32_rm32,  false},
324333   { 0x41,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovno_r16_rm16,     &i386_device::pentium_cmovno_r32_rm32, false},
325334   { 0x42,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovb_r16_rm16,      &i386_device::pentium_cmovb_r32_rm32,  false},
326335   { 0x43,     OP_2BYTE|OP_PENTIUM,        &i386_device::pentium_cmovae_r16_rm16,     &i386_device::pentium_cmovae_r32_rm32, false},
r243715r243716
421430   { 0xAB,     OP_2BYTE|OP_I386,           &i386_device::i386_bts_rm16_r16,           &i386_device::i386_bts_rm32_r32,       true },
422431   { 0xAC,     OP_2BYTE|OP_I386,           &i386_device::i386_shrd16_i8,              &i386_device::i386_shrd32_i8,          false},
423432   { 0xAD,     OP_2BYTE|OP_I386,           &i386_device::i386_shrd16_cl,              &i386_device::i386_shrd32_cl,          false},
424   { 0xAE,     OP_2BYTE|OP_SSE,            &i386_device::sse_sse_group0fae,           &i386_device::sse_sse_group0fae,       false},
433   { 0xAE,     OP_2BYTE|OP_SSE,            &i386_device::sse_group_0fae,              &i386_device::sse_group_0fae,          false},
425434   { 0xAF,     OP_2BYTE|OP_I386,           &i386_device::i386_imul_r16_rm16,          &i386_device::i386_imul_r32_rm32,      false},
426435   { 0xB0,     OP_2BYTE|OP_I486,           &i386_device::i486_cmpxchg_rm8_r8,         &i386_device::i486_cmpxchg_rm8_r8,     true },
427436   { 0xB1,     OP_2BYTE|OP_I486,           &i386_device::i486_cmpxchg_rm16_r16,       &i386_device::i486_cmpxchg_rm32_r32,   true },
r243715r243716
519528   { 0x70,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_pshufhw_r128_rm128_i8,   &i386_device::sse_pshufhw_r128_rm128_i8,false},
520529   { 0x7E,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movq_r128_r128m64,       &i386_device::sse_movq_r128_r128m64,   false},
521530   { 0x7F,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movdqu_rm128_r128,       &i386_device::sse_movdqu_rm128_r128,   false},
531   { 0xAE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
522532   { 0xB8,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_popcnt_r16_rm16,     &i386_device::pentium_popcnt_r32_rm32, false},
523   { 0xBC,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_tzcnt_r16_rm16,      &i386_device::pentium_tzcnt_r32_rm32, false},
533   { 0xBC,     OP_3BYTEF3|OP_PENTIUM,      &i386_device::pentium_tzcnt_r16_rm16,      &i386_device::pentium_tzcnt_r32_rm32, false},
524534   { 0xC2,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cmpss_r128_r128m32_i8,   &i386_device::sse_cmpss_r128_r128m32_i8,false},
535   { 0xC7,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
525536   { 0xD6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_movq2dq_r128_r64,        &i386_device::sse_movq2dq_r128_r64,    false},
526   { 0xE6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cvtdq2pd_r128_r128m64,   &i386_device::sse_cvtdq2pd_r128_r128m64,false}
537   { 0xE6,     OP_3BYTEF3|OP_SSE,          &i386_device::sse_cvtdq2pd_r128_r128m64,   &i386_device::sse_cvtdq2pd_r128_r128m64,false},
538   /* F2 0F ?? */
539   { 0x10,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
540   { 0x11,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
541   { 0x12,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
542   { 0x2A,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
543   { 0x2C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
544   { 0x2D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
545   { 0x51,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
546   { 0x58,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
547   { 0x59,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
548   { 0x5A,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
549   { 0x5C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
550   { 0x5D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
551   { 0x5E,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
552   { 0x5F,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
553   { 0x70,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
554   { 0x7C,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
555   { 0x7D,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
556   { 0xC2,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
557   { 0xD0,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
558   { 0xD6,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
559   { 0xE6,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
560   { 0xF0,     OP_3BYTEF2|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
561   /* 66 0F ?? */
562   { 0x10,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
563   { 0x11,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
564   { 0x12,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
565   { 0x13,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
566   { 0x14,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
567   { 0x15,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
568   { 0x16,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
569   { 0x17,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
570   { 0x28,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
571   { 0x29,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
572   { 0x2A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
573   { 0x2B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
574   { 0x2C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
575   { 0x2D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
576   { 0x2E,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
577   { 0x2F,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
578   { 0x50,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
579   { 0x51,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
580   { 0x54,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
581   { 0x55,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
582   { 0x56,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
583   { 0x57,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
584   { 0x58,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
585   { 0x59,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
586   { 0x5A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
587   { 0x5B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
588   { 0x5C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
589   { 0x5D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
590   { 0x5E,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
591   { 0x5F,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
592   { 0x60,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklbw_r128_rm128,    &i386_device::sse_punpcklbw_r128_rm128,false},
593   { 0x61,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklwd_r128_rm128,    &i386_device::sse_punpcklwd_r128_rm128,false},
594   { 0x62,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpckldq_r128_rm128,    &i386_device::sse_punpckldq_r128_rm128,false},
595   { 0x63,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
596   { 0x64,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
597   { 0x65,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
598   { 0x66,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
599   { 0x67,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
600   { 0x68,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
601   { 0x69,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
602   { 0x6A,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
603   { 0x6B,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
604   { 0x6C,     OP_3BYTE66|OP_SSE,          &i386_device::sse_punpcklqdq_r128_rm128,   &i386_device::sse_punpcklqdq_r128_rm128,false},
605   { 0x6D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
606   { 0x6E,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movd_m128_rm32,          &i386_device::sse_movd_m128_rm32,      false},
607   { 0x6F,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movdqa_m128_rm128,       &i386_device::sse_movdqa_m128_rm128,   false},
608   { 0x70,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
609   { 0x71,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
610   { 0x72,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
611   { 0x73,     OP_3BYTE66|OP_SSE,          &i386_device::sse_group_660f73,            &i386_device::sse_group_660f73,        false},
612   { 0x74,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
613   { 0x76,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
614   { 0x7C,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
615   { 0x7D,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
616   { 0x7E,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movd_rm32_r128,          &i386_device::sse_movd_rm32_r128,      false},
617   { 0x7F,     OP_3BYTE66|OP_SSE,          &i386_device::sse_movdqa_rm128_r128,       &i386_device::sse_movdqa_rm128_r128,   false},
618   { 0xC2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
619   { 0xC4,     OP_3BYTE66|OP_SSE,          &i386_device::sse_pinsrw_r128_r32m16_i8,   &i386_device::sse_pinsrw_r128_r32m16_i8,false},
620   { 0xC5,     OP_3BYTE66|OP_SSE,          &i386_device::sse_pextrw_reg_r128_i8,      &i386_device::sse_pextrw_reg_r128_i8,  false},
621   { 0xC6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
622   { 0xC7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
623   { 0xD0,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
624   { 0xD1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
625   { 0xD2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
626   { 0xD3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
627   { 0xD4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
628   { 0xD5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
629   { 0xD6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
630   { 0xD7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
631   { 0xD8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
632   { 0xD9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
633   { 0xDA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
634   { 0xDB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
635   { 0xDC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
636   { 0xDD,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
637   { 0xDE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
638   { 0xDF,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
639   { 0xE0,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
640   { 0xE1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
641   { 0xE2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
642   { 0xE3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
643   { 0xE4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
644   { 0xE5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
645   { 0xE6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
646   { 0xE7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
647   { 0xE8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
648   { 0xE9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
649   { 0xEA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
650   { 0xEB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
651   { 0xEC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
652   { 0xED,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
653   { 0xEE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
654   { 0xEF,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
655   { 0xF1,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
656   { 0xF2,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
657   { 0xF3,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
658   { 0xF4,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
659   { 0xF5,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
660   { 0xF6,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
661   { 0xF7,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
662   { 0xF8,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
663   { 0xF9,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
664   { 0xFA,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
665   { 0xFB,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
666   { 0xFC,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
667   { 0xFD,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
668   { 0xFE,     OP_3BYTE66|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
669   /* 0F 38 ?? */
670   { 0x00,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
671   { 0x01,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
672   { 0x02,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
673   { 0x03,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
674   { 0x04,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
675   { 0x05,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
676   { 0x06,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
677   { 0x07,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
678   { 0x08,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
679   { 0x09,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
680   { 0x0A,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
681   { 0x0B,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
682   { 0x1C,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
683   { 0x1D,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
684   { 0x1E,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
685   { 0xF0,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
686   { 0xF1,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
687   { 0xF2,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
688   { 0xF3,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
689   { 0xF5,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
690   { 0xF7,     OP_3BYTE38|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
691   /* 0F 3A ?? */
692   { 0x0F,     OP_3BYTE3A|OP_SSE,          &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
693   /* 66 0F 38 ?? */
694   { 0x00,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
695   { 0x01,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
696   { 0x02,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
697   { 0x03,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
698   { 0x04,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
699   { 0x05,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
700   { 0x06,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
701   { 0x07,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
702   { 0x08,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
703   { 0x09,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
704   { 0x0A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
705   { 0x0B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
706   { 0x0C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
707   { 0x0D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
708   { 0x0E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
709   { 0x0F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
710   { 0x10,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
711   { 0x13,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
712   { 0x14,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
713   { 0x15,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
714   { 0x16,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
715   { 0x17,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
716   { 0x18,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
717   { 0x19,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
718   { 0x1A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
719   { 0x1C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
720   { 0x1D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
721   { 0x1E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
722   { 0x20,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
723   { 0x21,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
724   { 0x22,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
725   { 0x23,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
726   { 0x24,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
727   { 0x25,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
728   { 0x28,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
729   { 0x29,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
730   { 0x2A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
731   { 0x2B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
732   { 0x2C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
733   { 0x2D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
734   { 0x2E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
735   { 0x2F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
736   { 0x30,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
737   { 0x31,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
738   { 0x32,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
739   { 0x33,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
740   { 0x34,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
741   { 0x35,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
742   { 0x36,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
743   { 0x37,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
744   { 0x38,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
745   { 0x39,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
746   { 0x3A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
747   { 0x3B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
748   { 0x3C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
749   { 0x3D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
750   { 0x3E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
751   { 0x3F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
752   { 0x40,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
753   { 0x41,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
754   { 0x45,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
755   { 0x46,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
756   { 0x47,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
757   { 0x58,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
758   { 0x59,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
759   { 0x5A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
760   { 0x78,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
761   { 0x79,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
762   { 0x80,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
763   { 0x81,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
764   { 0x82,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
765   { 0x8C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
766   { 0x8E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
767   { 0x90,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
768   { 0x91,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
769   { 0x92,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
770   { 0x93,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
771   { 0x96,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
772   { 0x97,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
773   { 0x98,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
774   { 0x99,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
775   { 0x9A,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
776   { 0x9B,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
777   { 0x9C,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
778   { 0x9D,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
779   { 0x9E,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
780   { 0x9F,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
781   { 0xA6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
782   { 0xA7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
783   { 0xA8,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
784   { 0xA9,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
785   { 0xAA,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
786   { 0xAB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
787   { 0xAC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
788   { 0xAD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
789   { 0xAE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
790   { 0xAF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
791   { 0xB6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
792   { 0xB7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
793   { 0xB8,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
794   { 0xB9,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
795   { 0xBA,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
796   { 0xBB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
797   { 0xBC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
798   { 0xBD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
799   { 0xBE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
800   { 0xBF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
801   { 0xDB,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
802   { 0xDC,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
803   { 0xDD,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
804   { 0xDE,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
805   { 0xDF,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
806   { 0xF0,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
807   { 0xF1,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
808   { 0xF3,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
809   { 0xF6,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
810   { 0xF7,     OP_4BYTE3866|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
811   /* F2 0F 38 ?? */
812   { 0xF0,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
813   { 0xF1,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
814   { 0xF3,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
815   { 0xF5,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
816   { 0xF6,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
817   { 0xF7,     OP_4BYTE38F2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
818   /* F3 0F 38 ?? */
819   { 0xF3,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
820   { 0xF5,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
821   { 0xF6,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
822   { 0xF7,     OP_4BYTE38F3|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
823   /* 66 0F 3A ?? */
824   { 0x00,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
825   { 0x01,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
826   { 0x02,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
827   { 0x04,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
828   { 0x05,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
829   { 0x06,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
830   { 0x08,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
831   { 0x09,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
832   { 0x0A,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
833   { 0x0B,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
834   { 0x0C,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
835   { 0x0D,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
836   { 0x0E,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
837   { 0x0F,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
838   { 0x14,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
839   { 0x15,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
840   { 0x16,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
841   { 0x17,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
842   { 0x18,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
843   { 0x19,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
844   { 0x1D,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
845   { 0x20,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
846   { 0x21,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
847   { 0x22,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
848   { 0x38,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
849   { 0x39,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
850   { 0x40,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
851   { 0x41,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
852   { 0x42,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
853   { 0x44,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
854   { 0x46,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
855   { 0x4A,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
856   { 0x4B,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
857   { 0x4C,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
858   { 0x60,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
859   { 0x61,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
860   { 0x62,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
861   { 0x63,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
862   { 0xDF,     OP_4BYTE3A66|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false},
863   /* F2 0F 3A ?? */
864   { 0xF0,     OP_4BYTE3AF2|OP_SSE,        &i386_device::i386_invalid,                &i386_device::i386_invalid,            false}
527865};
trunk/src/emu/cpu/i386/pentops.inc
r243715r243716
12691269      switch ( (modm & 0x38) >> 3 )
12701270      {
12711271         case 2: // psrlq
1272            if (m_xmm_operand_size)
1273            {
1274               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
1275               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
1276            }
1277            else
1278               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
1272            MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q >> imm8;
12791273            break;
1280         case 3: // psrldq
1281            if (imm8 >= 16)
1282            {
1283               XMM(modm & 7).q[0] = 0;
1284               XMM(modm & 7).q[1] = 0;
1285            }
1286            else if(imm8 >= 8)
1287            {
1288               imm8 = (imm8 & 7) << 3;
1289               XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
1290               XMM(modm & 7).q[1] = 0;
1291            }
1292            else if(imm8)
1293            {
1294               imm8 = imm8 << 3;
1295               XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (XMM(modm & 7).q[0] >> imm8);
1296               XMM(modm & 7).q[1] = XMM(modm & 7).q[0] >> imm8;
1297            }
1298            break;
12991274         case 6: // psllq
1300            if (m_xmm_operand_size)
1301            {
1302               XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
1303               XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
1304            }
1305            else
1306               MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
1275            MMX(modm & 7).q = imm8 > 63 ? 0 : MMX(modm & 7).q << imm8;
13071276            break;
1308         case 7: // pslldq
1309            if (imm8 >= 16)
1310            {
1311               XMM(modm & 7).q[0] = 0;
1312               XMM(modm & 7).q[1] = 0;
1313            }
1314            else if(imm8 >= 8)
1315            {
1316               imm8 = (imm8 & 7) << 3;
1317               XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
1318               XMM(modm & 7).q[0] = 0;
1319            }
1320            else if(imm8)
1321            {
1322               imm8 = imm8 << 3;
1323               XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
1324               XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
1325            }
1326            break;
13271277         default:
13281278            report_invalid_modrm("mmx_group0f73", modm);
13291279      }
13301280   }
13311281}
13321282
1283void i386_device::sse_group_660f73()  // Opcode 66 0f 73
1284{
1285   UINT64 t0;
1286   UINT8 modm = FETCH();
1287   UINT8 imm8 = FETCH();
1288   if (modm >= 0xc0) {
1289      switch ((modm & 0x38) >> 3)
1290      {
1291      case 2: // psrlq
1292         XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] >> imm8;
1293         XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] >> imm8;
1294         break;
1295      case 3: // psrldq
1296         if (imm8 >= 16)
1297         {
1298            XMM(modm & 7).q[0] = 0;
1299            XMM(modm & 7).q[1] = 0;
1300         }
1301         else if (imm8 >= 8)
1302         {
1303            imm8 = (imm8 & 7) << 3;
1304            XMM(modm & 7).q[0] = XMM(modm & 7).q[1] >> imm8;
1305            XMM(modm & 7).q[1] = 0;
1306         }
1307         else if (imm8)
1308         {
1309            t0 = XMM(modm & 7).q[0];
1310            imm8 = imm8 << 3;
1311            XMM(modm & 7).q[0] = (XMM(modm & 7).q[1] << (64 - imm8)) | (t0 >> imm8);
1312            XMM(modm & 7).q[1] = t0 >> imm8;
1313         }
1314         break;
1315      case 6: // psllq
1316         XMM(modm & 7).q[0] = imm8 > 63 ? 0 : XMM(modm & 7).q[0] << imm8;
1317         XMM(modm & 7).q[1] = imm8 > 63 ? 0 : XMM(modm & 7).q[1] << imm8;
1318         break;
1319      case 7: // pslldq
1320         if (imm8 >= 16)
1321         {
1322            XMM(modm & 7).q[0] = 0;
1323            XMM(modm & 7).q[1] = 0;
1324         }
1325         else if (imm8 >= 8)
1326         {
1327            imm8 = (imm8 & 7) << 3;
1328            XMM(modm & 7).q[1] = XMM(modm & 7).q[0] << imm8;
1329            XMM(modm & 7).q[0] = 0;
1330         }
1331         else if (imm8)
1332         {
1333            imm8 = imm8 << 3;
1334            XMM(modm & 7).q[1] = (XMM(modm & 7).q[0] >> (64 - imm8)) | (XMM(modm & 7).q[1] << imm8);
1335            XMM(modm & 7).q[0] = XMM(modm & 7).q[0] << imm8;
1336         }
1337         break;
1338      default:
1339         report_invalid_modrm("sse_group660f73", modm);
1340      }
1341   }
1342}
1343
13331344void i386_device::mmx_psrlw_r64_rm64()  // Opcode 0f d1
13341345{
13351346   MMXPROLOG();
r243715r243716
18921903   MMXPROLOG();
18931904   UINT8 modrm = FETCH();
18941905   if( modrm >= 0xc0 ) {
1895      if (m_xmm_operand_size)
1896         XMM((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
1897      else
1898         MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
1906      MMX((modrm >> 3) & 0x7).d[0]=LOAD_RM32(modrm);
18991907   } else {
19001908      UINT32 ea = GetEA(modrm, 0);
1901      if (m_xmm_operand_size)
1902         XMM((modrm >> 3) & 0x7).d[0]=READ32(ea);
1903      else
1904         MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
1909      MMX((modrm >> 3) & 0x7).d[0]=READ32(ea);
19051910   }
19061911   MMX((modrm >> 3) & 0x7).d[1]=0;
19071912   CYCLES(1);     // TODO: correct cycle count
r243715r243716
19121917   MMXPROLOG();
19131918   UINT8 modrm = FETCH();
19141919   if( modrm >= 0xc0 ) {
1915      if (m_xmm_operand_size)
1916         XMM((modrm >> 3) & 0x7).l[0]=XMM(modrm & 0x7).l[0];
1917      else
1918         MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
1920      MMX((modrm >> 3) & 0x7).l=MMX(modrm & 0x7).l;
19191921   } else {
19201922      UINT32 ea = GetEA(modrm, 0);
1921      if (m_xmm_operand_size)
1922         READXMM_LO64(ea, XMM((modrm >> 3) & 0x7));
1923      else
1924         READMMX(ea, MMX((modrm >> 3) & 0x7));
1925
1923      READMMX(ea, MMX((modrm >> 3) & 0x7));
19261924   }
19271925   CYCLES(1);     // TODO: correct cycle count
19281926}
r243715r243716
19321930   MMXPROLOG();
19331931   UINT8 modrm = FETCH();
19341932   if( modrm >= 0xc0 ) {
1935      if (m_xmm_operand_size)
1936         STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
1937      else
1938         STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
1933      STORE_RM32(modrm, MMX((modrm >> 3) & 0x7).d[0]);
19391934   } else {
19401935      UINT32 ea = GetEA(modrm, 0);
1941      if (m_xmm_operand_size)
1942         WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
1943      else
1944         WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
1936      WRITE32(ea, MMX((modrm >> 3) & 0x7).d[0]);
19451937   }
19461938   CYCLES(1);     // TODO: correct cycle count
19471939}
r243715r243716
19511943   MMXPROLOG();
19521944   UINT8 modrm = FETCH();
19531945   if( modrm >= 0xc0 ) {
1954      if (m_xmm_operand_size)
1955         XMM(modrm & 0x7).l[0]=XMM((modrm >> 3) & 0x7).l[0];
1956      else
1957         MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
1946      MMX(modrm & 0x7)=MMX((modrm >> 3) & 0x7);
19581947   } else {
19591948      UINT32 ea = GetEA(modrm, 0);
19601949      WRITEMMX(ea, MMX((modrm >> 3) & 0x7));
r243715r243716
20592048   CYCLES(1);     // TODO: correct cycle count
20602049}
20612050
2051void i386_device::sse_punpcklbw_r128_rm128() // Opcode 66 0f 60
2052{
2053   UINT8 modrm = FETCH();
2054   if (modrm >= 0xc0) {
2055      XMM_REG xd,xs;
2056      int s, d;
2057      s = modrm & 0x7;
2058      d = (modrm >> 3) & 0x7;
2059      xd.l[0] = XMM(d).l[0];
2060      xs.l[0] = XMM(s).l[0];
2061      XMM(d).b[0] = xd.b[0];
2062      XMM(d).b[1] = xs.b[0];
2063      XMM(d).b[2] = xd.b[1];
2064      XMM(d).b[3] = xs.b[1];
2065      XMM(d).b[4] = xd.b[2];
2066      XMM(d).b[5] = xs.b[2];
2067      XMM(d).b[6] = xd.b[3];
2068      XMM(d).b[7] = xs.b[3];
2069      XMM(d).b[8] = xd.b[4];
2070      XMM(d).b[9] = xs.b[4];
2071      XMM(d).b[10] = xd.b[5];
2072      XMM(d).b[11] = xs.b[5];
2073      XMM(d).b[12] = xd.b[6];
2074      XMM(d).b[13] = xs.b[6];
2075      XMM(d).b[14] = xd.b[7];
2076      XMM(d).b[15] = xs.b[7];
2077   }
2078   else {
2079      XMM_REG xd, xs;
2080      int d = (modrm >> 3) & 0x7;
2081      UINT32 ea = GetEA(modrm, 0);
2082      xd.l[0] = XMM(d).l[0];
2083      xs.q[0] = READ64(ea);
2084      for (int n = 0; n < 8; n++) {
2085         XMM(d).b[n << 1] = xd.b[n];
2086         XMM(d).b[(n << 1) | 1] = xs.b[n];
2087      }
2088   }
2089   CYCLES(1);     // TODO: correct cycle count
2090}
2091
2092void i386_device::sse_punpcklwd_r128_rm128()
2093{
2094   UINT8 modrm = FETCH();
2095   if (modrm >= 0xc0) {
2096      XMM_REG xd, xs;
2097      int s, d;
2098      s = modrm & 0x7;
2099      d = (modrm >> 3) & 0x7;
2100      xd.l[0] = XMM(d).l[0];
2101      xs.l[0] = XMM(s).l[0];
2102      for (int n = 0; n < 4; n++) {
2103         XMM(d).w[n << 1] = xd.w[n];
2104         XMM(d).w[(n << 1) | 1] = xs.w[n];
2105      }
2106   }
2107   else {
2108      XMM_REG xd, xs;
2109      int d = (modrm >> 3) & 0x7;
2110      UINT32 ea = GetEA(modrm, 0);
2111      xd.l[0] = XMM(d).l[0];
2112      xs.q[0] = READ64(ea);
2113      for (int n = 0; n < 4; n++) {
2114         XMM(d).w[n << 1] = xd.w[n];
2115         XMM(d).w[(n << 1) | 1] = xs.w[n];
2116      }
2117   }
2118   CYCLES(1);     // TODO: correct cycle count
2119}
2120
2121void i386_device::sse_punpckldq_r128_rm128()
2122{
2123   UINT8 modrm = FETCH();
2124   if (modrm >= 0xc0) {
2125      XMM_REG xd, xs;
2126      int s, d;
2127      s = modrm & 0x7;
2128      d = (modrm >> 3) & 0x7;
2129      xd.l[0] = XMM(d).l[0];
2130      xs.l[0] = XMM(s).l[0];
2131      for (int n = 0; n < 2; n++) {
2132         XMM(d).d[n << 1] = xd.d[n];
2133         XMM(d).d[(n << 1) | 1] = xs.d[n];
2134      }
2135   }
2136   else {
2137      XMM_REG xd, xs;
2138      int d = (modrm >> 3) & 0x7;
2139      UINT32 ea = GetEA(modrm, 0);
2140      xd.l[0] = XMM(d).l[0];
2141      xs.q[0] = READ64(ea);
2142      for (int n = 0; n < 2; n++) {
2143         XMM(d).d[n << 1] = xd.d[n];
2144         XMM(d).d[(n << 1) | 1] = xs.d[n];
2145      }
2146   }
2147   CYCLES(1);     // TODO: correct cycle count
2148}
2149
2150void i386_device::sse_punpcklqdq_r128_rm128()
2151{
2152   UINT8 modrm = FETCH();
2153   if (modrm >= 0xc0) {
2154      XMM_REG xd, xs;
2155      int s, d;
2156      s = modrm & 0x7;
2157      d = (modrm >> 3) & 0x7;
2158      xd.l[0] = XMM(d).l[0];
2159      xs.l[0] = XMM(s).l[0];
2160      XMM(d).q[0] = xd.q[0];
2161      XMM(d).q[1] = xs.q[0];
2162   }
2163   else {
2164      XMM_REG xd, xs;
2165      int d = (modrm >> 3) & 0x7;
2166      UINT32 ea = GetEA(modrm, 0);
2167      xd.l[0] = XMM(d).l[0];
2168      xs.q[0] = READ64(ea);
2169      XMM(d).q[0] = xd.q[0];
2170      XMM(d).q[1] = xs.q[0];
2171   }
2172   CYCLES(1);     // TODO: correct cycle count
2173}
2174
20622175void i386_device::mmx_punpcklbw_r64_r64m32() // Opcode 0f 60
20632176{
20642177   MMXPROLOG();
r243715r243716
23942507   CYCLES(1);     // TODO: correct cycle count
23952508}
23962509
2397void i386_device::sse_sse_group0fae()  // Opcode 0f ae
2510void i386_device::sse_group_0fae()  // Opcode 0f ae
23982511{
23992512   UINT8 modm = FETCH();
24002513   if( modm == 0xf8 ) {
r243715r243716
24202533            GetNonTranslatedEA(modm, NULL);
24212534            break;
24222535         default:
2423            report_invalid_modrm("sse_group0fae", modm);
2536            report_invalid_modrm("sse_group_0fae", modm);
24242537      }
24252538   } else {
2426      report_invalid_modrm("sse_group0fae", modm);
2539      report_invalid_modrm("sse_group_0fae", modm);
24272540   }
24282541}
24292542
r243715r243716
28572970   CYCLES(1);     // TODO: correct cycle count
28582971}
28592972
2973void i386_device::sse_movd_m128_rm32() // Opcode 66 0f 6e
2974{
2975   UINT8 modrm = FETCH();
2976   if (modrm >= 0xc0) {
2977      XMM((modrm >> 3) & 0x7).d[0] = LOAD_RM32(modrm);
2978   }
2979   else {
2980      UINT32 ea = GetEA(modrm, 0);
2981      XMM((modrm >> 3) & 0x7).d[0] = READ32(ea);
2982   }
2983   XMM((modrm >> 3) & 0x7).d[1] = 0;
2984   XMM((modrm >> 3) & 0x7).q[1] = 0;
2985   CYCLES(1);     // TODO: correct cycle count
2986}
2987
2988void i386_device::sse_movdqa_m128_rm128() // Opcode 66 0f 6f
2989{
2990   UINT8 modrm = FETCH();
2991   if (modrm >= 0xc0) {
2992      XMM((modrm >> 3) & 0x7).q[0] = XMM(modrm & 0x7).q[0];
2993      XMM((modrm >> 3) & 0x7).q[1] = XMM(modrm & 0x7).q[1];
2994   }
2995   else {
2996      UINT32 ea = GetEA(modrm, 0);
2997      READXMM(ea, XMM((modrm >> 3) & 0x7));
2998   }
2999   CYCLES(1);     // TODO: correct cycle count
3000}
3001
28603002void i386_device::sse_movq_r128_r128m64() // Opcode f3 0f 7e
28613003{
28623004   MMXPROLOG();
r243715r243716
28723014   CYCLES(1);     // TODO: correct cycle count
28733015}
28743016
3017void i386_device::sse_movd_rm32_r128() // Opcode 66 0f 7e
3018{
3019   UINT8 modrm = FETCH();
3020   if (modrm >= 0xc0) {
3021      STORE_RM32(modrm, XMM((modrm >> 3) & 0x7).d[0]);
3022   }
3023   else {
3024      UINT32 ea = GetEA(modrm, 0);
3025      WRITE32(ea, XMM((modrm >> 3) & 0x7).d[0]);
3026   }
3027   CYCLES(1);     // TODO: correct cycle count
3028}
3029
3030void i386_device::sse_movdqa_rm128_r128() // Opcode 66 0f 7f
3031{
3032   UINT8 modrm = FETCH();
3033   if (modrm >= 0xc0) {
3034      XMM(modrm & 0x7).q[0] = XMM((modrm >> 3) & 0x7).q[0];
3035      XMM(modrm & 0x7).q[1] = XMM((modrm >> 3) & 0x7).q[1];
3036   }
3037   else {
3038      UINT32 ea = GetEA(modrm, 0);
3039      WRITEXMM(ea, XMM((modrm >> 3) & 0x7));
3040   }
3041   CYCLES(1);     // TODO: correct cycle count
3042}
3043
28753044void i386_device::sse_pmovmskb_r16_r64() // Opcode 0f d7
28763045{
28773046   //MMXPROLOG();
r243715r243716
34703639      UINT32 ea = GetEA(modrm, 0);
34713640      READXMM(ea, src);
34723641      t1 = XMM(d).d[2];
3473      t3 = XMM(d).d[3];
3642      t2 = XMM(d).d[3];
34743643      XMM(d).d[0]=t1;
34753644      XMM(d).d[1]=src.d[2];
3476      XMM(d).d[2]=t3;
3645      XMM(d).d[2]=t2;
34773646      XMM(d).d[3]=src.d[3];
34783647   }
34793648   CYCLES(1);     // TODO: correct cycle count
r243715r243716
36193788   CYCLES(1);     // TODO: correct cycle count
36203789}
36213790
3622void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4
3791void i386_device::sse_pinsrw_r64_r16m16_i8() // Opcode 0f c4, 16bit register
36233792{
36243793   MMXPROLOG();
36253794   UINT8 modrm = FETCH();
r243715r243716
36423811   CYCLES(1);     // TODO: correct cycle count
36433812}
36443813
3645void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4
3814void i386_device::sse_pinsrw_r64_r32m16_i8() // Opcode 0f c4, 32bit register
36463815{
36473816   MMXPROLOG();
36483817   UINT8 modrm = FETCH();
36493818   if( modrm >= 0xc0 ) {
36503819      UINT8 imm8 = FETCH();
36513820      UINT16 v = (UINT16)LOAD_RM32(modrm);
3652      if (m_xmm_operand_size)
3653         XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3654      else
3655         MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
3821      MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
36563822   } else {
36573823      UINT32 ea = GetEA(modrm, 0);
36583824      UINT8 imm8 = FETCH();
36593825      UINT16 v = READ16(ea);
3660      if (m_xmm_operand_size)
3661         XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3662      else
3663         MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
3826      MMX((modrm >> 3) & 0x7).w[imm8 & 3] = v;
36643827   }
36653828   CYCLES(1);     // TODO: correct cycle count
36663829}
36673830
3831void i386_device::sse_pinsrw_r128_r32m16_i8() // Opcode 66 0f c4
3832{
3833   UINT8 modrm = FETCH();
3834   if (modrm >= 0xc0) {
3835      UINT8 imm8 = FETCH();
3836      UINT16 v = (UINT16)LOAD_RM32(modrm);
3837      XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3838   }
3839   else {
3840      UINT32 ea = GetEA(modrm, 0);
3841      UINT8 imm8 = FETCH();
3842      UINT16 v = READ16(ea);
3843      XMM((modrm >> 3) & 0x7).w[imm8 & 7] = v;
3844   }
3845   CYCLES(1);     // TODO: correct cycle count
3846}
3847
36683848void i386_device::sse_pextrw_r16_r64_i8() // Opcode 0f c5
36693849{
36703850   //MMXPROLOG();
r243715r243716
36883868   UINT8 modrm = FETCH();
36893869   if( modrm >= 0xc0 ) {
36903870      UINT8 imm8 = FETCH();
3691      if (m_xmm_operand_size)
3692         STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
3693      else
3694         STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
3871      STORE_REG32(modrm, MMX(modrm & 0x7).w[imm8 & 3]);
36953872   } else {
36963873      //UINT8 imm8 = FETCH();
36973874      report_invalid_modrm("pextrw_r32_r64_i8", modrm);
r243715r243716
36993876   CYCLES(1);     // TODO: correct cycle count
37003877}
37013878
3879void i386_device::sse_pextrw_reg_r128_i8() // Opcode 66 0f c5
3880{
3881   UINT8 modrm = FETCH();
3882   if (modrm >= 0xc0) {
3883      UINT8 imm8 = FETCH();
3884      STORE_REG32(modrm, XMM(modrm & 0x7).w[imm8 & 7]);
3885   }
3886   else {
3887      //UINT8 imm8 = FETCH();
3888      report_invalid_modrm("sse_pextrw_reg_r128_i8", modrm);
3889   }
3890   CYCLES(1);     // TODO: correct cycle count
3891}
3892
37023893void i386_device::sse_pminub_r64_rm64() // Opcode 0f da
37033894{
37043895   int n;
trunk/src/mess/audio/gamate.c
r243715r243716
1/***************************************************************************
2 gamate sound hardware
3
4 PeT mess@utanet.at
5***************************************************************************/
6
7#include "emu.h"
8#include "includes/gamate.h"
9
10
11// device type definition
12const device_type GAMATE_SND = &device_creator<gamate_sound_device>;
13
14
15//**************************************************************************
16//  LIVE DEVICE
17//**************************************************************************
18
19//-------------------------------------------------
20//  gamate_sound_device - constructor
21//-------------------------------------------------
22
23gamate_sound_device::gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
24   : device_t(mconfig, GAMATE_SND, "Gamate Audio Custom", tag, owner, clock, "gamate_sound", __FILE__),
25      device_sound_interface(mconfig, *this),
26      m_mixer_channel(NULL)
27{
28}
29
30
31//-------------------------------------------------
32//  device_start - device-specific startup
33//-------------------------------------------------
34
35void gamate_sound_device::device_start()
36{
37   // bind callbacks
38//   m_irq_cb.bind_relative_to(*owner());
39
40   memset(m_channels, 0, sizeof(m_channels));
41   memset(reg, 0, sizeof(reg));
42
43   m_mixer_channel = stream_alloc(0, 2, machine().sample_rate());
44}
45
46
47//-------------------------------------------------
48//  sound_stream_update - handle a stream update
49//-------------------------------------------------
50
51void gamate_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
52{
53   stream_sample_t *left=outputs[0], *right=outputs[1];
54   int i, j;
55   GAMATE_CHANNEL *channel;
56
57   for (i = 0; i < samples; i++, left++, right++)
58   {
59      *left = 0;
60      *right = 0;
61      for (channel=m_channels, j=0; j<ARRAY_LENGTH(m_channels); j++, channel++)
62      {
63         if (channel->size != 0)
64         {
65            if (channel->on)//||channel->count)
66            {
67               int on = FALSE;
68               on = channel->pos <= channel->size / 2;
69               {
70                  INT16 s = on ? channel->volume << 8 : 0;
71                  if (j == 0)
72                     *right += s;
73                  else if (j==1)
74                     *left += s;
75                  else {
76                     *right += s;
77                     *left += s;
78                  }
79               }
80            }
81            channel->pos++;
82            if (channel->pos >= channel->size)
83               channel->pos = 0;
84         }
85      }
86   }
87}
88
89WRITE8_MEMBER( gamate_sound_device::device_w )
90{
91   UINT16 size;
92
93   m_mixer_channel->update();
94   reg[offset] = data;
95   int chan=-1;
96   
97   switch (offset)
98   {
99      case 0:
100      case 1:
101      case 2:
102      case 3:
103      case 4:
104      case 5:
105        chan=offset/2;
106         size = reg[chan*2] | ((reg[chan*2+1] & 0xf) << 8);
107         if (size)
108         {
109            m_channels[chan].size= (int) (machine().sample_rate() * (size << 5) / machine().device("maincpu")->unscaled_clock());
110         }
111         else
112         {
113            m_channels[chan].size = 0;
114         }
115         m_channels[chan].pos = 0;
116         break;
117      case 6:
118      case 7:
119      case 8:
120        chan=offset-6;
121//         m_channels[chan]->on = data & 0x40;
122//         channel->waveform = (data & 0x30) >> 4;
123         m_channels[chan].volume = data & 0xf;
124         break;
125   }
126  if (chan!=-1) m_channels[chan].on=m_channels[chan].volume!=0 && m_channels[chan].size>3/* avoid speed loss for unhearable >=23khz*/; 
127}
trunk/src/mess/drivers/gamate.c
r243715r243716
1010#include "bus/generic/slot.h"
1111#include "bus/generic/carts.h"
1212#include "rendlay.h"
13#include "includes/gamate.h"
14#include "ui/ui.h"
1513
14//#define USE_GFX
15
1616class gamate_state : public driver_device
1717{
1818public:
1919   gamate_state(const machine_config &mconfig, device_type type, const char *tag)
2020      : driver_device(mconfig, type, tag)
2121      , m_maincpu(*this, "maincpu")
22      , m_sound(*this, "custom")
2322      , m_cart(*this, "cartslot")
23#ifdef USE_GFX
24      , m_gfxdecode(*this, "gfxdecode")
25#endif
2426      , m_io_joy(*this, "JOY")
2527      , m_palette(*this, "palette")
2628      , m_bios(*this, "bios")
r243715r243716
5153
5254   struct
5355   {
54     UINT8 reg[8];
55     struct {
56       bool write;
57       bool page2; // else page1
56   UINT8 reg[8];
57   struct {
58      bool write;
59      bool page2; // else page1
5860   UINT8 ypos, xpos/*tennis*/;
59       UINT8 data[2][0x100][0x20];
60     } bitmap;
61     UINT8 x, y;
61      UINT8 data[2][0x100][0x20];
62      } bitmap;
63   UINT8 x, y;
6264      bool y_increment;
6365   } video;
6466
6567   struct {
66     bool set;
68      bool set;
6769      int bit_shifter;
6870      UINT8 cartridge_byte;
6971      UINT16 address; // in reality something more like short local cartridge address offset
7072      bool unprotected;
7173      bool failed;
72     
74
7375   } card_protection;
7476
7577   required_device<cpu_device> m_maincpu;
76   required_device<gamate_sound_device> m_sound;
7778   required_device<generic_slot_device> m_cart;
79#ifdef USE_GFX
80   required_device<gfxdecode_device> m_gfxdecode;
81#endif
7882   required_ioport m_io_joy;
7983   required_device<palette_device> m_palette;
8084   required_shared_ptr<UINT8> m_bios;
8185   emu_timer *timer1;
8286   emu_timer *timer2;
83   UINT8 bank_multi; 
87   UINT8 bank_multi;
88   UINT8 *m_cart_ptr;
8489};
8590
8691WRITE8_MEMBER( gamate_state::gamate_cart_protection_w )
8792{
88        logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
89 
93      logerror("%.6f protection write %x %x address:%x data:%x shift:%d\n",machine().time().as_double(), offset, data, card_protection.address, card_protection.cartridge_byte, card_protection.bit_shifter);
94
9095   switch (offset) {
9196   case 0:
9297      card_protection.failed= card_protection.failed || ((card_protection.cartridge_byte&0x80)!=0) != ((data&4)!=0);
9398      card_protection.bit_shifter++;
9499      if (card_protection.bit_shifter>=8) {
95         card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];
100         card_protection.cartridge_byte=m_cart_ptr[card_protection.address++];
96101         card_protection.bit_shifter=0;
97102      }
98103      break;
r243715r243716
102107{
103108   UINT8 ret=1;
104109   if (card_protection.bit_shifter==7 && card_protection.unprotected) {
105   ret=m_cart->get_rom_base()[bank_multi*0x4000];
110   ret=m_cart_ptr[bank_multi*0x4000];
106111   } else {
107112   card_protection.bit_shifter++;
108113   if (card_protection.bit_shifter==8) {
r243715r243716
112117   }
113118   ret=(card_protection.cartridge_byte&0x80)?2:0;
114119   if (card_protection.bit_shifter==7 && !card_protection.failed) { // now protection chip on cartridge activates cartridge chip select on cpu accesses
115//        m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working
120//        m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r)); // next time I will try to get this working
116121   }
117122   card_protection.cartridge_byte<<=1;
118123   }
r243715r243716
127132   // writes 0x20
128133   card_protection.address=0x6005-0x6001;
129134   card_protection.bit_shifter=0;
130   card_protection.cartridge_byte=m_cart->get_rom_base()[card_protection.address++];//m_cart_rom[card_protection.address++];
135   card_protection.cartridge_byte=m_cart_ptr[card_protection.address++];//m_cart_rom[card_protection.address++];
131136   card_protection.failed=false;
132137   card_protection.unprotected=false;
133138}
r243715r243716
143148{
144149   video.reg[offset]=data;
145150   switch (offset) {
146   case 1:
147      if (data&0xf) printf("lcd mode %x\n", data);
148      video.bitmap.write=data&0xc0; // more addressing mode
151   case 1: video.bitmap.write=data&0xc0; // more addressing mode
149152      video.y_increment=data&0x40;
150153      break;
151   case 2: video.bitmap.xpos=data;break;
152   case 3:
153      if (data>=200) printf("lcd ypos: %x\n", data);
154      video.bitmap.ypos=data;
155      break;
154   case 2: video.bitmap.xpos=data;break; // at least 7 bits
155   case 3: video.bitmap.ypos=data;break; // at least 7 bits
156156   case 4: video.bitmap.page2=data&0x80;video.x=data&0x7f;break;
157157   case 5: video.y=data;break;
158158   case 7:
159   if (video.y>=200)
160   machine().ui().popup_time(2, "bitmap write to x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data);
161159   if (video.bitmap.write) {
160      if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/)
162161      video.bitmap.data[video.bitmap.page2][video.y][video.x]=data;
162      else
163      logerror("%.6f %04x video bitmap x %x invalid\n",machine().time().as_double(), m_maincpu->pc(), video.x);
163164   } else {
164165      video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)]=data;
165166   }
r243715r243716
171172WRITE8_MEMBER( gamate_state::cart_bankswitchmulti_w )
172173{
173174   bank_multi=data;
174   membank("bankmulti")->set_base(m_cart->get_rom_base()+0x4000*data+1);
175   membank("bankmulti")->set_base(m_cart_ptr+0x4000*data+1);
175176}
176177
177178WRITE8_MEMBER( gamate_state::cart_bankswitch_w )
178179{
179   membank("bank")->set_base(m_cart->get_rom_base()+0x4000*data);
180   membank("bank")->set_base(m_cart_ptr+0x4000*data);
180181}
181182
182183READ8_MEMBER( gamate_state::gamate_video_r )
183184{
184  if (offset!=6) return 0;
185  UINT8 data=0;
186  if (video.bitmap.write) {
187    data=video.bitmap.data[video.bitmap.page2][video.y][video.x];
188  } else {
189    data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)];
190  }
191//  if (m_maincpu->pc()<0xf000)
192//    machine().ui().popup_time(2, "lcd read x:%x y:%x mode:%x data:%x\n", video.x, video.y, video.reg[1], data);
193  return data;
185   if (offset!=6) return 0;
186   UINT8 data=0;
187   if (video.bitmap.write) {
188      if (video.x<ARRAY_LENGTH(video.bitmap.data[0][0]) /*&& video.y<ARRAY_LENGTH(video.bitmap.data[0])*/)
189      data=video.bitmap.data[video.bitmap.page2][video.y][video.x];
190      else
191      logerror("%.6f video bitmap x %x invalid\n",machine().time().as_double(),video.x);
192   } else {
193   data=video.bitmap.data[0][video.y][video.x&(ARRAY_LENGTH(video.bitmap.data[0][0])-1)];
194   }
195   if (m_maincpu->pc()<0xf000)
196   logerror("%.6f video read %04x %02x\n",machine().time().as_double(),offset, data);
197   return data;
194198}
195199
196200WRITE8_MEMBER( gamate_state::gamate_audio_w )
197201{
198//  printf("audio write %x:%x\n", offset, data);//logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data);
199  m_sound->device_w(space, offset, data);
202   logerror("%.6f %04x audio write %04x %02x\n",machine().time().as_double(),m_maincpu->pc(),offset,data);
200203}
201204
202205READ8_MEMBER( gamate_state::gamate_audio_r )
203206{
204// legend of dragon knight
205//  machine().ui().popup_time(2, "%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset);
206  return 0;
207   logerror("%.6f %04x audio read %04x \n",machine().time().as_double(),m_maincpu->pc(),offset);
208   return 0;
207209}
208210
209211
210212READ8_MEMBER( gamate_state::gamate_pad_r )
211213{
212  UINT8 data=m_io_joy->read();
213  return data;
214   UINT8 data=m_io_joy->read();
215   return data;
214216}
215217
216218static ADDRESS_MAP_START( gamate_mem, AS_PROGRAM, 8, gamate_state )
217    AM_RANGE(0x0000, 0x03ff) AM_RAM
218  AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w)
219  AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r)
220  AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w)
221  AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set)
222  AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset)
223  AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r)
219   AM_RANGE(0x0000, 0x03ff) AM_RAM
220   AM_RANGE(0x4000, 0x400d) AM_READWRITE(gamate_audio_r, gamate_audio_w)
221   AM_RANGE(0x4400, 0x4400) AM_READ(gamate_pad_r)
222   AM_RANGE(0x5000, 0x5007) AM_READWRITE(gamate_video_r, gamate_video_w)
223   AM_RANGE(0x5800, 0x5800) AM_READ(newer_protection_set)
224   AM_RANGE(0x5900, 0x5900) AM_WRITE(protection_reset)
225   AM_RANGE(0x5a00, 0x5a00) AM_READ(protection_r)
224226
225  AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti")
226  AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank")
227   AM_RANGE(0x6001, 0x9fff) AM_READ_BANK("bankmulti")
228   AM_RANGE(0xa000, 0xdfff) AM_READ_BANK("bank")
227229
228230   AM_RANGE(0x6000, 0x6000) AM_READWRITE(gamate_cart_protection_r, gamate_cart_protection_w)
229231   AM_RANGE(0x8000, 0x8000) AM_WRITE(cart_bankswitchmulti_w)
230232   AM_RANGE(0xc000, 0xc000) AM_WRITE(cart_bankswitch_w)
231233
232  AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios")
234   AM_RANGE(0xf000, 0xffff) AM_ROM AM_SHARE("bios")
233235ADDRESS_MAP_END
234236
235237
r243715r243716
245247   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SELECT) PORT_NAME("Select")
246248INPUT_PORTS_END
247249
248static const unsigned short gamate_palette[4] =
250#ifdef USE_GFX
251static const struct gfx_layout gamate_charlayout =
249252{
250   0,1,2,3
253      4,      /* width of object */
254      1,      /* height of object */
255      256,/* 256 characters */
256      2,      /* bits per pixel */
257      { 0,4 }, /* no bitplanes */
258      /* x offsets */
259      { 0,1,2,3 },
260      /* y offsets */
261      { 0 },
262      8*1 /* size of 1 object in bits */
251263};
252264
265static GFXDECODE_START( gamate )
266      GFXDECODE_ENTRY( "gfx1", 0x0000, gamate_charlayout, 0, 0x100 )
267GFXDECODE_END
268#endif
253269
254270/* palette in red, green, blue tribles */
255271static const unsigned char gamate_colors[4][3] =
256272{
257  { 255,255,255 },
258  { 0xa0, 0xa0, 0xa0 },
259  { 0x60, 0x60, 0x60 },
260  { 0, 0, 0 }
273   { 255,255,255 },
274   { 0xa0, 0xa0, 0xa0 },
275   { 0x60, 0x60, 0x60 },
276   { 0, 0, 0 }
261277};
262278
263279PALETTE_INIT_MEMBER(gamate_state, gamate)
r243715r243716
270286   }
271287}
272288
289#ifndef USE_GFX
273290static void BlitPlane(UINT16* line, UINT8 plane1, UINT8 plane2)
274291{
275292   line[3]=(plane1&1)|((plane2<<1)&2);
r243715r243716
277294   line[1]=((plane1>>2)&1)|((plane2>>1)&2);
278295   line[0]=((plane1>>3)&1)|((plane2>>2)&2);
279296}
297#endif
280298
281299UINT32 gamate_state::screen_update_gamate(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
282300{
283  int x, y, j;
284  for (y=0;y<152;y++) {
285    for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) {     
286      UINT8 d1, d2;
287      if (video.bitmap.ypos<200) {
288   d1=video.bitmap.data[0][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f];
289   d2=video.bitmap.data[1][(y+video.bitmap.ypos)%200][(j+video.bitmap.xpos/8)&0x1f];
290      } else if ((video.bitmap.ypos&0xf)<8) { // lcdtest, of course still some registers not known, my gamate doesn't display bottom lines
291   int yi=(y+(video.bitmap.ypos&0xf)-8);
292   if (yi<0) yi=video.bitmap.ypos+y; // in this case only 2nd plane used!?, source of first plane?
293   d1=video.bitmap.data[0][yi][(j+video.bitmap.xpos/8)&0x1f]; // value of lines bevor 0 chaos
294   d2=video.bitmap.data[1][yi][(j+video.bitmap.xpos/8)&0x1f];
295      } else {
296   d1=video.bitmap.data[0][y][(j+video.bitmap.xpos/8)&0x1f];
297   d2=video.bitmap.data[1][y][(j+video.bitmap.xpos/8)&0x1f];   
298      }
299      BlitPlane(&bitmap.pix16(y, x+4), d1, d2);
300      BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4);
301    }
302  }
303  return 0;
301   int x, y, j;
302   for (y=0;y<152;y++) {
303   for (x=-(video.bitmap.xpos&7), j=0;x<160;x+=8, j++) {
304      UINT8 d1=video.bitmap.data[0][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f];
305      UINT8 d2=video.bitmap.data[1][(y+video.bitmap.ypos)&0xff][(j+video.bitmap.xpos/8)&0x1f];
306#ifdef USE_GFX
307      m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, (d1&0xf)|((d2&0xf)<<4), 0,0,0,x+4,y);
308   m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, (d1>>4)|(d2&0xf0),0,0,0,x,y);
309#else
310      BlitPlane(&bitmap.pix16(y, x+4), d1, d2);
311      BlitPlane(&bitmap.pix16(y, x), d1>>4, d2>>4);
312#endif
313   }
314   }
315   return 0;
304316}
305317
306318DRIVER_INIT_MEMBER(gamate_state,gamate)
307319{
308320   memset(&video, 0, sizeof(video));/* memset(m_ram, 0, sizeof(m_ram));*/
321#ifdef USE_GFX
322   UINT8 *gfx=memregion("gfx1")->base();
323   for (int i=0; i<256; i++) gfx[i]=i;
324#endif
309325   timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer),this));
310326   timer2 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(gamate_state::gamate_timer2),this));
311327}
r243715r243716
313329
314330void gamate_state::machine_start()
315331{
332   m_cart_ptr = memregion("maincpu")->base() + 0x6000;
316333   if (m_cart->exists()) {
317//      m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r));
334//      m_maincpu->space(AS_PROGRAM).install_read_handler(0x6000, 0x6000, READ8_DELEGATE(gamate_state, gamate_cart_protection_r));
335      m_cart_ptr = m_cart->get_rom_base();
318336      membank("bankmulti")->set_base(m_cart->get_rom_base()+1);
319337      membank("bank")->set_base(m_cart->get_rom_base()+0x4000); // bankswitched games in reality no offset
320338   }
321//   m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback
339//  m_bios[0xdf1]=0xea; m_bios[0xdf2]=0xea; // default bios: $47 protection readback
322340   card_protection.set=false;
323341   bank_multi=0;
324342   card_protection.unprotected=false;
r243715r243716
349367   timer1->enable(TRUE);
350368   timer1->reset(m_maincpu->cycles_to_attotime(10/* cycles short enought to clear irq line early enough*/));
351369   timer2->enable(TRUE);
352   timer2->reset(m_maincpu->cycles_to_attotime(32768/2));
370   timer2->reset(m_maincpu->cycles_to_attotime(40000));
353371}
354372
355373
r243715r243716
358376}
359377
360378static MACHINE_CONFIG_START( gamate, gamate_state )
361   MCFG_CPU_ADD("maincpu", M6502, 4433000/2)
379   MCFG_CPU_ADD("maincpu", M6502, 4433000)
362380   MCFG_CPU_PROGRAM_MAP(gamate_mem)
363381   MCFG_CPU_VBLANK_INT_DRIVER("screen", gamate_state,  gamate_interrupt)
364382
r243715r243716
369387   MCFG_SCREEN_UPDATE_DRIVER(gamate_state, screen_update_gamate)
370388   MCFG_SCREEN_PALETTE("palette")
371389
390#ifdef USE_GFX
391   MCFG_GFXDECODE_ADD("gfxdecode", "palette", gamate )
392#endif
372393   MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(gamate_colors))
373394   MCFG_PALETTE_INIT_OWNER(gamate_state, gamate)
374395   MCFG_DEFAULT_LAYOUT(layout_lcd)
375396
376   /* sound hardware */
377   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
378   MCFG_SOUND_ADD("custom", GAMATE_SND, 0)
379   MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
380   MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
381   
382397   MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "gamate_cart")
383398   MCFG_GENERIC_MANDATORY
384399
r243715r243716
392407   ROMX_LOAD("gamate_bios_umc.bin", 0xf000, 0x1000, CRC(07090415) SHA1(ea449dc607601f9a68d855ad6ab53800d2e99297), ROM_BIOS(1) )
393408   ROM_SYSTEM_BIOS(1, "newer", "NEWER")
394409   ROMX_LOAD("gamate_bios_9130__unknown__bit_icasc00001_9130-bs_r32261.bin", 0xf000, 0x1000, CRC(03a5f3a7) SHA1(4e9dfbfe916ca485530ef4221593ab68738e2217), ROM_BIOS(2) )
410#ifdef USE_GFX
411   ROM_REGION(0x100,"gfx1", ROMREGION_ERASEFF)
412#endif
395413ROM_END
396414
397415
398416/*    YEAR  NAME      PARENT  COMPAT    MACHINE   INPUT    CLASS          INIT      COMPANY    FULLNAME */
399CONS( 19??, gamate,  0,      0,        gamate,  gamate, gamate_state, gamate, "Bit Corp", "Gamate", GAME_IMPERFECT_SOUND)
400
401
417CONS( 19??, gamate,  0,      0,        gamate,  gamate, gamate_state, gamate, "Bit Corp", "Gamate", GAME_NO_SOUND)
trunk/src/mess/includes/gamate.h
r243715r243716
1/*****************************************************************************
2 *
3 * includes/gamate.h
4 *
5 ****************************************************************************/
6
7#ifndef GAMATE_H_
8#define GAMATE_H_
9
10#include "cpu/m6502/m6502.h"
11#include "bus/generic/slot.h"
12#include "bus/generic/carts.h"
13
14struct GAMATE_CHANNEL
15{
16   GAMATE_CHANNEL() :
17//      on(0),
18//      waveform(0),
19      volume(0),
20      pos(0),
21      size(0)
22//      count(0)
23   {
24   }
25
26   int on;
27   int /*waveform,*/ volume;
28   int pos;
29   int size;
30//   int count;
31};
32
33
34// ======================> gamate_sound_device
35
36class gamate_sound_device : public device_t,
37                        public device_sound_interface
38{
39public:
40   gamate_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
41   ~gamate_sound_device() { }
42
43protected:
44   // device-level overrides
45   virtual void device_start();
46
47   // sound stream update overrides
48   virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
49
50public:
51   DECLARE_WRITE8_MEMBER( device_w );
52
53private:
54 
55   sound_stream *m_mixer_channel;
56   GAMATE_CHANNEL m_channels[3];
57   UINT8 reg[14];
58};
59
60extern const device_type GAMATE_SND;
61
62#endif /* GAMATE_H_ */
trunk/src/mess/mess.mak
r243715r243716
19501950   $(MESS_DRIVERS)/fc100.o     \
19511951   $(MESS_DRIVERS)/fk1.o       \
19521952   $(MESS_DRIVERS)/ft68m.o     \
1953   $(MESS_DRIVERS)/gamate.o    $(MESS_AUDIO)/gamate.o    \
1953   $(MESS_DRIVERS)/gamate.o    \
19541954   $(MESS_DRIVERS)/gameking.o  \
19551955   $(MESS_DRIVERS)/gimix.o     \
19561956   $(MESS_DRIVERS)/grfd2301.o  \


Previous 199869 Revisions Next


© 1997-2024 The MAME Team