⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newcpu.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 2 页
字号:
}#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, &quot, &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, &quot, &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 + -