trunk/src/emu/cpu/arcompact/arcompact.h
| r242590 | r242591 | |
| 165 | 165 | ARCOMPACT_RETTYPE arcompact_handle04_10(OPS_32); |
| 166 | 166 | ARCOMPACT_RETTYPE arcompact_handle04_11(OPS_32); |
| 167 | 167 | ARCOMPACT_RETTYPE arcompact_handle04_12(OPS_32); |
| 168 | | ARCOMPACT_RETTYPE arcompact_handle04_13(OPS_32); |
| 168 | // ARCOMPACT_RETTYPE arcompact_handle04_13(OPS_32); |
| 169 | 169 | ARCOMPACT_RETTYPE arcompact_handle04_14(OPS_32); |
| 170 | 170 | // ARCOMPACT_RETTYPE arcompact_handle04_15(OPS_32); |
| 171 | 171 | // ARCOMPACT_RETTYPE arcompact_handle04_16(OPS_32); |
| r242590 | r242591 | |
| 774 | 774 | ARCOMPACT_HANDLER04_TYPE_PM(04_07); |
| 775 | 775 | ARCOMPACT_HANDLER04_TYPE_PM(04_0a); |
| 776 | 776 | ARCOMPACT_HANDLER04_TYPE_PM(04_0f); |
| 777 | ARCOMPACT_HANDLER04_TYPE_PM(04_13); |
| 777 | 778 | ARCOMPACT_HANDLER04_TYPE_PM(04_15); |
| 778 | 779 | ARCOMPACT_HANDLER04_TYPE_PM(04_16); |
| 779 | 780 | ARCOMPACT_HANDLER04_TYPE_PM(04_20); |
| r242590 | r242591 | |
| 851 | 852 | #define CONDITION_LE ((STATUS32_CHECK_Z) || (STATUS32_CHECK_N && !STATUS32_CHECK_V) || (!STATUS32_CHECK_N && STATUS32_CHECK_V)) // Z or (N and /V) or (/N and V) |
| 852 | 853 | #define CONDITION_EQ (STATUS32_CHECK_Z) |
| 853 | 854 | #define CONDITION_CS (STATUS32_CHECK_C) |
| 855 | #define CONDITION_LT ((STATUS32_CHECK_N && !STATUS32_CHECK_V) || (!STATUS32_CHECK_N && STATUS32_CHECK_V)) |
| 854 | 856 | |
| 857 | |
| 855 | 858 | extern const device_type ARCA5; |
| 856 | 859 | |
| 857 | 860 | |
trunk/src/emu/cpu/arcompact/arcompact_execute.c
| r242590 | r242591 | |
| 1861 | 1861 | return arcompact_handle04_helper(PARAMS, opcodes_04[0x12], /*"BXOR"*/ 0,0); |
| 1862 | 1862 | } |
| 1863 | 1863 | |
| 1864 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_13(OPS_32) |
| 1865 | | { |
| 1866 | | return arcompact_handle04_helper(PARAMS, opcodes_04[0x13], /*"BMSK"*/ 0,0); |
| 1867 | | } |
| 1868 | 1864 | |
| 1865 | |
| 1869 | 1866 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle04_14(OPS_32) |
| 1870 | 1867 | { |
| 1871 | 1868 | return arcompact_handle04_helper(PARAMS, opcodes_04[0x14], /*"ADD1"*/ 0,0); |
| r242590 | r242591 | |
| 2705 | 2702 | return m_pc + (2 >> 0); |
| 2706 | 2703 | } |
| 2707 | 2704 | |
| 2708 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_02(OPS_16) // SUB_S b <- b,c |
| 2709 | | { |
| 2710 | | int breg, creg; |
| 2711 | 2705 | |
| 2712 | | COMMON16_GET_breg; |
| 2713 | | COMMON16_GET_creg; |
| 2714 | 2706 | |
| 2715 | | REG_16BIT_RANGE(breg); |
| 2716 | | REG_16BIT_RANGE(creg); |
| 2717 | 2707 | |
| 2718 | | m_regs[breg] = m_regs[breg] - m_regs[creg]; |
| 2719 | 2708 | |
| 2720 | | return m_pc + (2 >> 0); |
| 2721 | | } |
| 2722 | 2709 | |
| 2723 | | |
| 2724 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_04(OPS_16) // AND_S b <- b, c |
| 2725 | | { |
| 2726 | | int breg, creg; |
| 2727 | | |
| 2728 | | COMMON16_GET_breg; |
| 2729 | | COMMON16_GET_creg; |
| 2730 | | |
| 2731 | | REG_16BIT_RANGE(breg); |
| 2732 | | REG_16BIT_RANGE(creg); |
| 2733 | | |
| 2734 | | m_regs[breg] = m_regs[breg] & m_regs[creg]; |
| 2735 | | |
| 2736 | | return m_pc + (2 >> 0); |
| 2737 | | } |
| 2738 | | |
| 2739 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_05(OPS_16) // OR_S b <- b,c |
| 2740 | | { |
| 2741 | | int breg, creg; |
| 2742 | | |
| 2743 | | COMMON16_GET_breg; |
| 2744 | | COMMON16_GET_creg; |
| 2745 | | |
| 2746 | | REG_16BIT_RANGE(breg); |
| 2747 | | REG_16BIT_RANGE(creg); |
| 2748 | | |
| 2749 | | m_regs[breg] = m_regs[breg] | m_regs[creg]; |
| 2750 | | |
| 2751 | | return m_pc + (2 >> 0); |
| 2752 | | } |
| 2753 | | |
| 2754 | | |
| 2755 | 2710 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_06(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "BIC_S",0); } |
| 2756 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_07(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "XOR_S",0); } |
| 2711 | |
| 2757 | 2712 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_0b(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "TST_S",1); } |
| 2758 | 2713 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_0c(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "MUL64_S",2); } // actual destination is special multiply registers |
| 2759 | 2714 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_0d(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "SEXB_S",0); } |
| 2760 | 2715 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_0e(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "SEXW_S",0); } |
| 2761 | 2716 | |
| 2762 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_0f(OPS_16) // EXTB_S |
| 2763 | | { |
| 2764 | | int breg, creg; |
| 2765 | 2717 | |
| 2766 | | COMMON16_GET_breg; |
| 2767 | | COMMON16_GET_creg; |
| 2768 | 2718 | |
| 2769 | | REG_16BIT_RANGE(breg); |
| 2770 | | REG_16BIT_RANGE(creg); |
| 2771 | 2719 | |
| 2772 | | m_regs[breg] = m_regs[creg] & 0x000000ff; |
| 2773 | | |
| 2774 | | return m_pc + (2 >> 0); |
| 2775 | | |
| 2776 | | } |
| 2777 | | |
| 2778 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_10(OPS_16) // EXTW_S |
| 2779 | | { |
| 2780 | | int breg, creg; |
| 2781 | | |
| 2782 | | COMMON16_GET_breg; |
| 2783 | | COMMON16_GET_creg; |
| 2784 | | |
| 2785 | | REG_16BIT_RANGE(breg); |
| 2786 | | REG_16BIT_RANGE(creg); |
| 2787 | | |
| 2788 | | m_regs[breg] = m_regs[creg] & 0x0000ffff; |
| 2789 | | |
| 2790 | | return m_pc + (2 >> 0); |
| 2791 | | } |
| 2792 | | |
| 2793 | 2720 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_11(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "ABS_S",0); } |
| 2794 | 2721 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_12(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "NOT_S",0); } |
| 2795 | 2722 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_13(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "NEG_S",0); } |
| r242590 | r242591 | |
| 2800 | 2727 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_19(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "LSR_S",0); } |
| 2801 | 2728 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_1a(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "ASR_S",0); } |
| 2802 | 2729 | |
| 2803 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_1b(OPS_16) // ASL b, c asl 1 (can also be impleneted as b = c + c) |
| 2804 | | { |
| 2805 | | int breg, creg; |
| 2806 | 2730 | |
| 2807 | | COMMON16_GET_breg; |
| 2808 | | COMMON16_GET_creg; |
| 2809 | | |
| 2810 | | REG_16BIT_RANGE(breg); |
| 2811 | | REG_16BIT_RANGE(creg); |
| 2812 | | |
| 2813 | | m_regs[breg] = m_regs[creg] << 1; |
| 2814 | | |
| 2815 | | return m_pc + (2 >> 0); |
| 2816 | | } |
| 2817 | | |
| 2818 | 2731 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_1c(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "ASR1_S",0); } |
| 2819 | 2732 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_1d(OPS_16) { return arcompact_handle0f_0x_helper(PARAMS, "LSR1_S",0); } |
| 2820 | 2733 | |
| r242590 | r242591 | |
| 3302 | 3215 | |
| 3303 | 3216 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_00(OPS_16) { return arcompact_handle1e_03_0x_helper(PARAMS, "BGT_S"); } |
| 3304 | 3217 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_01(OPS_16) { return arcompact_handle1e_03_0x_helper(PARAMS, "BGE_S"); } |
| 3305 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_02(OPS_16) { return arcompact_handle1e_03_0x_helper(PARAMS, "BLT_S"); } |
| 3306 | 3218 | |
| 3219 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_02(OPS_16) // BLT_S |
| 3220 | { |
| 3221 | if (CONDITION_LT) |
| 3222 | { |
| 3223 | int s = (op & 0x003f) >> 0; op &= ~0x003f; |
| 3224 | if (s & 0x020) s = -0x20 + (s & 0x1f); |
| 3225 | UINT32 realaddress = PC_ALIGNED32 + (s * 2); |
| 3226 | //m_regs[REG_BLINK] = m_pc + (2 >> 0); // don't link |
| 3227 | return realaddress; |
| 3228 | } |
| 3229 | |
| 3230 | return m_pc + (2 >> 0); |
| 3231 | } |
| 3232 | |
| 3307 | 3233 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_03(OPS_16) // BLE_S |
| 3308 | 3234 | { |
| 3309 | 3235 | if (CONDITION_LE) |
trunk/src/emu/cpu/arcompact/arcompact_make.py
| r242590 | r242591 | |
| 251 | 251 | print >>f, "" |
| 252 | 252 | print >>f, "" |
| 253 | 253 | |
| 254 | # xxx_S b <- b,c format opcodes |
| 255 | def EmitGroup0f(f,funcname, opname, opexecute, opwrite): |
| 256 | print >>f, "ARCOMPACT_RETTYPE arcompact_device::arcompact_handle%s(OPS_16)"% (funcname) |
| 257 | print >>f, "{" |
| 258 | print >>f, " int breg, creg;" |
| 259 | print >>f, "" |
| 260 | print >>f, " COMMON16_GET_breg;" |
| 261 | print >>f, " COMMON16_GET_creg;" |
| 262 | print >>f, "" |
| 263 | print >>f, " REG_16BIT_RANGE(breg);" |
| 264 | print >>f, " REG_16BIT_RANGE(creg);" |
| 265 | print >>f, "" |
| 266 | print >>f, " %s" % (opexecute) |
| 267 | print >>f, " %s" % (opwrite) |
| 268 | print >>f, "" |
| 269 | print >>f, " return m_pc + (2 >> 0);" |
| 270 | print >>f, "}" |
| 271 | |
| 272 | |
| 254 | 273 | # xxx_S b, b, u5 format opcodes |
| 255 | 274 | def EmitGroup17(f,funcname, opname, opexecute): |
| 256 | 275 | print >>f, "ARCOMPACT_RETTYPE arcompact_device::arcompact_handle%s(OPS_16)" % (funcname) |
| r242590 | r242591 | |
| 291 | 310 | |
| 292 | 311 | EmitGroup04(f, "04_0f", "BSET", "UINT32 result = b | (1 << (c & 0x1f));", "m_regs[areg] = result;", "m_regs[breg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 293 | 312 | |
| 313 | EmitGroup04(f, "04_13", "BMSK", "UINT32 result = b & ((1<<(c+1))-1);", "m_regs[areg] = result;", "m_regs[breg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 314 | |
| 315 | |
| 316 | |
| 294 | 317 | EmitGroup04(f, "04_15", "ADD2", "UINT32 result = b + (c << 2);", "m_regs[areg] = result;", "m_regs[breg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 295 | 318 | EmitGroup04(f, "04_16", "ADD3", "UINT32 result = b + (c << 3);", "m_regs[areg] = result;", "m_regs[breg] = result;", 0,0, -1, EmitGroup04_unsupported_Flags ) |
| 296 | 319 | |
| r242590 | r242591 | |
| 303 | 326 | EmitGroup04(f, "04_2f_07", "EXTB", "UINT32 result = c & 0x000000ff;", "m_regs[breg] = result;","", 2,1, -1, EmitGroup04_unsupported_Flags ) # ^ |
| 304 | 327 | EmitGroup04(f, "04_2f_08", "EXTW", "UINT32 result = c & 0x0000ffff;", "m_regs[breg] = result;","", 2,1, -1, EmitGroup04_unsupported_Flags ) # ^ |
| 305 | 328 | |
| 329 | # xxx_S b <- b,c format opcodes (or in some cases xxx_S b,c) |
| 330 | EmitGroup0f(f, "0f_02", "SUB_S", "UINT32 result = m_regs[breg] - m_regs[creg];", "m_regs[breg] = result;" ) |
| 331 | EmitGroup0f(f, "0f_04", "AND_S", "UINT32 result = m_regs[breg] & m_regs[creg];", "m_regs[breg] = result;" ) |
| 332 | EmitGroup0f(f, "0f_05", "OR_S", "UINT32 result = m_regs[breg] | m_regs[creg];", "m_regs[breg] = result;" ) |
| 333 | EmitGroup0f(f, "0f_07", "XOR_S", "UINT32 result = m_regs[breg] ^ m_regs[creg];", "m_regs[breg] = result;" ) |
| 334 | EmitGroup0f(f, "0f_0f", "EXTB_S","UINT32 result = m_regs[creg] & 0x000000ff;", "m_regs[breg] = result;" ) |
| 335 | EmitGroup0f(f, "0f_10", "EXTW_S","UINT32 result = m_regs[creg] & 0x0000ffff;", "m_regs[breg] = result;" ) |
| 336 | EmitGroup0f(f, "0f_1b", "ASL1_S","UINT32 result = m_regs[creg] << 1;", "m_regs[breg] = result;" ) |
| 306 | 337 | |
| 338 | |
| 307 | 339 | # xxx_S b, b, u5 format opcodes |
| 308 | 340 | EmitGroup17(f, "17_00", "ASL_S", "m_regs[breg] = m_regs[breg] << (u&0x1f);" ) |
| 309 | 341 | EmitGroup17(f, "17_01", "LSR_S", "m_regs[breg] = m_regs[breg] >> (u&0x1f);" ) |