trunk/src/emu/cpu/arcompact/arcompact_execute.c
| r242525 | r242526 | |
| 1123 | 1123 | return m_pc + (size>>0); |
| 1124 | 1124 | } |
| 1125 | 1125 | |
| 1126 | |
| 1127 | |
| 1126 | 1128 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_00_01dasm(OPS_32) |
| 1127 | 1129 | { |
| 1128 | 1130 | int size = 4; |
| r242525 | r242526 | |
| 1145 | 1147 | } |
| 1146 | 1148 | else |
| 1147 | 1149 | { |
| 1150 | m_regs[REG_BLINK] = m_pc + (size >> 0); |
| 1148 | 1151 | return realaddress; |
| 1149 | 1152 | } |
| 1150 | 1153 | |
| r242525 | r242526 | |
| 1182 | 1185 | |
| 1183 | 1186 | |
| 1184 | 1187 | // register - register cases |
| 1185 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_00(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BREQ"); } |
| 1186 | 1188 | |
| 1187 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_01(OPS_32) // register - register BRNE |
| 1188 | | { |
| 1189 | | int size = 4; |
| 1189 | #define BR_REGREG_SETUP \ |
| 1190 | /* Branch on Compare / Bit Test - Register-Register */ \ |
| 1191 | int size = 4; \ |
| 1192 | GET_01_01_01_BRANCH_ADDR; \ |
| 1193 | COMMON32_GET_creg; \ |
| 1194 | COMMON32_GET_breg; \ |
| 1195 | int n = (op & 0x00000020) >> 5; \ |
| 1196 | UINT32 b,c; \ |
| 1197 | if ((breg != LIMM_REG) && (creg != LIMM_REG)) \ |
| 1198 | { \ |
| 1199 | b = m_regs[breg]; \ |
| 1200 | c = m_regs[creg]; \ |
| 1201 | } \ |
| 1202 | else \ |
| 1203 | { \ |
| 1204 | UINT32 limm; \ |
| 1205 | GET_LIMM_32; \ |
| 1206 | size = 8; \ |
| 1207 | \ |
| 1208 | if (breg == LIMM_REG) \ |
| 1209 | b = limm; \ |
| 1210 | else \ |
| 1211 | b = m_regs[breg]; \ |
| 1212 | \ |
| 1213 | if (creg == LIMM_REG) \ |
| 1214 | c = limm; \ |
| 1215 | else \ |
| 1216 | c = m_regs[creg]; \ |
| 1217 | } \ |
| 1190 | 1218 | |
| 1191 | | // Branch on Compare / Bit Test - Register-Register |
| 1192 | | GET_01_01_01_BRANCH_ADDR |
| 1193 | | COMMON32_GET_creg |
| 1194 | | COMMON32_GET_breg; |
| 1219 | #define BR_TAKEJUMP \ |
| 1220 | /* take jump */ \ |
| 1221 | UINT32 realaddress = PC_ALIGNED32 + (address * 2); \ |
| 1222 | \ |
| 1223 | if (n) \ |
| 1224 | { \ |
| 1225 | m_delayactive = 1; \ |
| 1226 | m_delayjump = realaddress; \ |
| 1227 | m_delaylinks = 0; \ |
| 1228 | } \ |
| 1229 | else \ |
| 1230 | { \ |
| 1231 | return realaddress; \ |
| 1232 | } \ |
| 1195 | 1233 | |
| 1196 | | int n = (op & 0x00000020) >> 5; |
| 1197 | 1234 | |
| 1198 | | UINT32 b,c; |
| 1199 | 1235 | |
| 1200 | | if ((breg != LIMM_REG) && (creg != LIMM_REG)) |
| 1236 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_00(OPS_32) // register - register BREQ |
| 1237 | { |
| 1238 | BR_REGREG_SETUP |
| 1239 | |
| 1240 | // BREQ |
| 1241 | if (b == c) |
| 1201 | 1242 | { |
| 1202 | | b = m_regs[breg]; |
| 1203 | | c = m_regs[creg]; |
| 1243 | BR_TAKEJUMP |
| 1204 | 1244 | } |
| 1205 | | else |
| 1206 | | { |
| 1207 | | UINT32 limm; |
| 1208 | | GET_LIMM_32; |
| 1209 | | size = 8; |
| 1210 | 1245 | |
| 1211 | | if (breg == LIMM_REG) |
| 1212 | | b = limm; |
| 1213 | | else |
| 1214 | | b = m_regs[breg]; |
| 1246 | return m_pc + (size>>0); |
| 1247 | } |
| 1215 | 1248 | |
| 1216 | | if (creg == LIMM_REG) |
| 1217 | | c = limm; |
| 1218 | | else |
| 1219 | | c = m_regs[creg]; |
| 1220 | | } |
| 1249 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_01(OPS_32) // register - register BRNE |
| 1250 | { |
| 1251 | BR_REGREG_SETUP |
| 1221 | 1252 | |
| 1222 | 1253 | // BRNE |
| 1223 | 1254 | if (b != c) |
| 1224 | 1255 | { |
| 1225 | | // take jump |
| 1226 | | UINT32 realaddress = PC_ALIGNED32 + (address * 2); |
| 1227 | | |
| 1228 | | if (n) |
| 1229 | | { |
| 1230 | | m_delayactive = 1; |
| 1231 | | m_delayjump = realaddress; |
| 1232 | | m_delaylinks = 1; |
| 1233 | | } |
| 1234 | | else |
| 1235 | | { |
| 1236 | | return realaddress; |
| 1237 | | } |
| 1256 | BR_TAKEJUMP |
| 1238 | 1257 | } |
| 1239 | 1258 | |
| 1240 | 1259 | return m_pc + (size>>0); |
| r242525 | r242526 | |
| 1242 | 1261 | |
| 1243 | 1262 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_02(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BRLT"); } |
| 1244 | 1263 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_03(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BRGE"); } |
| 1245 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_04(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BRLO"); } |
| 1246 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_05(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BRHS"); } |
| 1264 | |
| 1265 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_04(OPS_32) // register - register BRLO |
| 1266 | { |
| 1267 | BR_REGREG_SETUP |
| 1268 | |
| 1269 | // BRLO |
| 1270 | if (b < c) |
| 1271 | { |
| 1272 | BR_TAKEJUMP |
| 1273 | } |
| 1274 | |
| 1275 | return m_pc + (size>>0); |
| 1276 | } |
| 1277 | |
| 1278 | |
| 1279 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_05(OPS_32) // register - register BRHS |
| 1280 | { |
| 1281 | BR_REGREG_SETUP |
| 1282 | |
| 1283 | // BRHS |
| 1284 | if (b >= c) |
| 1285 | { |
| 1286 | BR_TAKEJUMP |
| 1287 | } |
| 1288 | |
| 1289 | return m_pc + (size>>0); |
| 1290 | } |
| 1291 | |
| 1292 | |
| 1247 | 1293 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_0e(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BBIT0");} |
| 1248 | 1294 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle01_01_00_0f(OPS_32) { return arcompact_01_01_00_helper( PARAMS, "BBIT1");} |
| 1249 | 1295 | |
| r242525 | r242526 | |
| 1288 | 1334 | b = limm; |
| 1289 | 1335 | } |
| 1290 | 1336 | |
| 1291 | | // BRHS" |
| 1337 | // BRHS |
| 1292 | 1338 | if (b >= c) // check |
| 1293 | 1339 | { |
| 1294 | | // take jump |
| 1295 | | UINT32 realaddress = PC_ALIGNED32 + (address * 2); |
| 1296 | | |
| 1297 | | if (n) |
| 1298 | | { |
| 1299 | | m_delayactive = 1; |
| 1300 | | m_delayjump = realaddress; |
| 1301 | | m_delaylinks = 1; |
| 1302 | | } |
| 1303 | | else |
| 1304 | | { |
| 1305 | | return realaddress; |
| 1306 | | } |
| 1340 | BR_TAKEJUMP |
| 1307 | 1341 | } |
| 1308 | 1342 | |
| 1309 | 1343 | return m_pc + (size>>0); |
| r242525 | r242526 | |
| 2344 | 2378 | return arcompact_handle0c_helper(PARAMS, "LDW_S"); |
| 2345 | 2379 | } |
| 2346 | 2380 | |
| 2347 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0c_03(OPS_16) |
| 2381 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0c_03(OPS_16) // ADD_S a <- b + c |
| 2348 | 2382 | { |
| 2349 | | return arcompact_handle0c_helper(PARAMS, "ADD_S"); |
| 2383 | int areg, breg, creg; |
| 2384 | |
| 2385 | COMMON16_GET_areg; |
| 2386 | COMMON16_GET_breg; |
| 2387 | COMMON16_GET_creg; |
| 2388 | |
| 2389 | REG_16BIT_RANGE(areg); |
| 2390 | REG_16BIT_RANGE(breg); |
| 2391 | REG_16BIT_RANGE(creg); |
| 2392 | |
| 2393 | m_regs[areg] = m_regs[breg] + m_regs[creg]; |
| 2394 | |
| 2395 | return m_pc + (2 >> 0); |
| 2350 | 2396 | } |
| 2351 | 2397 | |
| 2352 | 2398 | |
| r242525 | r242526 | |
| 2445 | 2491 | return arcompact_handle0e_0x_helper(PARAMS, "CMP_S", 0); |
| 2446 | 2492 | } |
| 2447 | 2493 | |
| 2448 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0e_03(OPS_16) |
| 2494 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0e_03(OPS_16) // MOV_S h <- b |
| 2449 | 2495 | { |
| 2450 | | return arcompact_handle0e_0x_helper(PARAMS, "MOV_S (0e_03 type)", 1); |
| 2496 | int h,breg; |
| 2497 | int size = 2; |
| 2498 | |
| 2499 | GROUP_0e_GET_h; |
| 2500 | COMMON16_GET_breg; |
| 2501 | REG_16BIT_RANGE(breg); |
| 2502 | |
| 2503 | if (h == LIMM_REG) // no result.. |
| 2504 | { |
| 2505 | |
| 2506 | } |
| 2507 | |
| 2508 | m_regs[h] = m_regs[breg]; |
| 2509 | |
| 2510 | return m_pc+ (size>>0); |
| 2451 | 2511 | } |
| 2452 | 2512 | |
| 2453 | 2513 | |
| r242525 | r242526 | |
| 2463 | 2523 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_00(OPS_16) { return arcompact_handle0f_00_0x_helper(PARAMS, "J_S"); } |
| 2464 | 2524 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_01(OPS_16) { return arcompact_handle0f_00_0x_helper(PARAMS, "J_S.D"); } |
| 2465 | 2525 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_02(OPS_16) { return arcompact_handle0f_00_0x_helper(PARAMS, "JL_S"); } |
| 2466 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_03(OPS_16) { return arcompact_handle0f_00_0x_helper(PARAMS, "JL_S.D"); } |
| 2526 | |
| 2527 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_03(OPS_16) // JL_S.D |
| 2528 | { |
| 2529 | int breg; |
| 2530 | |
| 2531 | COMMON16_GET_breg; |
| 2532 | REG_16BIT_RANGE(breg); |
| 2533 | |
| 2534 | m_delayactive = 1; |
| 2535 | m_delayjump = m_regs[breg]; |
| 2536 | m_delaylinks = 1; |
| 2537 | |
| 2538 | return m_pc + (2 >> 0); |
| 2539 | } |
| 2540 | |
| 2467 | 2541 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle0f_00_06(OPS_16) { return arcompact_handle0f_00_0x_helper(PARAMS, "SUB_S.NE"); } |
| 2468 | 2542 | |
| 2469 | 2543 | |
| r242525 | r242526 | |
| 2791 | 2865 | |
| 2792 | 2866 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_0x_helper(OPS_16, const char* optext) |
| 2793 | 2867 | { |
| 2794 | | arcompact_log("unimplemented %s %04x", optext, op); |
| 2868 | arcompact_log("unimplemented %s %04x (1e_0x type)", optext, op); |
| 2795 | 2869 | return m_pc + (2 >> 0); |
| 2796 | 2870 | } |
| 2797 | 2871 | |
| r242525 | r242526 | |
| 2816 | 2890 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_06(OPS_16) { return arcompact_handle1e_03_0x_helper(PARAMS, "BLO_S"); } |
| 2817 | 2891 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1e_03_07(OPS_16) { return arcompact_handle1e_03_0x_helper(PARAMS, "BLS_S"); } |
| 2818 | 2892 | |
| 2819 | | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1f(OPS_16) |
| 2893 | ARCOMPACT_RETTYPE arcompact_device::arcompact_handle1f(OPS_16) // BL_S s13 |
| 2820 | 2894 | { |
| 2821 | | arcompact_log("unimplemented BL_S %04x", op); |
| 2822 | | return m_pc + (2 >> 0); |
| 2895 | int s = (op & 0x07ff) >> 0; op &= ~0x07ff; |
| 2896 | if (s & 0x400) s = -0x400 + (s & 0x3ff); |
| 2897 | |
| 2898 | UINT32 realaddress = PC_ALIGNED32 + (s * 4); |
| 2899 | |
| 2900 | m_regs[REG_BLINK] = m_pc + (2 >> 0); |
| 2901 | return realaddress; |
| 2823 | 2902 | } |
| 2824 | 2903 | |
| 2825 | 2904 | /************************************************************************************************************************************ |
trunk/src/emu/cpu/arcompact/arcompactdasm_ops.c
| r242525 | r242526 | |
| 1372 | 1372 | |
| 1373 | 1373 | |
| 1374 | 1374 | |
| 1375 | | int arcompact_handle0c_helper_dasm(DASM_OPS_16, const char* optext) |
| 1375 | int arcompact_handle0c_helper_dasm(DASM_OPS_16, const char* optext, int format) |
| 1376 | 1376 | { |
| 1377 | 1377 | int areg, breg, creg; |
| 1378 | 1378 | |
| r242525 | r242526 | |
| 1385 | 1385 | REG_16BIT_RANGE(creg); |
| 1386 | 1386 | |
| 1387 | 1387 | |
| 1388 | | print("%s %s <- [%s, %s]", optext, regnames[areg], regnames[breg], regnames[creg]); |
| 1388 | if (format==0) print("%s %s <- [%s, %s]", optext, regnames[areg], regnames[breg], regnames[creg]); |
| 1389 | else print("%s %s <- %s, %s", optext, regnames[areg], regnames[breg], regnames[creg]); |
| 1390 | |
| 1389 | 1391 | return 2; |
| 1390 | 1392 | } |
| 1391 | 1393 | |
| 1392 | 1394 | |
| 1393 | 1395 | int arcompact_handle0c_00_dasm(DASM_OPS_16) |
| 1394 | 1396 | { |
| 1395 | | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LD_S"); |
| 1397 | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LD_S", 0); |
| 1396 | 1398 | } |
| 1397 | 1399 | |
| 1398 | 1400 | int arcompact_handle0c_01_dasm(DASM_OPS_16) |
| 1399 | 1401 | { |
| 1400 | | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LDB_S"); |
| 1402 | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LDB_S", 0); |
| 1401 | 1403 | } |
| 1402 | 1404 | |
| 1403 | 1405 | int arcompact_handle0c_02_dasm(DASM_OPS_16) |
| 1404 | 1406 | { |
| 1405 | | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LDW_S"); |
| 1407 | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "LDW_S", 0); |
| 1406 | 1408 | } |
| 1407 | 1409 | |
| 1408 | 1410 | int arcompact_handle0c_03_dasm(DASM_OPS_16) |
| 1409 | 1411 | { |
| 1410 | | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "ADD_S"); |
| 1412 | return arcompact_handle0c_helper_dasm(DASM_PARAMS, "ADD_S", 1); |
| 1411 | 1413 | } |
| 1412 | 1414 | |
| 1413 | 1415 | |