--- hatari/src/uae-cpu/gencpu.c 2019/04/09 08:55:50 1.1.1.18 +++ hatari/src/uae-cpu/gencpu.c 2019/04/09 08:57:02 1.1.1.19 @@ -80,6 +80,7 @@ /* 2015/07/29 [NP] In the case of an address error, correctly set last_writeaccess_for_exception_3 */ /* to 0 (read) or 1 (write) (War Heli) */ /* 2015/07/29 [NP] Add refill_prefetch for i_Bcc (War Heli, 'bra.s -2' ($60fe)) */ +/* 2015/11/09 [NP] Add refill_prefetch for i_ADD #xx,d16(An) (Cubase, 'addi.w #5,2(a0)') */ const char GenCpu_fileid[] = "Hatari gencpu.c : " __DATE__ " " __TIME__; @@ -1095,7 +1096,10 @@ static void gen_opcode (unsigned long in genamode (curi->smode, "srcreg", curi->size, "src", 1, 0); genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0); start_brace (); - printf("\trefill_prefetch (m68k_getpc(), 2);\n"); // FIXME [NP] For Transbeauce 2 demo, need better prefetch emulation + if ( ( curi->smode == imm ) && ( curi->dmode == Ad16 ) ) // FIXME [NP] add.w #xx,xx(an) (Cubase : addi.w #5,2(a0)) + printf("\trefill_prefetch (m68k_getpc(), 6);\n"); // FIXME [NP] need better prefetch emulation + else + printf("\trefill_prefetch (m68k_getpc(), 2);\n"); // FIXME [NP] For Transbeauce 2 demo, need better prefetch emulation genflags (flag_add, curi->size, "newv", "src", "dst"); genastore ("newv", curi->dmode, "dstreg", curi->size, "dst"); if(curi->size==sz_long && curi->dmode==Dreg) @@ -1303,35 +1307,23 @@ static void gen_opcode (unsigned long in genamode (curi->smode, "srcreg", curi->size, "src", 1, 0); printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ()); - /* [NP] Use MovepByteNbr to keep track of each access inside a movep */ if (curi->size == sz_word) { - printf ("\tMovepByteNbr=1; put_byte(memp, src >> 8); MovepByteNbr=2; put_byte(memp + 2, src);\n"); + printf ("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n"); } else { - printf ("\tMovepByteNbr=1; put_byte(memp, src >> 24); MovepByteNbr=2; put_byte(memp + 2, src >> 16);\n"); - printf ("\tMovepByteNbr=3; put_byte(memp + 4, src >> 8); MovepByteNbr=4; put_byte(memp + 6, src);\n"); + printf ("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n"); + printf ("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n"); } - printf ("\tMovepByteNbr=0;\n"); if(curi->size==sz_long) insn_n_cycles=24; else insn_n_cycles=16; break; case i_MVPMR: printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword ()); genamode (curi->dmode, "dstreg", curi->size, "dst", 2, 0); - /* [NP] Use MovepByteNbr to keep track of each access inside a movep */ if (curi->size == sz_word) { - //printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n"); - printf ("\tuae_u16 val;\n"); - printf ("\tMovepByteNbr=1; val = (get_byte(memp) << 8);\n"); - printf ("\tMovepByteNbr=2; val += get_byte(memp + 2);\n"); + printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n"); } else { - //printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n"); - //printf (" + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n"); - printf ("\tuae_u32 val;\n"); - printf ("\tMovepByteNbr=1; val = (get_byte(memp) << 24);\n"); - printf ("\tMovepByteNbr=2; val += (get_byte(memp + 2) << 16);\n"); - printf ("\tMovepByteNbr=3; val += (get_byte(memp + 4) << 8);\n"); - printf ("\tMovepByteNbr=4; val += get_byte(memp + 6);\n"); + printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n"); + printf (" + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n"); } - printf ("\tMovepByteNbr=0;\n"); genastore ("val", curi->dmode, "dstreg", curi->size, "dst"); if(curi->size==sz_long) insn_n_cycles=24; else insn_n_cycles=16; break;