📄 newcpu.c
字号:
}#if !defined( RAINE_WIN32 ) && !defined(__MINGW32__)DEF_INLINE void Interrupt68020(int level)#elsevoid Interrupt68020(int level)#endif{ MakeSR(); if(level>=((regs.sr&0xf00)>>8)) Exception(level+24,regs.pc);}static int caar, cacr;void m68k_move2c(int regno, uae_u32 *regp){ switch (regno) { case 0: regs.sfc = *regp & 7; break; case 1: regs.dfc = *regp & 7; break; case 2: cacr = *regp & 0x3; break; // ignore C and CE case 0x800: regs.usp = *regp; break; case 0x801: regs.vbr = *regp; break; case 0x802: caar = *regp &0xfc; break; case 0x803: regs.msp = *regp; if (regs.m == 1) m68k_areg(regs, 7) = regs.msp; break; case 0x804: regs.isp = *regp; if (regs.m == 0) m68k_areg(regs, 7) = regs.isp; break; default: op_illg(0x4E7B); break; }}void m68k_movec2(int regno, uae_u32 *regp){ switch (regno) { case 0: *regp = regs.sfc; break; case 1: *regp = regs.dfc; break; case 2: *regp = cacr; break; case 0x800: *regp = regs.usp; break; case 0x801: *regp = regs.vbr; break; case 0x802: *regp = caar; break; case 0x803: *regp = regs.m == 1 ? m68k_areg(regs, 7) : regs.msp; break; case 0x804: *regp = regs.m == 0 ? m68k_areg(regs, 7) : regs.isp; break; default: op_illg (0x4E7A); break; }}static DEF_INLINE intdiv_unsigned(uae_u32 src_hi, uae_u32 src_lo, uae_u32 div, uae_u32 *quot, uae_u32 *rem){ uae_u32 q = 0, cbit = 0; int i; if (div <= src_hi) { return(1); } for (i = 0 ; i < 32 ; i++) { cbit = src_hi & 0x80000000ul; src_hi <<= 1; if (src_lo & 0x80000000ul) src_hi++; src_lo <<= 1; q = q << 1; if (cbit || div <= src_hi) { q |= 1; src_hi -= div; } } *quot = q; *rem = src_hi; return(0);}void m68k_divl(uae_u32 opcode, uae_u32 src, uae_u16 extra, uaecptr oldpc){ (void)(opcode);#if defined(uae_s64) if (src == 0) { Exception(5,oldpc); return; } if (extra & 0x800) { // signed variant uae_s64 a = (uae_s64)(uae_s32)m68k_dreg(regs, (extra >> 12) & 7); uae_s64 quot, rem; if (extra & 0x400) { a &= 0xffffffffu; a |= (uae_s64)m68k_dreg(regs, extra & 7) << 32; } rem = a % (uae_s64)(uae_s32)src; quot = a / (uae_s64)(uae_s32)src; if ((quot & UVAL64(0xffffffff80000000)) != 0 && (quot & UVAL64(0xffffffff80000000)) != UVAL64(0xffffffff80000000)) { VFLG = NFLG = 1; CFLG = 0; } else { if (((uae_s32)rem < 0) != ((uae_s64)a < 0)) rem = -rem; VFLG = CFLG = 0; ZFLG = ((uae_s32)quot) == 0; NFLG = ((uae_s32)quot) < 0; m68k_dreg(regs, extra & 7) = rem; m68k_dreg(regs, (extra >> 12) & 7) = quot; } } else { // unsigned uae_u64 a = (uae_u64)(uae_u32)m68k_dreg(regs, (extra >> 12) & 7); uae_u64 quot, rem; if (extra & 0x400) { a &= 0xffffffffu; a |= (uae_u64)m68k_dreg(regs, extra & 7) << 32; } rem = a % (uae_u64)src; quot = a / (uae_u64)src; if (quot > 0xffffffffu) { VFLG = NFLG = 1; CFLG = 0; } else { VFLG = CFLG = 0; ZFLG = ((uae_s32)quot) == 0; NFLG = ((uae_s32)quot) < 0; m68k_dreg(regs, extra & 7) = rem; m68k_dreg(regs, (extra >> 12) & 7) = quot; } }#else if (src == 0) { Exception(5,oldpc); return; } if (extra & 0x800) { // signed variant uae_s32 lo = (uae_s32)m68k_dreg(regs, (extra >> 12) & 7); uae_s32 hi = lo < 0 ? -1 : 0; uae_s32 save_high; uae_u32 quot = 0, rem = 0; uae_u32 sign; if (extra & 0x400) { hi = (uae_s32)m68k_dreg(regs, extra & 7); } save_high = hi; sign = (hi ^ src); if (hi < 0) { hi = ~hi; lo = -lo; if (lo == 0) hi++; } if ((uae_s32)src < 0) src = -src; if (div_unsigned(hi, lo, src, ", &rem) || (sign & 0x80000000) ? quot > 0x80000000 : quot > 0x7fffffff) { VFLG = NFLG = 1; CFLG = 0; } else { if (sign & 0x80000000) quot = -quot; if (((uae_s32)rem < 0) != (save_high < 0)) rem = -rem; VFLG = CFLG = 0; ZFLG = ((uae_s32)quot) == 0; NFLG = ((uae_s32)quot) < 0; m68k_dreg(regs, extra & 7) = rem; m68k_dreg(regs, (extra >> 12) & 7) = quot; } } else { // unsigned uae_u32 lo = (uae_u32)m68k_dreg(regs, (extra >> 12) & 7); uae_u32 hi = 0; uae_u32 quot = 0, rem = 0; if (extra & 0x400) { hi = (uae_u32)m68k_dreg(regs, extra & 7); } if (div_unsigned(hi, lo, src, ", &rem)) { VFLG = NFLG = 1; CFLG = 0; } else { VFLG = CFLG = 0; ZFLG = ((uae_s32)quot) == 0; NFLG = ((uae_s32)quot) < 0; m68k_dreg(regs, extra & 7) = rem; m68k_dreg(regs, (extra >> 12) & 7) = quot; } }#endif}static DEF_INLINE voidmul_unsigned(uae_u32 src1, uae_u32 src2, uae_u32 *dst_hi, uae_u32 *dst_lo){ uae_u32 r0 = (src1 & 0xffff) * (src2 & 0xffff); uae_u32 r1 = ((src1 >> 16) & 0xffff) * (src2 & 0xffff); uae_u32 r2 = (src1 & 0xffff) * ((src2 >> 16) & 0xffff); uae_u32 r3 = ((src1 >> 16) & 0xffff) * ((src2 >> 16) & 0xffff); uae_u32 lo; lo = r0 + ((r1 << 16) & 0xffff0000ul); if (lo < r0) r3++; r0 = lo; lo = r0 + ((r2 << 16) & 0xffff0000ul); if (lo < r0) r3++; r3 += ((r1 >> 16) & 0xffff) + ((r2 >> 16) & 0xffff); *dst_lo = lo; *dst_hi = r3;}void m68k_mull(uae_u32 opcode, uae_u32 src, uae_u16 extra){ (void)(opcode);#if defined(uae_s64) if (extra & 0x800) { // signed variant uae_s64 a = (uae_s64)(uae_s32)m68k_dreg(regs, (extra >> 12) & 7); a *= (uae_s64)(uae_s32)src; VFLG = CFLG = 0; ZFLG = a == 0; NFLG = a < 0; if (extra & 0x400) m68k_dreg(regs, extra & 7) = a >> 32; else if ((a & UVAL64(0xffffffff80000000)) != 0 && (a & UVAL64(0xffffffff80000000)) != UVAL64(0xffffffff80000000)) { VFLG = 1; } m68k_dreg(regs, (extra >> 12) & 7) = (uae_u32)a; } else { // unsigned uae_u64 a = (uae_u64)(uae_u32)m68k_dreg(regs, (extra >> 12) & 7); a *= (uae_u64)src; VFLG = CFLG = 0; ZFLG = a == 0; NFLG = ((uae_s64)a) < 0; if (extra & 0x400) m68k_dreg(regs, extra & 7) = a >> 32; else if ((a & UVAL64(0xffffffff00000000)) != 0) { VFLG = 1; } m68k_dreg(regs, (extra >> 12) & 7) = (uae_u32)a; }#else if (extra & 0x800) { // signed variant uae_s32 src1,src2; uae_u32 dst_lo,dst_hi; uae_u32 sign; src1 = (uae_s32)src; src2 = (uae_s32)m68k_dreg(regs, (extra >> 12) & 7); sign = (src1 ^ src2); if (src1 < 0) src1 = -src1; if (src2 < 0) src2 = -src2; mul_unsigned((uae_u32)src1,(uae_u32)src2,&dst_hi,&dst_lo); if (sign & 0x80000000) { dst_hi = ~dst_hi; dst_lo = -dst_lo; if (dst_lo == 0) dst_hi++; } VFLG = CFLG = 0; ZFLG = dst_hi == 0 && dst_lo == 0; NFLG = ((uae_s32)dst_hi) < 0; if (extra & 0x400) m68k_dreg(regs, extra & 7) = dst_hi; else if ((dst_hi != 0 || (dst_lo & 0x80000000) != 0) && ((dst_hi & 0xffffffff) != 0xffffffff || (dst_lo & 0x80000000) != 0x80000000)) { VFLG = 1; } m68k_dreg(regs, (extra >> 12) & 7) = dst_lo; } else { // unsigned uae_u32 dst_lo,dst_hi; mul_unsigned(src,(uae_u32)m68k_dreg(regs, (extra >> 12) & 7),&dst_hi,&dst_lo); VFLG = CFLG = 0; ZFLG = dst_hi == 0 && dst_lo == 0; NFLG = ((uae_s32)dst_hi) < 0; if (extra & 0x400) m68k_dreg(regs, extra & 7) = dst_hi; else if (dst_hi != 0) { VFLG = 1; } m68k_dreg(regs, (extra >> 12) & 7) = dst_lo; }#endif}void customreset(void){ //Reset68020();}void Reset68020(void){ m68k_areg(regs,7)=get_long(0); m68k_setpc(get_long(4)); regs.s=1; regs.m=0; regs.stopped=0; regs.t1=0; regs.t0=0; ZFLG=CFLG=NFLG=VFLG=0; regs.intmask=7; regs.vbr=regs.sfc=regs.dfc=0; regs.sr=0x2700; MakeFromSR();}void op_illg(uae_u32 opcode){ // RAINE #$xx if((opcode&0xFF00)==0x7F00){ F3SystemEEPROMAccess(opcode&0xFF); m68k_incpc(2); return; } // LINEF #$xxx if((opcode&0xF000)==0xF000){ Exception(0xB,0); return; } // LINEA #$xxx if((opcode&0xF000)==0xA000){ Exception(0xA,0); return; } #ifdef RAINE_DEBUG print_debug("[Illegal 68020 Instruction $%08x:%04x]\n",regs.pc,opcode); #endif Exception(4,0);}#if !defined( RAINE_WIN32 ) && !defined(__MINGW32__)DEF_INLINE void Stop68020(void)#elsevoid Stop68020(void)#endif{ cycles=0; #ifdef FAST020 WriteLong(&cyclepos[0],cycles); #endif #ifdef RAINE_DEBUG print_debug("[68020 Stopped by User]\n"); #endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -