		include	"toseq.inc"

		import	system
		export	csystem

*
* csystem(str)
*
csystem:	move.l	A0,ToPutIs		; str

		; install new handler
		pea	NewTrap
		move.w	#trap1>>2,-(a7)
		move.w	#Setexc,-(a7)
		trap	#BIOS
		addq.l	#8,a7
		move.l	d0,OldTrap

		; call interactive system
		lea	empty,a0
		bra	system
		
OldSp:		dc.l	0
StatusReg:	dc.w	0
		dc.l	"XBRA"
		dc.l	"CSYS"
OldTrap:	dc.l	0
NewTrap:
		move.w	sr,StatusReg
		ori.w	#0x700,sr		; lock interrupts
		move.l	a7,OldSp
		btst	#13,(a7)		; call from user mode ?
		bne	handler			;  no -> a7 ok
		move.l	usp,a0			; put parameter on user stack
		move.l	2(a7),-(a0)		; pc
		move.w	(a7),-(a0)		; sr
		move.l	a0,a7

handler:	move.w	StatusReg,sr
		move.w	6(a7),d0		; functioncode
		
		; check for valid function
		cmp.w	#Cconis,d0
		beq	NewCconis
		cmp.w	#Crawcin,d0
		beq	NewCrawcin

OldFunction:	move.l	OldSp,a0
		move.w	(a7),(a0)		; sr
		move.l	2(a7),2(a0)		; pc
		move.l	a0,a7

		move.l	OldTrap,a0
		jmp	(a0)

NewCconis:
		move.l	ToPutIs,a0
		tst.b	(a0)
		beq	ThereWasNo
		move.b	#1,d0
		bra	TrapExit
		
NewCrawcin:
		move.l	ToPutIs,a0
		move.b	(a0)+,d0
		bne	ThereWasOne
ThereWasNo:
		move.l	OldTrap,trap1
		bra	OldFunction
ThereWasOne:
		move.l	a0,ToPutIs

TrapExit:	move.l	OldSp,a0
		move.w	(a7),(a0)		; sr
		move.l	2(a7),2(a0)		; pc
		move.l	a0,a7
		rte

ToPutIs:	dc.l	0
empty:		dc.b	0
