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

📄 fp_movem.s

📁 这个linux源代码是很全面的~基本完整了~使用c编译的~由于时间问题我没有亲自测试~但就算用来做参考资料也是非常好的
💻 S
字号:
/* * fp_movem.S * * Copyright Roman Zippel, 1997.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, and the entire permission notice in its entirety, *    including the disclaimer of warranties. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote *    products derived from this software without specific prior *    written permission. * * ALTERNATIVELY, this product may be distributed under the terms of * the GNU General Public License, in which case the provisions of the GPL are * required INSTEAD OF the above restrictions.  (This clause is * necessary due to a potential bad interaction between the GPL and * the restrictions contained in a BSD-style copyright.) * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */#include "fp_emu.h"#include "fp_decode.h"| set flags for decode macros for fmovemdo_fmovem=1	.globl	fp_fmovem_fp, fp_fmovem_cr| %d1 contains the mask and count of the register list| for other register usage see fp_decode.hfp_fmovem_fp:	printf	PDECODE,"fmovem.x "	| get register list and count them	btst	#11,%d2	jne	1f	bfextu	%d2{#24,#8},%d0		| static register list	jra	2f1:	bfextu	%d2{#25,#3},%d0		| dynamic register list	jsr	fp_get_data_reg2:	move.l	%d0,%d1	swap	%d1	jra	2f1:	addq.w	#1,%d1			| count the # of registers in2:	lsr.b	#1,%d0			| register list and keep it in %d1	jcs	1b	jne	2b	printf	PDECODE,"#%08x",1,%d1#ifdef FPU_EMU_DEBUG	btst	#12,%d2	jne	1f	printf	PDECODE,"-"		| decremental move	jra	2f1:	printf	PDECODE,"+"		| incremental move2:	btst	#13,%d2	jeq	1f	printf	PDECODE,"->"		| fpu -> cpu	jra	2f1:	printf	PDECODE,"<-"		| fpu <- cpu2:#endif	| decode address mode	fp_decode_addr_mode	.long	fp_ill, fp_ill	.long	fpr_indirect, fpr_postinc	.long	fpr_predecr, fpr_disp16	.long	fpr_extmode0, fpr_extmode1	| addressing mode: address register indirectfpr_indirect:	fp_mode_addr_indirect	jra	fpr_do_movem	| addressing mode: address register indirect with postincrementfpr_postinc:	fp_mode_addr_indirect_postinc	jra	fpr_do_movemfpr_predecr:	fp_mode_addr_indirect_predec	jra	fpr_do_movem	| addressing mode: address register/programm counter indirect	|		   with 16bit displacementfpr_disp16:	fp_mode_addr_indirect_disp16	jra	fpr_do_movemfpr_extmode0:	fp_mode_addr_indirect_extmode0	jra	fpr_do_movemfpr_extmode1:	fp_decode_addr_reg	jmp	([0f:w,%pc,%d0*4])	.align	40:	.long	fpr_absolute_short, fpr_absolute_long	.long	fpr_disp16, fpr_extmode0	.long	fp_ill, fp_ill	.long	fp_ill, fp_illfpr_absolute_short:	fp_mode_abs_short	jra	fpr_do_movemfpr_absolute_long:	fp_mode_abs_long|	jra	fpr_do_movemfpr_do_movem:	swap	%d1			| get fpu register list	lea	(FPD_FPREG,FPDATA),%a1	moveq	#12,%d0	btst	#12,%d2	jne	1f	lea	(-12,%a1,%d0*8),%a1	neg.l	%d01:	btst	#13,%d2	jne	4f	| move register from memory into fpu	jra	3f1:	printf	PMOVEM,"(%p>%p)",2,%a0,%a1	getuser.l (%a0)+,%d2,fp_err_ua1,%a0	lsr.l	#8,%d2	lsr.l	#7,%d2	lsr.w	#1,%d2	move.l	%d2,(%a1)+	getuser.l (%a0)+,%d2,fp_err_ua1,%a0	move.l	%d2,(%a1)+	getuser.l (%a0),%d2,fp_err_ua1,%a0	move.l	%d2,(%a1)	subq.l	#8,%a0	subq.l	#8,%a1	add.l	%d0,%a02:	add.l	%d0,%a13:	lsl.b	#1,%d1	jcs	1b	jne	2b	jra	5f	| move register from fpu into memory1:	printf	PMOVEM,"(%p>%p)",2,%a1,%a0	move.l	(%a1)+,%d2	lsl.w	#1,%d2	lsl.l	#7,%d2	lsl.l	#8,%d2	putuser.l %d2,(%a0)+,fp_err_ua1,%a0	move.l	(%a1)+,%d2	putuser.l %d2,(%a0)+,fp_err_ua1,%a0	move.l	(%a1),%d2	putuser.l %d2,(%a0),fp_err_ua1,%a0	subq.l	#8,%a1	subq.l	#8,%a0	add.l	%d0,%a02:	add.l	%d0,%a14:	lsl.b	#1,%d1	jcs	1b	jne	2b5:	printf	PDECODE,"\n"#if 0	lea	(FPD_FPREG,FPDATA),%a0	printf	PMOVEM,"fp:"	printx	PMOVEM,%a0@(0)	printx	PMOVEM,%a0@(12)	printf	PMOVEM,"\n   "	printx	PMOVEM,%a0@(24)	printx	PMOVEM,%a0@(36)	printf	PMOVEM,"\n   "	printx	PMOVEM,%a0@(48)	printx	PMOVEM,%a0@(60)	printf	PMOVEM,"\n   "	printx	PMOVEM,%a0@(72)	printx	PMOVEM,%a0@(84)	printf	PMOVEM,"\n"#endif	jra	fp_end| set flags for decode macros for fmovem control registerdo_fmovem=1do_fmovem_cr=1fp_fmovem_cr:	printf	PDECODE,"fmovem.cr "	| get register list and count them	bfextu	%d2{#19,#3},%d0	move.l	%d0,%d1	swap	%d1	jra	2f1:	addq.w	#1,%d12:	lsr.l	#1,%d0	jcs	1b	jne	2b	printf	PDECODE,"#%08x",1,%d1#ifdef FPU_EMU_DEBUG	btst	#13,%d2	jeq	1f	printf	PDECODE,"->"		| fpu -> cpu	jra	2f1:	printf	PDECODE,"<-"		| fpu <- cpu2:#endif	| decode address mode	fp_decode_addr_mode	.long	fpc_data, fpc_addr	.long	fpc_indirect, fpc_postinc	.long	fpc_predecr, fpc_disp16	.long	fpc_extmode0, fpc_extmode1fpc_data:	fp_mode_data_direct	move.w	%d0,%d1	bfffo	%d2{#19,#3},%d0	sub.w	#19,%d0	lea	(FPD_FPCR,FPDATA,%d0.w*4),%a1	btst	#13,%d2	jne	1f	move.w	%d1,%d0	jsr	fp_get_data_reg	move.l	%d0,(%a1)	jra	fpc_movem_fin1:	move.l	(%a1),%d0	jsr	fp_put_data_reg	jra	fpc_movem_finfpc_addr:	fp_decode_addr_reg	printf	PDECODE,"a%d",1,%d0	btst	#13,%d2	jne	1f	jsr	fp_get_addr_reg	move.l	%a0,(FPD_FPIAR,FPDATA)	jra	fpc_movem_fin1:	move.l	(FPD_FPIAR,FPDATA),%a0	jsr	fp_put_addr_reg	jra	fpc_movem_finfpc_indirect:	fp_mode_addr_indirect	jra	fpc_do_movemfpc_postinc:	fp_mode_addr_indirect_postinc	jra	fpc_do_movemfpc_predecr:	fp_mode_addr_indirect_predec	jra	fpc_do_movemfpc_disp16:	fp_mode_addr_indirect_disp16	jra	fpc_do_movemfpc_extmode0:	fp_mode_addr_indirect_extmode0	jra	fpc_do_movemfpc_extmode1:	fp_decode_addr_reg	jmp	([0f:w,%pc,%d0*4])	.align	40:	.long	fpc_absolute_short, fpc_absolute_long	.long	fpc_disp16, fpc_extmode0	.long	fpc_immediate, fp_ill	.long	fp_ill, fp_illfpc_absolute_short:	fp_mode_abs_short	jra	fpc_do_movemfpc_absolute_long:	fp_mode_abs_long	jra	fpc_do_movemfpc_immediate:	fp_get_pc %a0	lea	(%a0,%d1.w*4),%a1	fp_put_pc %a1	printf	PDECODE,"#imm"|	jra	fpc_do_movem#if 0	swap	%d1	lsl.l	#5,%d1	lea	(FPD_FPCR,FPDATA),%a0	jra	3f1:	move.l	%d0,(%a0)2:	addq.l	#4,%a03:	lsl.b	#1,%d1	jcs	1b	jne	2b	jra	fpc_movem_fin#endiffpc_do_movem:	swap	%d1			| get fpu register list	lsl.l	#5,%d1	lea	(FPD_FPCR,FPDATA),%a11:	btst	#13,%d2	jne	4f	| move register from memory into fpu	jra	3f1:	printf	PMOVEM,"(%p>%p)",2,%a0,%a1	getuser.l (%a0)+,%d0,fp_err_ua1,%a0	move.l	%d0,(%a1)2:	addq.l	#4,%a13:	lsl.b	#1,%d1	jcs	1b	jne	2b	jra	fpc_movem_fin	| move register from fpu into memory1:	printf	PMOVEM,"(%p>%p)",2,%a1,%a0	move.l	(%a1),%d0	putuser.l %d0,(%a0)+,fp_err_ua1,%a02:	addq.l	#4,%a14:	lsl.b	#1,%d1	jcs	1b	jne	2bfpc_movem_fin:	and.l	#0x0000fff0,(FPD_FPCR,FPDATA)	and.l	#0x0ffffff8,(FPD_FPSR,FPDATA)	move.l	(FPD_FPCR,FPDATA),%d0	lsr.l	#4,%d0	moveq	#3,%d1	and.l	%d0,%d1	move.w	%d1,(FPD_RND,FPDATA)	lsr.l	#2,%d0	moveq	#3,%d1	and.l	%d0,%d1	move.w	%d1,(FPD_PREC,FPDATA)	printf	PDECODE,"\n"#if 0	printf	PMOVEM,"fpcr : %08x\n",1,FPDATA@(FPD_FPCR)	printf	PMOVEM,"fpsr : %08x\n",1,FPDATA@(FPD_FPSR)	printf	PMOVEM,"fpiar: %08x\n",1,FPDATA@(FPD_FPIAR)	clr.l	%d0	move.w	(FPD_PREC,FPDATA),%d0	printf	PMOVEM,"prec : %04x\n",1,%d0	move.w	(FPD_RND,FPDATA),%d0	printf	PMOVEM,"rnd  : %04x\n",1,%d0#endif	jra	fp_end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -