> From: Laurent Vivier [mailto:laur...@vivier.eu] > Le 06/02/2018 à 13:44, Pavel Dovgalyuk a écrit : > > This patch implements movep instruction. It moves data between a data > > register > > and alternate bytes within the address space starting at the location > > specified and incrementing by two. > > > > It was designed for the original 68000 and used in firmwares for > > interfacing the 8-bit peripherals through the 16-bit data bus. > > Did you test this change with some kind of firmware?
Yes, we implemented this instruction when tried to emulate Macintosh-128k on Qemu. > > Without this patch opcode for this instruction is recognized as some bitop. > > > > Signed-off-by: Pavel Dovgalyuk <pavel.dovga...@ispras.ru> > > Signed-off-by: Mihail Abakumov <mikhail.abaku...@ispras.ru> > > > > -- > > > > v4: - fixed offset calculation misprint > > > > v3: - simplified movep function code > > - joined movep masks > > > > v2: - disabled movep for Coldfire > > - fixed gen_store/load usage > > --- > > target/m68k/cpu.c | 2 ++ > > target/m68k/cpu.h | 1 + > > target/m68k/translate.c | 46 > > ++++++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 49 insertions(+) > > Tested-by: Laurent Vivier <laur...@vivier.eu> > > I've checked we have the same result on a real 68040 > > Reviewed-by: Laurent Vivier <laur...@vivier.eu> Thanks! By the way, we also handled reset interrupt, but it is not compatible with other m68k platforms: @@ -66,8 +66,9 @@ static void m68k_cpu_reset(CPUState *s) cpu_m68k_set_fpcr(env, 0); env->fpsr = 0; - /* TODO: We should set PC from the interrupt vector. */ - env->pc = 0; + env->vbr = 0; + /* PC and SP (for m68k) will be initialized by the reset handler */ + s->exception_index = EXCP_RESET; } @@ -378,6 +380,8 @@ static void m68k_interrupt_all(CPUM68KState *env, int is_hw) cpu_m68k_set_sr(env, sr &= ~SR_M); sp = env->aregs[7] & ~1; do_stack_frame(env, &sp, 1, oldsr, 0, retaddr); + } else if (cs->exception_index == EXCP_RESET) { + sp = cpu_ldl_kernel(env, env->vbr + vector - 4); } else { do_stack_frame(env, &sp, 0, oldsr, 0, retaddr); } Pavel Dovgalyuk