LSX/sys/mch.s

Compare this file to the similar file:
Show the results in this format:

/ Copyright 1975 Bell Telephone Laboratories Inc
/ machine language assist
/ for LSI-11

/ non-UNIX instructions
wait	= 1
rti	= 2
reset	= 5

mfps = 106700^tst	/ LSI instruction
mtps = 106400^tst

.if BGOPTION
.globl	_swtch
.endif

.globl	trap, call, _trap
.globl	emtrap

trap:
.if LSI
	mfps	-4(sp)
.endif
.if LSI-1
	mov	PS,-4(sp)
.endif
	tst	nofault
	bne	1f
emtrap:
	jsr	r0,call1; _trap
	/ no return
1:
	mov	nofault,(sp)
	rti

call1:
	tst	-(sp)
.if LSI
	clr	-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	bic	$340,PS
.endif
	br	1f

call:
.if LSI
	mfps	-(sp)
.endif
.if LSI-1
	mov	PS,-(sp)
.endif
1:
	mov	r1,-(sp)
	mov	sp,r1	/get stack pointer at trap
	mov	r1,-(sp)
	add	$10.,(sp)
	mov	4(sp),-(sp)
	bic	$!37,(sp)	/ trap type
	cmp	10.(sp),$_u+[usize*64.]
	blo	1f	/ trap from system
	inc	_user
	mov	2(sp),r1	/ trap from user, get user stack
	mov	$_u+[usize*64.],sp
	mov	-(r1),-(sp)	/ copy user stack to system stack
	mov	-(r1),-(sp)
	mov	-(r1),-(sp)
	mov	-(r1),-(sp)
	mov	-(r1),-(sp)
	mov	-(r1),-(sp)
	mov	-(r1),-(sp)
	jsr	pc,*(r0)+
.if BGOPTION
	clr	-(sp)
	jsr	pc,*$_swtch
	tst	(sp)+
.endif
.if LSI
	mov	$340,-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	bis	$340,PS
.endif
	br	2f
1:
	clr	_user
	jsr	pc,*(r0)+
.if BGOPTION
	clr	-(sp)
	jsr	pc,*$_swtch
	tst	(sp)+
.endif
2:
	tst	(sp)+
	mov	(sp)+,r1	/ new user stack pointer
	cmp	6(sp),$_u+[usize*64.]
	blo	1f	/ return from system trap
	sub	$10.,r1	/ begin. of system stack to be copied to user stack
	mov	(sp)+,(r1)+	/ copy system stack to user stack
	mov	(sp)+,(r1)+
	mov	(sp)+,(r1)+
	mov	(sp)+,(r1)+
	mov	(sp)+,(r1)+
	sub	$10.,r1
	mov	r1,sp	/ switch to user stack
1:
	mov	(sp)+,r1
	tst	(sp)+
	mov	(sp)+,r0
	rti

/ Character list get/put

.globl	_getc, _putc
.globl	_cfreelist

_getc:
	mov	2(sp),r1
.if LSI
	mfps	-(sp)
.endif
.if LSI-1
	mov	PS,-(sp)
.endif
	mov	r2,-(sp)
.if LSI
	mov	$340,-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	bis	$340,PS
.endif
	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
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc
9:
	clr	4(r1)
	mov	$-1,r0
	mov	(sp)+,r2
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc

_putc:
	mov	2(sp),r0
	mov	4(sp),r1
.if LSI
	mfps	-(sp)
.endif
.if LSI-1
	mov	PS,-(sp)
.endif
	mov	r2,-(sp)
	mov	r3,-(sp)
.if LSI
	mov	$340,-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	bis	$340,PS
.endif
	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
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc
9:
	mov	pc,r0
	mov	(sp)+,r3
	mov	(sp)+,r2
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc

.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	r0
1:
	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	2f
1:
	movb	6(sp),(sp)
2:
	mov	(sp)+,r0
	jsr	pc,pword
	clr	r0
	rts	pc

_fuiword:
_fuword:
	mov	2(sp),r1
fuword:
	jsr	pc,gword
	rts	pc

gword:
.if LSI
	mfps	-(sp)
	mov	$340,-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	mov	PS,-(sp)
	bis	$340,PS
.endif
	mov	nofault,-(sp)
	mov	$err,nofault
	mov	(r1),r0
	br	1f

_suiword:
_suword:
	mov	2(sp),r1
	mov	4(sp),r0
suword:
	jsr	pc,pword
	rts	pc

pword:
.if LSI
	mfps	-(sp)
	mov	$340,-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	mov	PS,-(sp)
	bis	$340,PS
.endif
	mov	nofault,-(sp)
	mov	$err,nofault
	mov	r0,(r1)
1:
	mov	(sp)+,nofault
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc

err:
	mov	(sp)+,nofault
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	tst	(sp)+
	mov	$-1,r0
	rts	pc

.globl	_copyin, _copyout
_copyin:
	jsr	pc,copsu
1:
	mov	(r0)+,(r1)+
.if	EIS
	sob	r2,1b
.endif
.if	EIS-1
	dec	r2
	bne	1b
.endif
	br	2f

_copyout:
	jsr	pc,copsu
1:
	mov	(r0)+,(r1)+
.if	EIS
	sob	r2,1b
.endif
.if	EIS-1
	dec	r2
	bne	1b
.endif
2:
	mov	(sp)+,nofault
	mov	(sp)+,r2
	clr	r0
	rts	pc

copsu:
	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	pc

1:
	mov	(sp)+,nofault
	mov	(sp)+,r2
	mov	$-1,r0
	rts	pc

.globl	_idle
_idle:
.if LSI
	mfps	-(sp)
	clr	-(sp)
	mtps	(sp)+
.endif
.if LSI-1
	mov	PS,-(sp)
	bic	$340,PS
.endif
	wait
.if LSI
	mtps	(sp)+
.endif
.if LSI-1
	mov	(sp)+,PS
.endif
	rts	pc

.globl	_savu, _retu
_savu:
.if LSI
	mov	$340,r0
	mtps	r0
.endif
.if LSI-1
	bis	$340,PS
.endif
	mov	(sp)+,r1
	mov	(sp),r0
	mov	sp,(r0)+
	mov	r5,(r0)+
.if LSI
	clr	r0
	mtps	r0
.endif
.if LSI-1
	bic	$340,PS
.endif
	jmp	(r1)

_retu:
.if LSI
	mov	$340,r0
	mtps	r0
.endif
.if LSI-1
	bis	$340,PS
.endif
	mov	(sp)+,r1
	mov	(sp),r0
	mov	(r0)+,sp
	mov	(r0)+,r5
.if LSI
	clr	r0
	mtps	r0
.endif
.if LSI-1
	bic	$340,PS
.endif
	jmp	(r1)

.globl	_spl0, _spl7
_spl0:
.if LSI
	mfps	r0
	clr	r1
	mtps	r1
.endif
.if LSI-1
	mov	*$PS,r0
	bic	$340,PS
.endif
	rts	pc

_spl7:
.if LSI
	mfps	r0
	mov	$340,r1
	mtps	r1
.endif
.if LSI-1
	mov	*$PS,r0
	bis	$340,PS
.endif
	rts	pc

.globl _rstps

_rstps:
.if LSI
	mtps	2(sp)
.endif
.if LSI-1
	mov	2(sp),*$PS
.endif
	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	3f
2:
	mov	$-512.,r0
	rts	pc
1:
	bne	2f
	cmp	r1,$512.
	blo	3f
2:
	mov	$512.,r1
3:
	mov	r1,r0
	rts	pc

.globl	start, _end, _edata, _main
start:
	reset

/ clear bss and user block

	mov	$_edata,r0
1:
	clr	(r0)+
	cmp	r0,$_u+[usize*64.]
	blo	1b

/ set up stack pointer

	mov	r0,sp

/ and pointer to system stack

	mov	$_u-2,_u


/ set up previous mode and call main
/ on return, enter user mode at 040000

	jsr	pc,_main
	mov	$_u+[usize*64.]+8192.,sp	/ set stack at first 4K of user space
	clr	-(sp)
	mov	$_u+[usize*64.],-(sp)
	rti


.globl	_lshift
_lshift:
	mov	2(sp),r1
	mov	(r1)+,r0
	mov	(r1),r1
	ashc	4(sp),r0
	mov	r1,r0
	rts	pc

.globl	csv
csv:
	mov	r5,r0
	mov	sp,r5
	mov	r4,-(sp)
	mov	r3,-(sp)
	mov	r2,-(sp)
	jsr	pc,(r0)

.globl cret
cret:
	mov	r5,r1
	mov	-(r1),r4
	mov	-(r1),r3
	mov	-(r1),r2
	mov	r5,sp
	mov	(sp)+,r5
	rts	pc

.globl	_u
_u	= 47000
usize	= 8.

PS	= 177776

.bss
.globl	nofault, _user
nofault:.=.+2
_user:	.=.+2