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

📄 tmga.s

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 S
字号:
/ tmg/ main program and parsing rule interpreter/tracing = 1f = r5g = r4i = r3sef=sec^sec; clf=clc^clc; bfs=bcs^bcs; bfc=bcc^bcc	/fail indicator.globl flush,obuild,putch,iget,kput.globl generate.globl cfile,dfile,ofile,input.globl main,succ,fail,errcom,pbundle,parse,diag.globl alt,salt,stop,goto.globl tables,start,end.globl stkb,stke.globl ktab.globl trswitch,trace.globl x,si,j,k,n,g1,env/ begin here/ get arguments from shell/ arg1 is input file/ arg2 is output file (standard output if missing)main:	dec	(sp)	beq	3f	mov	4(sp),0f	sys	open;0:0;0	bes	1f	mov	r0,input	dec	(sp)	beq	3f	mov	6(sp),0f	sys	creat;0:0;666	bes	1f	mov	r0,ofile/ set up tables/ initialize stack, for definitions see tmgc.s/ go interpret beginning at "start"/ finish up3:	mov	$stkb,f	clr	j(f)	clr	k(f)	clr	n(f)	mov	f,g	add	$g1,g	mov	$start,r0	jsr	pc,adv	jsr	pc,flush1:	sys	unlink;1f	sys	exit1:		<alloc.d\0>;.even/ fatal processor error/write a two letter message on diagnostic file/ get a dumperrcom:	mov	dfile,cfile	jsr	pc,obuild	mov	$1f,r0	jsr	pc,obuild	jsr	pc,flushstop:	41:	<--fatal\n\0>;.even/ all functions that succeed come here/ test the exit indicator, and leave the rule if onsucc:	inc	succc	bit	$1,x(f)	bne	sretcontin:	inc	continc    .if tracing	tst	trswitch	beq	1f	mov	$'r,r0	jsr	pc,trace1:    .endif/ get interpreted instruction/ save its exit bit (bit 0) on stack/ distinguish type of instruction by ranges of value	jsr	pc,iget	mov	r0,x(f)	bic	$1,r0.if ..	cmp	r0,$..	blo	1f.endif	cmp	r0,$start	blo	2f	cmp	r0,$end	blo	3f	cmp	r0,$tables	blo	2f/ bad address1:	jsr	r0,errcom		<bad address in parsing\0>;.even/ machine coded function2:	jmp	(r0)/ tmg-coded rule, execute and test its success/ bfc = branch on fail clear3:	jsr	pc,adv	bfc	succ/ all functions and rules that fail come here/ if exit bit is on do a fail return/ if following instruction is an alternate (recognized literally)/ do a goto, if a success alternate, do a nop/ otherwise do a fail returnfail:	inc	failc	bit	$1,x(f)	bne	fret	jsr	pc,iget	mov	r0,x(f)	bic	$1,r0	cmp	r0,$alt	beq	salt	cmp	r0,$salt	bne	fretalt:	tst	(i)+	br	succsalt:	jsr	pc,iget	mov	r0,i	br	contingoto:	br	salt/ do a success return/ bundle translations delivered to this rule,/ pop stack frame/ restore  interpreted instruction counter (i)/ update input cursor (j) for invoking rule/ update high water mark (k) in ktable/ if there was a translation delivered, add to stack frame/ clear the fail flagsret:	mov	f,r0	add	$g1,r0	jsr	pc,pbundle	mov	f,g	mov	(f),f	mov	si(f),i	mov	j(g),j(f)	mov	k(g),k(f)	tst	r0	beq	1f	mov	r0,(g)+1:	clf	rts	pc/ do a fail return/ pop stack/ do not update j or k/ restore interpreted instruction counterfret:	mov	f,g	mov	(f),f	mov	si(f),i	sef	rts	pc/ diag and parse builtins/ set current file to diagnostic or output/ save and restore ktable water mark around parse-translate/ also current file and next frame pointer (g)/ execute parsing rulediag:	mov	dfile,r1	br	1fparse:	mov	ofile,r11:	mov	cfile,-(sp)	mov	r1,cfile	mov	k(f),-(sp)	mov	g,-(sp)	jsr	pc,iget	jsr	pc,adv	bfs	1f/ rule succeeded/ if it delivered translation, put it in ktable and set/ instruction counter for/ translation generator to point there/ go generate	cmp	g,(sp)+	ble	2f	mov	-(g),r0	jsr	pc,kput	mov	k(f),i	neg	i	add	$ktab,i	mov	f,-(sp)	mov	g,f	clr	x(f)	jsr	pc,generate	mov	(sp)+,f	mov	si(f),i2:	mov	(sp)+,k(f)	mov	(sp)+,cfile	jmp	succ1:	mov	(sp)+,g	mov	(sp)+,k(f)	mov	(sp)+,cfile	br	fail/ advance stack frame to invoke a parsing rule/ copy  corsor, watr mark, ignored class to new frame/ set intial frame length to default (g1)/ check end of stack/ r0,r1 are new i,environmentadv:	inc	advc	mov	f,(g)	mov	i,si(f)	mov	j(f),j(g)	mov	k(f),k(g)	mov	n(f),n(g)	mov	g,f	add	$g1,g	cmp	g,$stke	bhis	1f	mov	r0,i	mov	r1,env(f)	jmp	contin1:	jsr	r0,errcom		<stack overflow\0>;.even/pbundle entered with pointer to earliest element of bunlde/to reduce from the top of stack in r0/exit with pointer to bundle in r0, or zero if bundle is emptypbundle:	cmp	r0,g	blo	1f	clr	r0	/empty bundle	rts	pc1:	mov	r0,-(sp)	mov	r0,r1	mov	(r1)+,r0	cmp	r1,g	beq	2f		/trivial bundle1:	mov	r1,-(sp)	jsr	pc,kput	mov	(sp)+,r1	mov	(r1)+,r0	cmp	r1,g	blos	1b	mov	k(f),r02:	mov	(sp)+,g	rts	pc/ tmg translation rule interpreter (generator)/ see tmgc.s for definitionstracing = 1f = r5.globl x,si,ek,ep,ek.fs,ep.fs,fs.globl trswitch,trace.globl start,end,tables,ktab,ktat.globl errcom.globl generate,.tpi = r3/ if exit bit is on pop stack frame restore inst counter and returngenerate:bit	$1,x(f)	beq	gcontin	sub	$fs,f	mov	si(f),i	rts	pcgcontin:    .if tracing	tst	trswitch	beq	1f	mov	$'g,r0	jsr	pc,trace1:    .endif / get interpreted instruction, decode by range of values	mov	(i)+,r0	mov	r0,x(f)	bic	$1,r0.if ..	cmp	r0,$..	blo	badadr.endif	cmp	r0,$start	blo	gf	cmp	r0,$end	blo	gc	cmp	r0,$tables	blo	gf	neg	r0	cmp	r0,$ktat	blo	gkbadadr:	jsr	r0,errcom		<bad address in translation\0>;.even/ builtin  translation functiongf:	jmp	(r0)/ tmg-coded translation subroutine/ execute it in current environmentgc:	mov	i,si(f)	mov	r0,i	mov	ek(f),ek.fs(f)	mov	ep(f),ep.fs(f)	add	$fs,f	jsr	pc,gcontin	br	generate/ delivered compound translation/ instruction counter is in ktable/ set the k environment for understanding 1, 2 .../ to designate this framegk:	mov	f,ek(f)	add	$ktab,r0	mov	r0,i	br	gcontin/ execute rule called for by 1 2 .../ found relative to instruction counter in the k environment/ this frame becomes th p environment for/ any parameters passed with this invocation/ e.g. for 1(x) see also .tq.tp:	movb	(i)+,r0	movb	(i)+,r2	inc	r0	asl	r0	mov	i,si(f)	mov	f,ep.fs(f)	mov	ek(f),r1	mov	si(r1),i	sub	r0,i	add	$fs,f	mov	f,ek(f)	asl	r2	beq	2f/element is 1.1, 1.2, .. 2.1,...	mov	(i),i	neg	i	bge	1f	jsr	r0,errcom		<not a bundle\0>;.even1:	cmp	i,$ktat	bhis	badadr	add	$ktab,i	sub	r2,i2:	jsr	pc,gcontin	br	generate/ tmg output routines/ and igetf = r5i = r3.globl env,si.globl errcom.globl cfile,lfile.globl putch,obuild,iget,flush.globl outb,outt,outw.globl start/ adds 1 or 2 characters in r0 to outputputch:	clr	-(sp)	mov	r0,-(sp)	mov	sp,r0	jsr	pc,obuild	add	$4,sp	rts	pc/ r0 points to string to put out  on current output file (cfile)/ string terminated by 0/ if last file differed from current file, flush output buffer first/ in any case flush output buffer when its write pointer (outw)/ reaches its top (outt)obuild:	cmp	cfile,lfile	beq	1f	mov	r0,-(sp)	jsr	pc,flush	mov	(sp)+,r0	mov	cfile,lfile1:	mov	outw,r11:	tstb	(r0)	beq	1f	movb	(r0)+,outb(r1)	inc	r1	mov	r1,outw	cmp	r1,$outt	blt	1b	mov	r0,-(sp)	jsr	pc,flush	mov	(sp)+,r0	br	obuild1:	rts	pc/ copy output buffer onto last output file and clear bufferflush:	mov	outw,0f	mov	lfile,r0	sys	write;outb;0:0	clr	outw	rts	pc/ get interpreted instruction for a parsing rule/ negative instruction is a pointer to a parameter in this/ stack fromae, fetch that instead/ put environment pointer in r1iget:	mov	f,r1	mov	(i)+,r0	bge	2f	mov	r0,-(sp)	/save the exit bit 	bic	$-2,(sp)	bic	(sp),r01:			/chase parameter	mov	env(r1),r1	add	si(r1),r0	mov	(r0),r0	blt	1b	mov	env(r1),r1	bis	(sp)+,r02:	rts	pc/there followeth the driving tablesstart:.datasuccc:	0continc:	0failc:	0advc:	0.text

⌨️ 快捷键说明

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