Mercurial > repos > blastem
comparison m68k_to_x86.c @ 122:0a6da6c7c463
Implemented ROL and ROR
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 29 Dec 2012 20:33:39 -0800 |
parents | f848aad2abef |
children | bd3858121ab0 |
comparison
equal
deleted
inserted
replaced
121:f848aad2abef | 122:0a6da6c7c463 |
---|---|
1942 | 1942 |
1943 #define BIT_SUPERVISOR 5 | 1943 #define BIT_SUPERVISOR 5 |
1944 | 1944 |
1945 uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 1945 uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
1946 { | 1946 { |
1947 uint8_t * end_off; | 1947 uint8_t * end_off, *zero_off, *norm_off; |
1948 map_native_address(opts->native_code_map, inst->address, dst); | 1948 map_native_address(opts->native_code_map, inst->address, dst); |
1949 dst = check_cycles_int(dst, inst->address); | 1949 dst = check_cycles_int(dst, inst->address); |
1950 if (inst->op == M68K_MOVE) { | 1950 if (inst->op == M68K_MOVE) { |
1951 return translate_m68k_move(dst, inst, opts); | 1951 return translate_m68k_move(dst, inst, opts); |
1952 } else if(inst->op == M68K_LEA) { | 1952 } else if(inst->op == M68K_LEA) { |
2336 } | 2336 } |
2337 if (inst->op == M68K_ANDI_SR) { | 2337 if (inst->op == M68K_ANDI_SR) { |
2338 dst = or_irdisp8(dst, inst->src.params.immed >> 8, CONTEXT, offsetof(m68k_context, status), SZ_B); | 2338 dst = or_irdisp8(dst, inst->src.params.immed >> 8, CONTEXT, offsetof(m68k_context, status), SZ_B); |
2339 } | 2339 } |
2340 break; | 2340 break; |
2341 /*case M68K_PEA: | 2341 /*case M68K_RESET:*/ |
2342 case M68K_RESET: | |
2343 case M68K_ROL: | 2342 case M68K_ROL: |
2344 case M68K_ROR: | 2343 case M68K_ROR: |
2345 case M68K_ROXL: | 2344 dst = mov_ir(dst, 0, FLAG_V, SZ_B); |
2345 if (inst->src.addr_mode == MODE_UNUSED) { | |
2346 dst = cycles(dst, BUS); | |
2347 //Memory rotate | |
2348 if (inst->op == M68K_ROL) { | |
2349 dst = rol_ir(dst, 1, dst_op.base, inst->extra.size); | |
2350 } else { | |
2351 dst = ror_ir(dst, 1, dst_op.base, inst->extra.size); | |
2352 } | |
2353 dst = setcc_r(dst, CC_C, FLAG_C); | |
2354 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); | |
2355 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
2356 dst = setcc_r(dst, CC_S, FLAG_N); | |
2357 dst = m68k_save_result(inst, dst, opts); | |
2358 } else { | |
2359 if (src_op.mode == MODE_IMMED) { | |
2360 dst = cycles(dst, (inst->extra.size == OPSIZE_LONG ? 8 : 6) + src_op.disp*2); | |
2361 if (dst_op.mode == MODE_REG_DIRECT) { | |
2362 if (inst->op == M68K_ROL) { | |
2363 dst = rol_ir(dst, src_op.disp, dst_op.base, inst->extra.size); | |
2364 } else { | |
2365 dst = ror_ir(dst, src_op.disp, dst_op.base, inst->extra.size); | |
2366 } | |
2367 } else { | |
2368 if (inst->op == M68K_ROL) { | |
2369 dst = rol_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size); | |
2370 } else { | |
2371 dst = ror_irdisp8(dst, src_op.disp, dst_op.base, dst_op.disp, inst->extra.size); | |
2372 } | |
2373 } | |
2374 dst = setcc_r(dst, CC_C, FLAG_C); | |
2375 } else { | |
2376 if (src_op.mode == MODE_REG_DIRECT) { | |
2377 if (src_op.base != SCRATCH1) { | |
2378 dst = mov_rr(dst, src_op.base, SCRATCH1, SZ_B); | |
2379 } | |
2380 } else { | |
2381 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_B); | |
2382 } | |
2383 dst = and_ir(dst, 63, SCRATCH1, SZ_D); | |
2384 zero_off = dst+1; | |
2385 dst = jcc(dst, CC_NZ, dst+2); | |
2386 dst = add_rr(dst, SCRATCH1, CYCLES, SZ_D); | |
2387 dst = add_rr(dst, SCRATCH1, CYCLES, SZ_D); | |
2388 dst = cmp_ir(dst, 32, SCRATCH1, SZ_B); | |
2389 norm_off = dst+1; | |
2390 dst = jcc(dst, CC_L, dst+2); | |
2391 if (dst_op.mode == MODE_REG_DIRECT) { | |
2392 if (inst->op == M68K_ROL) { | |
2393 dst = rol_ir(dst, 31, dst_op.base, inst->extra.size); | |
2394 dst = rol_ir(dst, 1, dst_op.base, inst->extra.size); | |
2395 } else { | |
2396 dst = ror_ir(dst, 31, dst_op.base, inst->extra.size); | |
2397 dst = ror_ir(dst, 1, dst_op.base, inst->extra.size); | |
2398 } | |
2399 } else { | |
2400 if (inst->op == M68K_ROL) { | |
2401 dst = rol_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size); | |
2402 dst = rol_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size); | |
2403 } else { | |
2404 dst = ror_irdisp8(dst, 31, dst_op.base, dst_op.disp, inst->extra.size); | |
2405 dst = ror_irdisp8(dst, 1, dst_op.base, dst_op.disp, inst->extra.size); | |
2406 } | |
2407 } | |
2408 dst = sub_ir(dst, 32, SCRATCH1, SZ_B); | |
2409 *norm_off = dst - (norm_off+1); | |
2410 if (dst_op.mode == MODE_REG_DIRECT) { | |
2411 if (inst->op == M68K_ROL) { | |
2412 dst = rol_clr(dst, dst_op.base, inst->extra.size); | |
2413 } else { | |
2414 dst = ror_clr(dst, dst_op.base, inst->extra.size); | |
2415 } | |
2416 } else { | |
2417 if (inst->op == M68K_ROL) { | |
2418 dst = rol_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); | |
2419 } else { | |
2420 dst = ror_clrdisp8(dst, dst_op.base, dst_op.disp, inst->extra.size); | |
2421 } | |
2422 } | |
2423 dst = setcc_r(dst, CC_C, FLAG_C); | |
2424 end_off = dst + 1; | |
2425 dst = jmp(dst, dst+2); | |
2426 *zero_off = dst - (zero_off+1); | |
2427 dst = mov_ir(dst, 0, FLAG_C, SZ_B); | |
2428 *end_off = dst - (end_off+1); | |
2429 } | |
2430 if (dst_op.mode == MODE_REG_DIRECT) { | |
2431 dst = cmp_ir(dst, 0, dst_op.base, inst->extra.size); | |
2432 } else { | |
2433 dst = cmp_irdisp8(dst, 0, dst_op.base, dst_op.disp, inst->extra.size); | |
2434 } | |
2435 dst = setcc_r(dst, CC_Z, FLAG_Z); | |
2436 dst = setcc_r(dst, CC_S, FLAG_N); | |
2437 } | |
2438 break; | |
2439 /*case M68K_ROXL: | |
2346 case M68K_ROXR:*/ | 2440 case M68K_ROXR:*/ |
2347 case M68K_RTE: | 2441 case M68K_RTE: |
2348 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); | 2442 dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D); |
2349 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); | 2443 dst = call(dst, (uint8_t *)m68k_read_long_scratch1); |
2350 dst = push_r(dst, SCRATCH1); | 2444 dst = push_r(dst, SCRATCH1); |
2364 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); | 2458 dst = call(dst, (uint8_t *)m68k_native_addr_and_sync); |
2365 dst = jmp_r(dst, SCRATCH1); | 2459 dst = jmp_r(dst, SCRATCH1); |
2366 break; | 2460 break; |
2367 /*case M68K_RTR: | 2461 /*case M68K_RTR: |
2368 case M68K_SBCD: | 2462 case M68K_SBCD: |
2369 case M68K_SCC: | |
2370 case M68K_STOP: | 2463 case M68K_STOP: |
2371 break;*/ | 2464 break;*/ |
2372 case M68K_SUB: | 2465 case M68K_SUB: |
2373 dst = cycles(dst, BUS); | 2466 dst = cycles(dst, BUS); |
2374 if (src_op.mode == MODE_REG_DIRECT) { | 2467 if (src_op.mode == MODE_REG_DIRECT) { |