trunk/src/emu/cpu/arcompact/arcompact_execute.c
| r242568 | r242569 | |
| 1480 | 1480 | else if (a == 3) |
| 1481 | 1481 | { |
| 1482 | 1482 | if (Z == 0) |
| 1483 | { |
| 1483 | 1484 | address = address + (s << 2); |
| 1484 | | else if (Z==2) |
| 1485 | } |
| 1486 | else if (Z == 2) |
| 1487 | { |
| 1485 | 1488 | address = address + (s << 1); |
| 1489 | } |
| 1486 | 1490 | else // Z == 1 and Z == 3 are invalid here |
| 1487 | | arcompact_fatal("illegal LD %08x (data size %d mode %d)", op, Z, a); |
| 1491 | { |
| 1492 | arcompact_fatal("zz_ illegal LD %08x (data size %d mode %d)", op, Z, a); |
| 1493 | } |
| 1488 | 1494 | } |
| 1489 | 1495 | |
| 1490 | 1496 | UINT32 readdata = 0; |
| r242568 | r242569 | |
| 1516 | 1522 | } |
| 1517 | 1523 | else if (Z == 3) |
| 1518 | 1524 | { // Z == 3 is always illegal |
| 1519 | | arcompact_fatal("illegal LD %08x (data size %d mode %d)", op, Z, a); |
| 1525 | arcompact_fatal("xx_ illegal LD %08x (data size %d mode %d)", op, Z, a); |
| 1520 | 1526 | } |
| 1521 | 1527 | |
| 1522 | 1528 | m_regs[areg] = readdata; |
| r242568 | r242569 | |
| 1524 | 1530 | // writeback / increment |
| 1525 | 1531 | if ((a == 1) || (a == 2)) |
| 1526 | 1532 | { |
| 1527 | | if (breg==limm) |
| 1528 | | arcompact_fatal("illegal LD %08x (data size %d mode %d)", op, Z, a); // using the LIMM as the base register and an increment mode is illegal |
| 1533 | if (breg==LIMM_REG) |
| 1534 | arcompact_fatal("yy_ illegal LD %08x (data size %d mode %d)", op, Z, a); // using the LIMM as the base register and an increment mode is illegal |
| 1529 | 1535 | |
| 1530 | 1536 | m_regs[breg] = m_regs[breg] + s; |
| 1531 | 1537 | } |
| r242568 | r242569 | |
| 1619 | 1625 | // writeback / increment |
| 1620 | 1626 | if ((a == 1) || (a == 2)) |
| 1621 | 1627 | { |
| 1622 | | if (breg==limm) |
| 1628 | if (breg==LIMM_REG) |
| 1623 | 1629 | arcompact_fatal("illegal ST %08x (data size %d mode %d)", op, Z, a); // using the LIMM as the base register and an increment mode is illegal |
| 1624 | 1630 | |
| 1625 | 1631 | m_regs[breg] = m_regs[breg] + s; |
| r242568 | r242569 | |
| 2033 | 2039 | // XOR |
| 2034 | 2040 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_07_p00(OPS_32) // XOR |
| 2035 | 2041 | { |
| 2036 | | int size = 4; |
| 2037 | | arcompact_fatal("arcompact_handle04_07_p00 (XOR)\n"); |
| 2042 | SETUP_HANDLE04_0x_P00 |
| 2043 | m_regs[areg] = b ^ c; |
| 2044 | |
| 2045 | if (F) |
| 2046 | { |
| 2047 | arcompact_fatal("arcompact_handle04_07_p00 (XOR) (F set)\n"); // not yet supported |
| 2048 | } |
| 2049 | |
| 2038 | 2050 | return m_pc + (size >> 0); |
| 2039 | 2051 | } |
| 2040 | 2052 | |
| r242568 | r242569 | |
| 2702 | 2714 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_04(OPS_32) { return arcompact_handle04_2f_helper(PARAMS, "RCC"); } // RCC |
| 2703 | 2715 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_05(OPS_32) { return arcompact_handle04_2f_helper(PARAMS, "SEXB"); } // SEXB |
| 2704 | 2716 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_06(OPS_32) { return arcompact_handle04_2f_helper(PARAMS, "SEXW"); } // SEXW |
| 2705 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07(OPS_32) { return arcompact_handle04_2f_helper(PARAMS, "EXTB"); } // EXTB |
| 2706 | 2717 | |
| 2718 | // EXTB |
| 2719 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07_p00(OPS_32) // note 'b' destination for 04_2f_07_xx group |
| 2720 | { |
| 2721 | SETUP_HANDLE04_2f_0x_P00; |
| 2722 | |
| 2723 | m_regs[breg] = c & 0x000000ff; |
| 2724 | if (F) |
| 2725 | { |
| 2726 | arcompact_fatal("arcompact_handle04_2f_08_p00 (EXTW) (F set)\n"); // not yet supported |
| 2727 | } |
| 2707 | 2728 | |
| 2729 | return m_pc + (size >> 0); |
| 2730 | } |
| 2731 | |
| 2732 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07_p01(OPS_32) |
| 2733 | { |
| 2734 | int size = 4; |
| 2735 | arcompact_fatal("arcompact_handle04_2f_07_p01 (EXTB)\n"); |
| 2736 | return m_pc + (size >> 0); |
| 2737 | } |
| 2738 | |
| 2739 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07_p10(OPS_32) |
| 2740 | { |
| 2741 | int size = 4; |
| 2742 | arcompact_fatal("illegal 04_2f_07_p10 (EXTB)\n"); // illegal mode because 'S' bits have already been used for opcode select |
| 2743 | return m_pc + (size >> 0); |
| 2744 | } |
| 2745 | |
| 2746 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07_p11_m0(OPS_32) |
| 2747 | { |
| 2748 | int size = 4; |
| 2749 | arcompact_fatal("arcompact_handle04_2f_07_p11_m0 (EXTB)\n"); // illegal mode because 'Q' bits have already been used for opcode select |
| 2750 | return m_pc + (size >> 0); |
| 2751 | } |
| 2752 | |
| 2753 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_07_p11_m1(OPS_32) |
| 2754 | { |
| 2755 | int size = 4; |
| 2756 | arcompact_fatal("arcompact_handle04_2f_07_p11_m1 (EXTB)\n"); // illegal mode because 'Q' bits have already been used for opcode select |
| 2757 | return m_pc + (size >> 0); |
| 2758 | } |
| 2759 | |
| 2708 | 2760 | // EXTW b <- c or EXTW b <- limm or EXTW limm <- c (no result) or EXTW limm, limm (invalid?) |
| 2709 | 2761 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_2f_08_p00(OPS_32) // note 'b' destination for 04_2f_08_xx group |
| 2710 | 2762 | { |
| r242568 | r242569 | |
| 2836 | 2888 | |
| 2837 | 2889 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle05_00_p01(OPS_32) |
| 2838 | 2890 | { |
| 2839 | | int size = 4; |
| 2840 | | arcompact_fatal("arcompact_handle05_00_p01 (ASL)\n"); |
| 2841 | | return m_pc + (size >> 0); |
| 2842 | | } |
| 2891 | SETUP_HANDLE04_0x_P01 |
| 2843 | 2892 | |
| 2893 | m_regs[areg] = b << (c&0x1f); // c = u |
| 2894 | |
| 2895 | if (F) |
| 2896 | { |
| 2897 | arcompact_fatal("arcompact_handle05_00_p01 (ASL) (F set)\n"); // not yet supported |
| 2898 | } |
| 2899 | |
| 2900 | return m_pc + (size >> 0);} |
| 2901 | |
| 2844 | 2902 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle05_00_p10(OPS_32) |
| 2845 | 2903 | { |
| 2846 | 2904 | int size = 4; |
| r242568 | r242569 | |
| 3059 | 3117 | } |
| 3060 | 3118 | |
| 3061 | 3119 | |
| 3062 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0d_00(OPS_16) |
| 3120 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0d_00(OPS_16) // ADD_S c, b, u3 (note, c destination) |
| 3063 | 3121 | { |
| 3064 | | return arcompact_handle0d_helper(PARAMS, "ADD_S"); |
| 3122 | int u, breg, creg; |
| 3123 | |
| 3124 | COMMON16_GET_u3; |
| 3125 | COMMON16_GET_breg; |
| 3126 | COMMON16_GET_creg; |
| 3127 | |
| 3128 | REG_16BIT_RANGE(breg); |
| 3129 | REG_16BIT_RANGE(creg); |
| 3130 | |
| 3131 | m_regs[creg] = m_regs[breg] + u; |
| 3132 | |
| 3133 | return m_pc + (2 >> 0); |
| 3065 | 3134 | } |
| 3066 | 3135 | |
| 3067 | 3136 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0d_01(OPS_16) |
| r242568 | r242569 | |
| 3116 | 3185 | |
| 3117 | 3186 | } |
| 3118 | 3187 | |
| 3119 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0e_00(OPS_16) |
| 3188 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0e_00(OPS_16) // ADD_s b, b, h |
| 3120 | 3189 | { |
| 3121 | | return arcompact_handle0e_0x_helper(PARAMS, "ADD_S", 0); |
| 3190 | int h,breg; |
| 3191 | int size = 2; |
| 3192 | |
| 3193 | GROUP_0e_GET_h; |
| 3194 | COMMON16_GET_breg; |
| 3195 | REG_16BIT_RANGE(breg); |
| 3196 | |
| 3197 | if (h == LIMM_REG) |
| 3198 | { |
| 3199 | UINT32 limm; |
| 3200 | GET_LIMM_16; |
| 3201 | size = 6; |
| 3202 | |
| 3203 | m_regs[breg] = m_regs[breg] + limm; |
| 3204 | |
| 3205 | } |
| 3206 | else |
| 3207 | { |
| 3208 | m_regs[breg] = m_regs[breg] + m_regs[h]; |
| 3209 | } |
| 3210 | |
| 3211 | return m_pc+ (size>>0); |
| 3122 | 3212 | } |
| 3123 | 3213 | |
| 3124 | 3214 | // 16-bit MOV with extended register range |
| r242568 | r242569 | |
| 3253 | 3343 | return m_pc + (2 >> 0); |
| 3254 | 3344 | } |
| 3255 | 3345 | |
| 3256 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_02(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "SUB_S",0); } |
| 3346 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_02(OPS_16) // SUB_S b <- b,c |
| 3347 | { |
| 3348 | int breg, creg; |
| 3349 | |
| 3350 | COMMON16_GET_breg; |
| 3351 | COMMON16_GET_creg; |
| 3352 | |
| 3353 | REG_16BIT_RANGE(breg); |
| 3354 | REG_16BIT_RANGE(creg); |
| 3355 | |
| 3356 | m_regs[breg] = m_regs[breg] - m_regs[creg]; |
| 3357 | |
| 3358 | return m_pc + (2 >> 0); |
| 3359 | } |
| 3360 | |
| 3361 | |
| 3257 | 3362 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_04(OPS_16) // AND_S b <- b, c |
| 3258 | 3363 | { |
| 3259 | 3364 | int breg, creg; |
| r242568 | r242569 | |
| 3530 | 3635 | return m_pc + (2 >> 0); |
| 3531 | 3636 | } |
| 3532 | 3637 | |
| 3533 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle17_03(OPS_16) |
| 3638 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle17_03(OPS_16) // SUB_S b,b,u5 |
| 3534 | 3639 | { |
| 3535 | | return arcompact_handle_l7_0x_helper(PARAMS, "SUB_S"); |
| 3640 | int breg, u; |
| 3641 | |
| 3642 | COMMON16_GET_breg; |
| 3643 | COMMON16_GET_u5; |
| 3644 | |
| 3645 | REG_16BIT_RANGE(breg); |
| 3646 | |
| 3647 | m_regs[breg] = m_regs[breg] - u; |
| 3648 | |
| 3649 | return m_pc + (2 >> 0); |
| 3536 | 3650 | } |
| 3537 | 3651 | |
| 3538 | 3652 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle17_04(OPS_16) // BSET_S b,b,u5 |
| r242568 | r242569 | |
| 3870 | 3984 | return realaddress; |
| 3871 | 3985 | } |
| 3872 | 3986 | |
| 3873 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_01(OPS_16) { return arcompact_handle1e_0x_helper(PARAMS, "BEQ_S"); } |
| 3987 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_01(OPS_16) // BEQ_S s10 (branch is zero bit is set) |
| 3988 | { |
| 3989 | if (STATUS32_CHECK_Z) |
| 3990 | { |
| 3991 | int s = (op & 0x01ff) >> 0; op &= ~0x01ff; |
| 3992 | if (s & 0x100) s = -0x100 + (s & 0xff); |
| 3993 | UINT32 realaddress = PC_ALIGNED32 + (s * 2); |
| 3994 | //m_regs[REG_BLINK] = m_pc + (2 >> 0); // don't link |
| 3995 | return realaddress; |
| 3996 | } |
| 3874 | 3997 | |
| 3998 | return m_pc + (2 >> 0); |
| 3999 | } |
| 4000 | |
| 3875 | 4001 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_02(OPS_16) // BNE_S s10 (branch if zero bit isn't set) |
| 3876 | 4002 | { |
| 3877 | 4003 | if (!STATUS32_CHECK_Z) |