MODULE unixcalls;

DEFINE
	open, close, read, write, seek;

PROCEDURE open (
	filename :	ARRAY integer OF char;
	mode :		UNIV integer
) :			integer;

BEGIN
	open := -1;

code('	tst	(sp)+');	{ fix sp because of := }
code('	mov	sp,r3');	{ save stack pointer }
code('	mov	6(r3),r0');	{ high file name index }
code('	sub	10(r3),r0');	{ minus low file name index }
code('	inc	r0');		{ no of chars in file name }

code('	mov	r0,r1');	{ make room on stack ... }
code('	inc	r1');		{ ... bump once for null ... }
code('	inc	r1');		{ ... once in case it is odd ... }
code('	bic	$1,r1');	{ ... make sure it is even ... }
code('	sub	r1,sp');	{ ... and voila }

code('	mov	4(r3),r1');	{ addr of filename[0] }
code('	add	10(r3),r1');	{ first char of filename }
code('	mov	sp,r2');	{ r2 is destination }
code('1:movb	(r1)+,(r2)+');	{ move from filename to buffer }
code('	sob	r0,1b');
code('	clrb	(r2)');		{ and tack on null }

code('  mov     sp,0f');        { address of file name }
code('	mov	2(r3),0f+2');	{ mode }
code('	sys	0;	 9f');	{ indirect system call }
code('	bec	2f');		{ branch if no error }
code('	mov	$-1,r0');	{ return -1 if error }
code('2:mov     r3,sp');        { restore stack pointer }
code('	rts	pc');		{ and return }

code('.data');
code('9:sys	open; 0:0; 0');
code('.text');

END open;

PROCEDURE close (
	fd :		UNIV integer
);

BEGIN

code('	mov	2(sp),r0');	{ put file escriptor in r0 }
code('	sys	close');
code('	rts	pc');

END close;

PROCEDURE seek (
	fd :		UNIV integer;
	offset :	UNIV integer;
	ptrname :	UNIV integer
);

BEGIN

code('	mov	2(sp),0f+2');	{ ptrname }
code('	mov	4(sp),0f');	{ offset }
code('	mov	6(sp),r0');	{ file descriptor }
code('	sys	0; 9f');	{ indirect system call }
code('	bec	2f');		{ braanch if no error }
code('	mov	$-1,r0');	{ return error value }
code('	rts	pc');		
code('2:clr	r0');		{ return normal value }
code('	rts	pc');

code('.data');
code('9:sys	seek; 0:0; 0');
code('.text');

END seek;

PROCEDURE read (
	fd :		UNIV integer;
	addr :		UNIV integer;
	size :		UNIV integer
) :			integer;

BEGIN
	read := -1;

code('	tst	(sp)+');	{ fix sp }

code('	mov	2(sp),0f+2');	{ number of bytes }
code('	mov	4(sp),0f');	{ address of buffer }
code('	mov	6(sp),r0');	{ file descriptor }
code('	sys	0; 9f');	{ indirect system call }
code('	bec	1f');		{ branch if no error }
code('	mov	$-1,r0');	{ return error value }
code('1:rts	pc');

code('.data');
code('9:sys	read; 0:0; 0');
code('.text');

END read;

PROCEDURE write (
	fd :		UNIV integer;
	addr :		UNIV integer;
	size :		UNIV integer
) :			integer;

BEGIN
	write := -1;

code('	tst	(sp)+');	{ fix sp }

code('	mov	2(sp),0f+2');	{ number of bytes }
code('	mov	4(sp),0f');	{ address of buffer }
code('	mov	6(sp),r0');	{ file descriptor }
code('	sys	0; 9f');	{ indirect system call }
code('	bec	1f');		{ branch if no error }
code('	mov	$-1,r0');	{ return error value }
code('1:rts	pc');

code('.data');
code('9:sys	write; 0:0; 0');
code('.text');

END write;

END unixcalls;
