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

📄 m40.s

📁 UNIX v6源代码 这几乎是最经典的unix版本 unix操作系统设计和莱昂氏unix源代码分析都是用的该版
💻 S
字号:
/ machine language assist/ for 11/40/ non-UNIX instructionsmfpi	= 6500^tstmtpi	= 6600^tstwait	= 1rtt	= 6reset	= 5.globl	trap, call.globl	_traptrap:	mov	PS,-4(sp)	tst	nofault	bne	1f	mov	SSR0,ssr	mov	SSR2,ssr+4	mov	$1,SSR0	jsr	r0,call1; _trap	/ no return1:	mov	$1,SSR0	mov	nofault,(sp)	rtt.globl	_runrun, _swtchcall1:	tst	-(sp)	bic	$340,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)+2:	bis	$340,PS	tstb	_runrun	beq	2f	bic	$340,PS	jsr	pc,_swtch	br	2b2:	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, _display_savfp:_display:	rts	pc.globl	_incupc_incupc:	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	mul	6(r2),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)	inc	(sp)	mtpi	(r1)	br	3f2:	clr	6(r2)3:	mov	(sp)+,nofault1:	mov	(sp)+,r2	rts	pc/ Character list get/put.globl	_getc, _putc.globl	_cfreelist_getc:	mov	2(sp),r1	mov	PS,-(sp)	mov	r2,-(sp)	bis	$340,PS	bic	$100,PS		/ spl 5	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	2f1:	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,_cfreelist3:	mov	(sp)+,r2	mov	(sp)+,PS	rts	pc9:	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	$340,PS	bic	$100,PS		/ spl 5	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	2f1:	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	pc9:	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 op	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	t17/ 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:	/ illegalu1:	/ 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:	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:	.=.+1.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	$340,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	$340,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.globl	_copyin, _copyout_copyin:	jsr	pc,copsu1:	mfpi	(r0)+	mov	(sp)+,(r1)+	sob	r2,1b	br	2f_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_idle:	mov	PS,-(sp)	bic	$340,PS	wait	mov	(sp)+,PS	rts	pc.globl	_savu, _retu, _aretu_savu:	bis	$340,PS	mov	(sp)+,r1	mov	(sp),r0	mov	sp,(r0)+	mov	r5,(r0)+	bic	$340,PS	jmp	(r1)_aretu:	bis	$340,PS	mov	(sp)+,r1	mov	(sp),r0	br	1f_retu:	bis	$340,PS	mov	(sp)+,r1	mov	(sp),KISA6	mov	$_u,r01:	mov	(r0)+,sp	mov	(r0)+,r5	bic	$340,PS	jmp	(r1).globl	_spl0, _spl1, _spl4, _spl5, _spl6, _spl7_spl0:	bic	$340,PS	rts	pc_spl1:	bis	$40,PS	bic	$300,PS	rts	pc_spl4:_spl5:	bis	$340,PS	bic	$100,PS	rts	pc_spl6:	bis	$340,PS	bic	$40,PS	rts	pc_spl7:	bis	$340,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	_dpadd_dpadd:	mov	2(sp),r0	add	4(sp),2(r0)	adc	(r0)	rts	pc.globl	_dpcmp_dpcmp:	mov	2(sp),r0	mov	4(sp),r1	sub	6(sp),r0	sub	8(sp),r1	sbc	r0	bge	1f	cmp	r0,$-1	bne	2f	cmp	r1,$-512.	bhi	3f2:	mov	$-512.,r0	rts	pc1:	bne	2f	cmp	r1,$512.	blo	3f2:	mov	$512.,r13:	mov	r1,r0	rts	pc.globl	dumpdump:	bit	$1,SSR0	bne	dump/ save regs r0,r1,r2,r3,r4,r5,r6,KIA6/ starting at abs location 4	mov	r0,4	mov	$6,r0	mov	r1,(r0)+	mov	r2,(r0)+	mov	r3,(r0)+	mov	r4,(r0)+	mov	r5,(r0)+	mov	sp,(r0)+	mov	KISA6,(r0)+/ dump all of core (ie to first mt error)/ onto mag tape. (9 track or 7 track 'binary')	mov	$MTC,r0	mov	$60004,(r0)+	clr	2(r0)1:	mov	$-512.,(r0)	inc	-(r0)2:	tstb	(r0)	bge	2b	tst	(r0)+	bge	1b	reset/ end of file and loop	mov	$60007,-(r0)	br	..globl	start, _end, _edata, _mainstart:	bit	$1,SSR0	bne	start			/ loop if restart	reset/ 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/ 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	_ldiv_ldiv:	clr	r0	mov	2(sp),r1	div	4(sp),r0	rts	pc.globl	_lrem_lrem:	clr	r0	mov	2(sp),r1	div	4(sp),r0	mov	r1,r0	rts	pc.globl	_lshift_lshift:	mov	2(sp),r1	mov	(r1)+,r0	mov	(r1),r1	ashc	4(sp),r0	mov	r1,r0	rts	pc.globl	csvcsv:	mov	r5,r0	mov	sp,r5	mov	r4,-(sp)	mov	r3,-(sp)	mov	r2,-(sp)	jsr	pc,(r0).globl cretcret:	mov	r5,r1	mov	-(r1),r4	mov	-(r1),r3	mov	-(r1),r2	mov	r5,sp	mov	(sp)+,r5	rts	pc.globl	_u_u	= 140000usize	= 16.PS	= 177776SSR0	= 177572SSR2	= 177576KISA0	= 172340KISA6	= 172354KISD0	= 172300MTC	= 172522UISA0	= 177640UISA1	= 177642UISD0	= 177600UISD1	= 177602IO	= 7600.data.globl	_ka6, _cputype_ka6:	KISA6_cputype:40..bss.globl	nofault, ssr, badtrapnofault:.=.+2ssr:	.=.+6badtrap:.=.+2

⌨️ 快捷键说明

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