.sect .text
.sect .rom
.sect .data
.retaddr:
	.data4	0
.sect .bss
.sect .text
!THIS FILE CONTAINS THE SYSTEM CALLS FOR PMDS-II AS SUBROUTINES FOR THE
!EM-INTERPRETER. a5 CONTAINS A POINTER TO THE RETURN AREA . EACH SUBROUTINE
!EXPECTS ITS DATA IN THE FORM EM PRODUCES AND GIVES ITS RESULTS AS EM 
!REQUIRES.
!THE PMDS-II REQUIRES THE ARGUMENTS ON THE STACK AS 4 BYTE INTEGERS  OR
!POINTERS , AND USES THE C-CALLING CONVENTION. THE 2 BYTE WORDS 4 BYTE
!POINTERS VERSION HAS TO DO SOME CONVERSION FIRST .

_Xexit:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	__exit

_Xfork:		move.l	(sp)+,.retaddr
		jsr	_fork
		tst.l	d0
		blt	2f
		bne	1f
		jsr	_getpid
		mov	d1,-(sp)	!PID OF PARENT IN d1
		mov	#1,-(sp)	!(PID OF CHILD IN D0),FLAG 1 IN CHILD
		bra	0f
1:		mov	d0,-(sp)	!PID OF CHILD IN d0
		cl	-(sp)		!FLAG 0 IN PARENT
0:		cl	-(sp)
		bra	3f
2:		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
3:		move.l	.retaddr,a0
		jmp	(a0)
!_Xfork is special

_Xread:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	_read
sys0:		lea	12(sp),sp
		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		move.l	d0,-(sp)
		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

_Xwrite:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	_write
		bra	sys0

_Xopen:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st243
#endif
		jsr	_open
sys1:		lea	8(sp),sp
sys5:		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		mov	d0,-(sp)
		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

_Xclose:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	_close
sys3:		lea	4(sp),sp
sys4:		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

_Xwait:		move.l	(sp)+,.retaddr
.sect .data
xxxx:
	.data4 0
.sect .text
		move.l	#xxxx,-(sp)
		jsr	_wait
		add.l	#4,sp
sys6:		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		mov	d0,-(sp)		! ??
#ifdef lword
		move.l	xxxx,-(sp)
#else
		move.w	xxxx+2,-(sp)
#endif
		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

_Xcreat:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st243
#endif
		jsr	_creat
		bra	sys1

_Xlink:		move.l	(sp)+,.retaddr
		jsr	_link
		lea	8(sp),sp
		bra	sys4

_Xunlink:	move.l	(sp)+,.retaddr
		jsr	_unlink
		bra	sys3

_Xchdir:	move.l	(sp)+,.retaddr
		jsr	_chdir
		bra	sys3

_Xmknod:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st244
#endif
		jsr	_mknod
		lea	12(sp),sp
		bra	sys4

_Xchmod:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st243
#endif
		jsr	_chmod
		lea	8(sp),sp
		bra	sys4

_Xchown:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st244
#endif
		jsr	_chown
		lea	12(sp),sp
		bra	sys4

_Xbreak:	move.l	(sp)+,.retaddr
		jsr	_brk
		lea	4(sp),sp
		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		move.l	-4(sp),nd
		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

	.sect .data
nd:	.data4	endbss
	.sect .text

_Xstat:		move.l	(sp)+,.retaddr
		jsr	_stat
		lea	8(sp),sp
		bra	sys4

_Xlseek:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st245
#endif
		jsr	_lseek
		lea	12(sp),sp
		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:		move.l	d0,-(sp)
		cl	-(sp)
2:		move.l	.retaddr,a0
		jmp	(a0)

_Xgetpid:	move.l	(sp)+,.retaddr
		jsr	_getpid
		mov	d0,-(sp)
		move.l	.retaddr,a0
		jmp	(a0)

_Xmount:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st246
#endif
		jsr	_mount
		lea	12(sp),sp
		bra	sys4

_Xumount:	move.l	(sp)+,.retaddr
		jsr	_umount
		bra	sys3

_Xsetuid:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	_setuid
		bra	sys3

_Xgetuid:	move.l	(sp)+,.retaddr
		jsr	_getuid
sys7:		mov	d1,-(sp)
		mov	d0,-(sp)
		move.l	.retaddr,a0
		jmp	(a0)

_Xstime:	move.l	(sp)+,.retaddr
		jsr	_stime
		bra	sys3

_Xptrace:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st247
#endif
		jsr	_ptrace
		lea	16(sp),sp
		bra	sys5

_Xalarm:	move.l	(sp)+,.retaddr
#ifndef lword
		sub.l	#2,sp
		clr.w	(sp)
#endif
		jsr	_alarm
		lea	4(sp),sp
		mov	d0,-(sp)
		move.l	.retaddr,a0
		jmp	(a0)

_Xfstat:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st241
#endif
		jsr	_fstat
		lea	8(sp),sp
		bra	sys4

_Xpause:	jsr	_pause
		rts

_Xutime:	move.l	(sp)+,.retaddr
		jsr	_utime
		lea	8(sp),sp
		bra	sys4

_Xaccess:	move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st243
#endif
		jsr	_access
		lea	8(sp),sp
		bra	sys4

_Xnice:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	241
#endif
		jsr	_nice
		move.l	.retaddr,(sp)
		rts

_Xftime:	move.l	(sp)+,.retaddr
		jsr	_ftime
		bra	sys3

_Xsync:		jsr	_sync
		rts

_Xkill:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st248
#endif
		jsr	_kill
		lea	4(sp),sp
		bra	sys4

_Xdup:		move.l	(sp)+,.retaddr
#ifndef lword
		bsr	st248
#endif
		jsr	_dup
		bra	sys1

_Xpipe:		move.l	(sp)+,.retaddr
		move.l	#xxxx,-(sp)
		jsr	_pipe
		add.l	#4,sp
		bra	sys6

_Xtimes:	move.l	(sp)+,.retaddr
		jsr	_times
		move.l	.retaddr,a0
		add.l	#4,sp
		jmp	(a0)

_Xprofil:	move.l	(sp)+,.retaddr
		jsr	_profil
		move.l	.retaddr,a0
		lea	16(sp),sp
		jmp	(a0)

_Xsetgid:	move.l	(sp)+,.retaddr
#ifndef	lword
		bsr	st241 
#endif
		jsr	_setgid
		bra	sys3

_Xgetgid:	move.l	(sp)+,.retaddr
		jsr	_getgid
		bra	sys7

_Xsignal:	move.l	(sp)+,.retaddr
		mov	(sp)+,d4
		extend	d4
		move.l	d4,-(sp)
		jsr	_signal
		lea	8(sp),sp		!remove arguments
		cmp.l	#-1,d0
		bne	1f
		move.l	_errno,d0
		mov	d0,-(sp)
		mov	d0,-(sp)
		bra	2f
1:
 		mov	d0,-(sp)
		cl	-(sp)
2:
		move.l	.retaddr,a0
		jmp	(a0)

_Xacct:		move.l	(sp)+,.retaddr
		jsr	_acct
		bra	sys3
!_Xlock:		move.l	(sp)+,.retaddr
!#ifndef	lword
!		bsr	st241
!#endif
!		jsr	_lock
!		bra	sys3

_Xioctl:	move.l	(sp)+,.retaddr
#ifndef	lword
		bsr	st248
#endif
#ifdef __USG
! only support TIOCGETP and TIOCSETP
		move.l	4(sp),d0
		cmp.l	#0x7408,d0	! TIOCGETP
		bne	1f
		move.l	(sp)+,d0
		move.l	d0,(sp)
		jsr	_gtty
		lea	8(sp),sp
		bra	sys4
1:
		cmp.l	#0x7409,d0	! TIOCSETP
		bne	9f
		move.l	(sp)+,d0
		move.l	d0,(sp)
		jsr	_stty
		lea	8(sp),sp
		bra	sys4
#endif
#ifdef __BSD4_2
.sect .data
XXmapping:
.data4	0x7408,0x40067408			! TIOCGETP
.data4	0x7409,0x80067409			! TIOCSETP
.data4	0x740a,0x8006740a			! TIOCSETN
.data4	0x740d,0x2000740d			! TIOCEXCL
.data4	0x740e,0x2000740e			! TIOCNXCL
.data4	0x7402,0x20007402			! TIOCHPCL
.data4	0x7412,0x40067412			! TIOCGETC
.data4	0x7411,0x40067411			! TIOCSETC
.data4	0
.sect .text
		lea	XXmapping, a0
		move.l	4(sp),d0
1:
		tst.l	(a0)
		beq	9f
		cmp.l	(a0),d0
		beq	1f
		add.l	#8,a0
		bra	1b
1:
		move.l	4(a0),d0
		move.l	d0,4(sp)
#endif
9:
		jsr	_ioctl
		lea	12(sp),sp
		bra	sys4

!_Xmpxcall:	move.l	(sp)+,.retaddr
!#ifndef	lword
!		bsr	st241
!#endif
!		trap	#0
!	.data2	56
!		lea	12(sp),sp
!		bra	sys4

_Xexece:	move.l	(sp)+,.retaddr
		jsr	_execve
		lea	12(sp),sp
		bra	sys4

_Xumask:	move.l	(sp)+,.retaddr
#ifndef	lword
		bsr	st241
#endif
		jsr	_umask
		add.l	#4,sp
		mov	d0,-(sp)
		move.l	.retaddr,a0
		jmp	(a0)

_Xchroot:	move.l	(sp)+,.retaddr
		jsr	_chroot
		bra	sys3


!----------------------------------------------------------------------------
!		STACK ADJUSTMENT FOR THE TWO BYTE INTERPRETER
!-----------------------------------------------------------------------------
#ifndef lword

st241:		sub.l	#2,sp
		move.l	2(sp),(sp)
		move.w	6(sp),d0
		ext.l	d0
		move.l	d0,4(sp)
		rts

st243:		sub.l	#2,sp
		move.l	2(sp),(sp)
		move.l	6(sp),4(sp)
		move.w	10(sp),d0
		ext.l	d0
		move.l	d0,8(sp)
		rts

st244:		move.l	(sp),-(sp)
		move.l	8(sp),4(sp)
		move.w	12(sp),d0
		ext.l	d0
		move.l	d0,8(sp)
		move.w	16(sp),d0
		ext.l	d0
		move.l	d0,12(sp)
		rts

st245:		move.l	(sp),-(sp)
		move.w	8(sp),d0
		ext.l	d0
		move.l	d0,4(sp)
		move.l	10(sp),8(sp)
		move.w	14(sp),d0
		ext.l	d0
		move.l	d0,12(sp)
		rts

st246:		sub.l	#2,sp
		move.l	2(sp),(sp)
		move.l	6(sp),4(sp)
		move.l	10(sp),8(sp)
		move.w	14(sp),d0
		ext.l	d0
		move.l	d0,12(sp)
		rts

st247:		sub.l	#6,sp
		move.l	6(sp),(sp)
		move.w	10(sp),d0
		ext.l	d0
		move.l	d0,4(sp)
		move.w	12(sp),d0
		ext.l	d0
		move.l	d0,8(sp)
		move.l	14(sp),12(sp)
		move.w	18(sp),d0
		ext.l	d0
		move.l	d0,16(sp)
		rts

st248:		move.l	(sp),-(sp)
		move.w	8(sp),d0
		ext.l	d0
		move.l	d0,4(sp)
		move.w	10(sp),d0
		ext.l	d0
		move.l	d0,8(sp)
		rts

#endif
