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

📄 m40.s

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 S
字号:
/ machine language assist/ for 11/40/ non-UNIX instructionsmfpi	= 6500^tstmtpi	= 6600^tsthalt	= 0wait	= 1reset	= 5rtt	= 6.globl	start, _end, _edata, _main, dumpdump:start:	mov	$trap,34/ Set location 0 and 2 to catch traps and jumps to 0	mov	$42,0		/ illegal instruction if jump	mov	$777,2		/ trace trap at high priority if trap/ initialize systems segments	mov	$KISA0,r0	mov	$KISD0,r1	mov	$200,r4	clr	r2	mov	$6,r31:	mov	r2,(r0)+	mov	$77406,(r1)+		/ 4k rw	add	r4,r2	sob	r3,1b/ initialize user segment	mov	$_end+63.,r2	ash	$-6,r2	bic	$!1777,r2	mov	r2,(r0)+		/ ksr6 = sysu	mov	$usize-1\<8|6,(r1)+/ initialize io segment/ set up counts on supervisor segments	mov	$IO,(r0)+	mov	$77406,(r1)+		/ rw 4k/ get a sp and start segmentation	mov	$_u+[usize*64.],sp	inc	SSR0/ test for floating point	mov	$1f,nofault	setd				/ jumps to 1f if no fpu	inc	fpp1:	clr	nofault/ clear bss	mov	$_edata,r01:	clr	(r0)+	cmp	r0,$_end	blo	1b/ clear user block	mov	$_u,r01:	clr	(r0)+	cmp	r0,$_u+[usize*64.]	blo	1b/ set up previous mode and call main/ on return, enter user mode at 0R	mov	$30000,PS	jsr	pc,_main	mov	$170000,-(sp)	clr	-(sp)	rtt.globl	trap, call.globl	_trap/ all traps and interrupts are/ vectored thru this routine.trap:	mov	PS,saveps	tst	nofault	bne	1f	mov	SSR0,ssr	mov	SSR2,ssr+4	mov	$1,SSR0	jsr	r0,call1; jmp _trap	/ no return1:	mov	$1,SSR0	mov	nofault,(sp)	rtt.text.globl	_runruncall1:	mov	saveps,-(sp)	bic	$HIPRI,PS	br	1fcall:	mov	PS,-(sp)1:	mov	r1,-(sp)	mfpi	sp	mov	4(sp),-(sp)	bic	$!37,(sp)	bit	$30000,PS	beq	1f	jsr	pc,(r0)+	tstb	_runrun	beq	2f	mov	$12.,(sp)		/ trap 12 is give up cpu	jsr	pc,_trap2:	tst	(sp)+	mtpi	sp	br	2f1:	bis	$30000,PS	jsr	pc,(r0)+	cmp	(sp)+,(sp)+2:	mov	(sp)+,r1	tst	(sp)+	mov	(sp)+,r0	rtt.globl	_savfp_savfp:	tst	fpp	beq	8f	mov	2(sp),r1	stfps	(r1)+	setd	movf	fr0,(r1)+	movf	fr1,(r1)+	movf	fr2,(r1)+	movf	fr3,(r1)+	movf	fr4,fr0	movf	fr0,(r1)+	movf	fr5,fr0	movf	fr0,(r1)+8:	rts	pc.globl	_restfp_restfp:	tst	fpp	beq	8f	mov	2(sp),r1	mov	r1,r0	setd	add	$8.+2.,r1	movf	(r1)+,fr1	movf	(r1)+,fr2	movf	(r1)+,fr3	movf	(r1)+,fr0	movf	fr0,fr4	movf	(r1)+,fr0	movf	fr0,fr5	movf	2(r0),fr0	ldfps	(r0)8:	rts	pc.globl	_addupc_addupc:	mov	r2,-(sp)	mov	6(sp),r2		/ base of prof with base,leng,off,scale	mov	4(sp),r0		/ pc	sub	4(r2),r0		/ offset	clc	ror	r0	mov	6(r2),r1	clc	ror	r1	mul	r1,r0		/ scale	ashc	$-14.,r0	inc	r1	bic	$1,r1	cmp	r1,2(r2)		/ length	bhis	1f	add	(r2),r1		/ base	mov	nofault,-(sp)	mov	$2f,nofault	mfpi	(r1)	add	12.(sp),(sp)	mtpi	(r1)	br	3f2:	clr	6(r2)3:	mov	(sp)+,nofault1:	mov	(sp)+,r2	rts	pc.globl	_display_display:	rts	pc/ Character list get/put/.globl	_getc, _putc/.globl	_cfreelist//_getc:/	mov	2(sp),r1/	mov	PS,-(sp)/	mov	r2,-(sp)/	bis	$HIPRI,PS/	bic	$40,PS/	mov	2(r1),r2		/ first ptr/	beq	9f		/ empty/	movb	(r2)+,r0		/ character/	bic	$!377,r0/	mov	r2,2(r1)/	dec	(r1)+		/ count/	bne	1f/	clr	(r1)+/	clr	(r1)+		/ last block/	br	2f/1:/	bit	$7,r2/	bne	3f/	mov	-10(r2),(r1)		/ next block/	add	$2,(r1)/2:/	dec	r2/	bic	$7,r2/	mov	_cfreelist,(r2)/	mov	r2,_cfreelist/3:/	mov	(sp)+,r2/	mov	(sp)+,PS/	rts	pc/9:/	clr	4(r1)/	mov	$-1,r0/	mov	(sp)+,r2/	mov	(sp)+,PS/	rts	pc//_putc:/	mov	2(sp),r0/	mov	4(sp),r1/	mov	PS,-(sp)/	mov	r2,-(sp)/	mov	r3,-(sp)/	bis	$HIPRI,PS/	bic	$40,PS/	mov	4(r1),r2		/ last ptr/	bne	1f/	mov	_cfreelist,r2/	beq	9f/	mov	(r2),_cfreelist/	clr	(r2)+/	mov	r2,2(r1)		/ first ptr/	br	2f/1:/	bit	$7,r2/	bne	2f/	mov	_cfreelist,r3/	beq	9f/	mov	(r3),_cfreelist/	mov	r3,-10(r2)/	mov	r3,r2/	clr	(r2)+/2:/	movb	r0,(r2)+/	mov	r2,4(r1)/	inc	(r1)		/ count/	clr	r0/	mov	(sp)+,r3/	mov	(sp)+,r2/	mov	(sp)+,PS/	rts	pc/9:/	mov	pc,r0/	mov	(sp)+,r3/	mov	(sp)+,r2/	mov	(sp)+,PS/	rts	pc.globl	_backup.globl	_regloc_backup:	mov	2(sp),ssr+2	mov	r2,-(sp)	jsr	pc,backup	mov	r2,ssr+2	mov	(sp)+,r2	movb	jflg,r0	bne	2f	mov	2(sp),r0	movb	ssr+2,r1	jsr	pc,1f	movb	ssr+3,r1	jsr	pc,1f	movb	_regloc+7,r1	asl	r1	add	r0,r1	mov	ssr+4,(r1)	clr	r02:	rts	pc1:	mov	r1,-(sp)	asr	(sp)	asr	(sp)	asr	(sp)	bic	$!7,r1	movb	_regloc(r1),r1	asl	r1	add	r0,r1	sub	(sp)+,(r1)	rts	pc/ hard part/ simulate the ssr2 register missing on 11/40backup:	clr	r2		/ backup register ssr1	mov	$1,bflg		/ clrs jflg	mov	ssr+4,r0	jsr	pc,fetch	mov	r0,r1	ash	$-11.,r0	bic	$!36,r0	jmp	*0f(r0)0:		t00; t01; t02; t03; t04; t05; t06; t07		t10; t11; t12; t13; t14; t15; t16; t17t00:	clrb	bflgt10:	mov	r1,r0	swab	r0	bic	$!16,r0	jmp	*0f(r0)0:		u0; u1; u2; u3; u4; u5; u6; u7u6:	/ single op, m[tf]pi, sxt, illegal	bit	$400,r1	beq	u5		/ all but m[tf], sxt	bit	$200,r1	beq	1f		/ mfpi	bit	$100,r1	bne	u5		/ sxt/ simulate mtpi with double (sp)+,dd	bic	$4000,r1	/ turn instr into (sp)+	br	t01/ simulate mfpi with double ss,-(sp)1:	ash	$6,r1	bis	$46,r1		/ -(sp)	br	t01u4:	/ jsr	mov	r1,r0	jsr	pc,setreg	/ assume no fault	bis	$173000,r2	/ -2 from sp	rts	pct07:	/ EIS	clrb	bflgu0:	/ jmp, swabu5:	/ single opf5:	/ movei, movfiff1:	/ ldfpsff2:	/ stfpsff3:	/ stst	mov	r1,r0	br	setregt01:	/ movt02:	/ cmpt03:	/ bitt04:	/ bict05:	/ bist06:	/ addt16:	/ sub	clrb	bflgt11:	/ movbt12:	/ cmpbt13:	/ bitbt14:	/ bicbt15:	/ bisb	mov	r1,r0	ash	$-6,r0	jsr	pc,setreg	swab	r2	mov	r1,r0	jsr	pc,setreg/ if delta(dest) is zero,/ no need to fetch source	bit	$370,r2	beq	1f/ if mode(source) is R,/ no fault is possible	bit	$7000,r1	beq	1f/ if reg(source) is reg(dest),/ too bad.	mov	r2,-(sp)	bic	$174370,(sp)	cmpb	1(sp),(sp)+	beq	u7/ start source cycle/ pick up value of reg	mov	r1,r0	ash	$-6,r0	bic	$!7,r0	movb	_regloc(r0),r0	asl	r0	add	ssr+2,r0	mov	(r0),r0/ if reg has been incremented,/ must decrement it before fetch	bit	$174000,r2	ble	2f	dec	r0	bit	$10000,r2	beq	2f	dec	r02:/ if mode is 6,7 fetch and add X(R) to R	bit	$4000,r1	beq	2f	bit	$2000,r1	beq	2f	mov	r0,-(sp)	mov	ssr+4,r0	add	$2,r0	jsr	pc,fetch	add	(sp)+,r02:/ fetch operand/ if mode is 3,5,7 fetch *	jsr	pc,fetch	bit	$1000,r1	beq	1f	bit	$6000,r1	bne	fetch1:	rts	pct17:	/ floating point instructions	clrb	bflg	mov	r1,r0	swab	r0	bic	$!16,r0	jmp	*0f(r0)0:		f0; f1; f2; f3; f4; f5; f6; f7f0:	mov	r1,r0	ash	$-5,r0	bic	$!16,r0	jmp	*0f(r0)0:		ff0; ff1; ff2; ff3; ff4; ff5; ff6; ff7f1:	/ mulf, modff2:	/ addf, movff3:	/ subf, cmpff4:	/ movf, divfff4:	/ clrfff5:	/ tstfff6:	/ absfff7:	/ negf	inc	fflg	mov	r1,r0	br	setregf6:	bit	$400,r1	beq	f1	/ movfo	br	f5	/ movief7:	bit	$400,r1	beq	f5	/ movif	br	f1	/ movofff0:	/ cfcc, setf, setd, seti, setlu1:	/ bru2:	/ bru3:	/ bru7:	/ illegal	incb	jflg	rts	pcsetreg:	mov	r0,-(sp)	bic	$!7,r0	bis	r0,r2	mov	(sp)+,r0	ash	$-3,r0	bic	$!7,r0	movb	0f(r0),r0	tstb	bflg	beq	1f	bit	$2,r2	beq	2f	bit	$4,r2	beq	2f1:	cmp	r0,$20	beq	2f	cmp	r0,$-20	beq	2f	asl	r02:	tstb	fflg	beq	3f	asl	r0	stfps	r1	bit	$200,r1	beq	3f	asl	r03:	bisb	r0,r2	rts	pc0:	.byte	0,0,10,20,-10,-20,0,0fetch:	bic	$1,r0	mov	nofault,-(sp)	mov	$1f,nofault	mfpi	(r0)	mov	(sp)+,r0	mov	(sp)+,nofault	rts	pc1: 	mov	(sp)+,nofault	clrb	r2			/ clear out dest on fault	mov	$-1,r0	rts	pc.bssbflg:	.=.+1jflg:	.=.+1fflg:	.=.+1.text.text.globl	_fubyte, _subyte.globl	_fuibyte, _suibyte.globl	_fuword, _suword.globl	_fuiword, _suiword_fuibyte:_fubyte:	mov	2(sp),r1	bic	$1,r1	jsr	pc,gword	cmp	r1,2(sp)	beq	1f	swab	r01:	bic	$!377,r0	rts	pc_suibyte:_subyte:	mov	2(sp),r1	bic	$1,r1	jsr	pc,gword	mov	r0,-(sp)	cmp	r1,4(sp)	beq	1f	movb	6(sp),1(sp)	br	2f1:	movb	6(sp),(sp)2:	mov	(sp)+,r0	jsr	pc,pword	clr	r0	rts	pc_fuiword:_fuword:	mov	2(sp),r1fuword:	jsr	pc,gword	rts	pcgword:	mov	PS,-(sp)	bis	$HIPRI,PS	mov	nofault,-(sp)	mov	$err,nofault	mfpi	(r1)	mov	(sp)+,r0	br	1f_suiword:_suword:	mov	2(sp),r1	mov	4(sp),r0suword:	jsr	pc,pword	rts	pcpword:	mov	PS,-(sp)	bis	$HIPRI,PS	mov	nofault,-(sp)	mov	$err,nofault	mov	r0,-(sp)	mtpi	(r1)1:	mov	(sp)+,nofault	mov	(sp)+,PS	rts	pcerr:	mov	(sp)+,nofault	mov	(sp)+,PS	tst	(sp)+	mov	$-1,r0	rts	pc	rts	pc.globl	_copyin, _copyout.globl	_copyiin, _copyiout_copyiin:_copyin:	jsr	pc,copsu1:	mfpi	(r0)+	mov	(sp)+,(r1)+	sob	r2,1b	br	2f_copyiout:_copyout:	jsr	pc,copsu1:	mov	(r0)+,-(sp)	mtpi	(r1)+	sob	r2,1b2:	mov	(sp)+,nofault	mov	(sp)+,r2	clr	r0	rts	pccopsu:	mov	(sp)+,r0	mov	r2,-(sp)	mov	nofault,-(sp)	mov	r0,-(sp)	mov	10(sp),r0	mov	12(sp),r1	mov	14(sp),r2	asr	r2	mov	$1f,nofault	rts	pc1:	mov	(sp)+,nofault	mov	(sp)+,r2	mov	$-1,r0	rts	pc.globl	_idle, _waitloc_idle:	mov	PS,-(sp)	bic	$HIPRI,PS	waitwaitloc:	mov	(sp)+,PS	rts	pc	.data_waitloc:	waitloc	.text.globl	_save_save:	mov	(sp)+,r1	mov	(sp),r0	mov	r2,(r0)+	mov	r3,(r0)+	mov	r4,(r0)+	mov	r5,(r0)+	mov	sp,(r0)+	mov	r1,(r0)+	clr	r0	jmp	(r1).globl	_resume_resume:	mov	2(sp),r0		/ new process	mov	4(sp),r1		/ new stack	bis	$HIPRI,PS	mov	r0,KISA6		/ In new process	mov	(r1)+,r2	mov	(r1)+,r3	mov	(r1)+,r4	mov	(r1)+,r5	mov	(r1)+,sp	mov	$1,r0	bic	$HIPRI,PS	jmp	*(r1)+.globl	_spl0, _spl1, _spl4, _spl5, _spl6, _spl7, _splx_spl0:	mov	PS,r0	bic	$HIPRI,PS	rts	pc_spl1:	mov	PS,r0	bis	$HIPRI,PS	bic	$300,PS	rts	pc_spl4:	mov	PS,r0	bis	$HIPRI,PS	bic	$140,PS	rts	pc_spl5:	mov	PS,r0	bis	$HIPRI,PS	bic	$100,PS	rts	pc_spl6:	mov	PS,r0	bis	$HIPRI,PS	bic	$40,PS	rts	pc_spl7:	mov	PS,r0	bis	$HIPRI,PS	rts	pc_splx:	mov	2(sp),PS	rts	pc.globl	_copyseg_copyseg:	mov	PS,-(sp)	mov	UISA0,-(sp)	mov	UISA1,-(sp)	mov	$30340,PS	mov	10(sp),UISA0	mov	12(sp),UISA1	mov	UISD0,-(sp)	mov	UISD1,-(sp)	mov	$6,UISD0	mov	$6,UISD1	mov	r2,-(sp)	clr	r0	mov	$8192.,r1	mov	$32.,r21:	mfpi	(r0)+	mtpi	(r1)+	sob	r2,1b	mov	(sp)+,r2	mov	(sp)+,UISD1	mov	(sp)+,UISD0	mov	(sp)+,UISA1	mov	(sp)+,UISA0	mov	(sp)+,PS	rts	pc.globl	_clearseg_clearseg:	mov	PS,-(sp)	mov	UISA0,-(sp)	mov	$30340,PS	mov	6(sp),UISA0	mov	UISD0,-(sp)	mov	$6,UISD0	clr	r0	mov	$32.,r11:	clr	-(sp)	mtpi	(r0)+	sob	r1,1b	mov	(sp)+,UISD0	mov	(sp)+,UISA0	mov	(sp)+,PS	rts	pc.globl	_piget, _piput_piget:	mov	PS,-(sp)	jsr	pc,2f	mfpi	(r0)	mov	(sp)+,r01:	mov	(sp)+,PS	rts	pc_piput:	mov	PS,-(sp)	jsr	pc,2f	mov	10(sp),r1	mov	r1,-(sp)	mtpi	(r0)	br	1b2:	mov	6(sp),r0	mov	10(sp),r1	ashc	$-6,r0	mov	HIPRI,PS	mov	r1,KISA7	mov	10(sp),r0	bic	$!77,r0	bis	$160000,r0	rts	pc/ Long quotient	.globl	ldivldiv:	jsr	r5,csv	mov	10.(r5),r3	sxt	r4	bpl	1f	neg	r31:	cmp	r4,8.(r5)	bne	hardldiv	mov	6.(r5),r2	mov	4.(r5),r1	bge	1f	neg	r1	neg	r2	sbc	r1	com	r41:	mov	r4,-(sp)	clr	r0	div	r3,r0	mov	r0,r4		/high quotient	mov	r1,r0	mov	r2,r1	div	r3,r0	bvc	1f	sub	r3,r0		/ this is the clever part	div	r3,r0	tst	r1	sxt	r1	add	r1,r0		/ cannot overflow!1:	mov	r0,r1	mov	r4,r0	tst	(sp)+	bpl	9f	neg	r0	neg	r1	sbc	r09:	jmp	crethardldiv:	4/ Long remainder	.globl	lremlrem:	jsr	r5,csv	mov	10.(r5),r3	sxt	r4	bpl	1f	neg	r31:	cmp	r4,8.(r5)	bne	hardlrem	mov	6.(r5),r2	mov	4.(r5),r1	mov	r1,r4	bge	1f	neg	r1	neg	r2	sbc	r11:	clr	r0	div	r3,r0	mov	r1,r0	mov	r2,r1	div	r3,r0	bvc	1f	sub	r3,r0	div	r3,r0	tst	r1	beq	9f	add	r3,r11:	tst	r4	bpl	9f	neg	r19:	sxt	r0	jmp	cret/ The divisor is known to be >= 2^15.	Only 16 cycles are/ needed to get a remainder.hardlrem:	4.globl	csvcsv:	mov	r5,r0	mov	sp,r5	mov	r4,-(sp)	mov	r3,-(sp)	mov	r2,-(sp)	jsr	pc,(r0).globl cretcret:	mov	r5,r2	mov	-(r2),r4	mov	-(r2),r3	mov	-(r2),r2	mov	r5,sp	mov	(sp)+,r5	rts	pc.globl	_u_u	= 140000usize	= 16.HIPRI	= 340PS	= 177776SSR0	= 177572SSR2	= 177576KISA0	= 172340KISA6	= 172354KISA7	= 172356KISD0	= 172300MTC	= 172522TUC	= 172440UISA0	= 177640UISA1	= 177642UISD0	= 177600UISD1	= 177602IO	= 7600.data.globl	_ka6.globl	_cputype_ka6:	KISA6_cputype:40.stk:	0.bssnofault:.=.+2ssr:	.=.+6saveps: .=.+2power:	.=.+2fpp:	.=.+2.globl	_stst.text.globl	_stststst	= 170300^tst_stst:	tst	fpp	beq	9f	stst	r0	mov	r0,*2(sp)9:	rts	pc

⌨️ 快捷键说明

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