!	File:	cgsfileIO2.s
!	Author:	John van Groningen
!	At:	University of Nijmegen
!	Machine:	Sun 4

#define SP_G5

#define d0 %l0
#define d1 %l1
#define d2 %l2
#define d3 %l3
#define d4 %l4
#define d5 %l5
#define d6 %l6
#define d7 %l7
#define a0 %i0
#define a1 %i1
#define a2 %i2
#define a3 %i3
#define a4 %i4
#define a5 %i5
#define a6 %g6
#ifdef SP_G5
# define sp %g5
#else
# define sp %g7
#endif

	.data

	.align	8

tmp_real:	.double	0

	.text

	.global	stderrF
	.global	stdioF
	.global	openF
	.global	closeF
	.global	reopenF
	.global	readFC
	.global	readFI
	.global	readFR
	.global	readFS
	.global	readLineF
	.global	writeFC
	.global	writeFI
	.global	writeFR
	.global	writeFS
	.global	endF
	.global	errorF
	.global	positionF
	.global	seekF
	.global	shareF
	
	.global	openSF
	.global	readSFC
	.global	readSFI
	.global	readSFR
	.global	readSFS
	.global	readLineSF
	.global	endSF
	.global	positionSF
	.global	seekSF

! imports

	.global	@IO_error
	.global	@open_stdio
	.global	@open_stderr
	.global	@open_file
	.global	@re_open_file
	.global	@close_file
	.global	@file_read_char
	.global	@file_read_int
	.global	@file_read_real
	.global	@file_read_string
	.global	@file_read_line
	.global	@file_write_char
	.global	@file_write_int
	.global	@file_write_real
	.global	@file_write_string
	.global	@file_end
	.global	@file_error
	.global	@file_position
	.global	@file_seek
	.global	@file_share

	.global	@open_s_file
	.global	@file_read_s_char
	.global	@file_read_s_int
	.global	@file_read_s_real
	.global	@file_read_s_string
	.global	@file_read_s_line
	.global	@file_s_end
	.global	@file_s_position
	.global	@file_s_seek

	.global	collect_0
	.global	collect_1
	.global	out_of_memory_4

	.global	__STRING__

stdioF:	call	@open_stdio
	nop
	
	mov	%o0,%l1
	mov	-1,%l0

	ld	[sp],%o7
	retl
	inc	4,sp

stderrF:	call	@open_stderr
	nop
	
	mov	%o0,%l1
	mov	-1,%l0

	ld	[sp],%o7
	retl
	inc	4,sp

openF:	mov	%l0,%o1
	call	@open_file
	add	%i0,4,%o0

	orcc	%o0,%g0,%l1
	mov	-1,%l0
	ld	[sp],%o7
	clr	%l2
	bpos,a	openF_1
	mov	-1,%l2
openF_1:
	retl
	inc	4,sp

closeF:	call	@close_file
	mov	%l1,%o0

	ld	[sp],%o7
	retl
	inc	4,sp

reopenF:
	mov	%l2,%o0
	call	@re_open_file
	mov	%l0,%o1
	
	mov	%l2,%l1
	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

readFC:
	call	@file_read_char
	mov	%l1,%o0

	mov	%o0,%l2
	addcc	%o0,1,%g0
	be	readFC_eof
	set	-1,%l0
	
	ld	[sp],%o7
	set	-1,%l3
	retl
	inc	4,sp

readFC_eof:
	ld	[sp],%o7
	clr	%l2
	clr	%l3
	retl
	inc	4,sp

readFI:
	sub	sp,4,%o1
	call	@file_read_int
	mov	%l1,%o0
	
	ld	[sp-4],%l2
	set	-1,%l0
	ld	[sp],%o7
	mov	%o0,%l3
	retl
	inc	4,sp

readFR:
	set	tmp_real,%o1
	call	@file_read_real
	mov	%l1,%o0

	sethi	%hi tmp_real,%g1
	ldd	[%g1+%lo tmp_real],%f0
	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

readFS:
	add	%l0,8+3,%l5
	srl	%l5,2,%l5
	subcc	%l7,%l5,%l7
	bneg	readFS_gc
	nop

readFS_r_gc:
	add	d7,%l5,d7
	mov	%l2,%l4
	mov	%g6,%l3
	
	set	__STRING__+2,%o0
	st	%o0,[%g6]
	inc	4,%g6
	
	mov	%g6,%o2
	mov	%l0,%o1
	call	@file_read_string
	mov	%l2,%o0

readFS_end:
	inc	3,d0
	and	d0,-4,d0
	inc	4,%g6
	add	a6,d0,a6
	srl	d0,2,d0
	inc	2,d0
	sub	d7,d0,d7
	
	mov	%l3,%i0
	mov	%l4,%l1
	ld	[sp],%o7
	set	-1,d0
	retl
	inc	4,sp

readFS_gc:	dec	4,sp
	call	collect_0
	st	%o7,[sp]

	b,a	readFS_r_gc

readLineF:
	mov	32+2,%l5
	subcc	%l7,%l5,%g0
	bneg	readLineF_gc
	nop

readLineF_r_gc:
	mov	%l1,%l4
	mov	a6,%l3

	set	__STRING__+2,%o0
	st	%o0,[a6]
	inc	4,a6
	
	add	a6,4,%o2
	sub	%l7,2,%o1
	sll	%o1,2,%o1
	call	@file_read_line
	mov	%l4,%o0

	orcc	%o0,%g0,%l0
	bpos	readFS_end
	st	%l0,[a6]

	tst	%l5
	be	out_of_memory_4
	nop

	sub	%l7,2,%l0
	sll	%l0,2,%l0
	st	%l0,[a6]
	inc	4,a6
	add	a6,%l0,a6

	add	%l7,32+2,%l5
	neg	%l5,%l7
	mov	%l3,%i0

	dec	4,sp
	call	collect_1
	st	%o7,[sp]

	add	%l7,%l5,%l7
	mov	%i0,%i1

	ld	[%i1+4],%l0
	inc	8,%i1
	add	%l0,3,%l1
	srl	%l1,2,%l1
	dec	2,%l7
	sub	%l7,%l1,%l7

	set	__STRING__+2,%o0
	st	%o0,[a6]
	mov	a6,%l3
	st	%l0,[a6+4]
	b	st_copy_string1
	inc	8,a6
copy_st_lp1:
	inc	4,%i1
	st	%g1,[a6]
	inc	4,a6
st_copy_string1:
	deccc	1,%l1
	bcc,a	copy_st_lp1
	ld	[%i1],%g1

	mov	a6,%o2
	sll	%l7,2,%o1
	call	@file_read_line
	mov	%l4,%o0

	orcc	%o0,%g0,%l0
	bneg	out_of_memory_4
	mov	%l3,%i0

	ld	[%i0+4],%g1

	add	%l0,3,%l1

	add	%g1,%l0,%g1
	st	%g1,[%i0+4]

	srl	%l1,2,%l1
	sub	%l7,%l1,%l7
	sll	%l1,2,%l1
	add	a6,%l1,a6
	
	mov	%l4,%l1
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

readLineF_gc:
	sub	%l7,%l5,%l7
	dec	4,sp
	call	collect_0
	st	%o7,[sp]
	
	add	%l7,%l5,%l7
	b	readLineF_r_gc
	clr	%l5

writeFC:
	mov	%l1,%o1
	call	@file_write_char
	mov	%l2,%o0

	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

writeFI:
	mov	%l1,%o1
	call	@file_write_int
	mov	%l2,%o0

	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

writeFR:
	sethi	%hi tmp_real,%g1
	std	%f0,[%g1+%lo tmp_real]
	mov	%l1,%o2
 	call	@file_write_real
	ldd	[%g1+%lo tmp_real],%o0

	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

writeFS:
	mov	%l1,%o1
	call	@file_write_string
	add	%i0,4,%o0

	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

endF:
	call	@file_end
	mov	%l1,%o0

	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

errorF:
	call	@file_error
	mov	%l1,%o0

	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

positionF:
	call	@file_position
	mov	%l1,%o0

	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

seekF:
	mov	%l0,%o2
	mov	%l1,%o1
	mov	%l3,%o0
	call	@file_seek
	mov	%l3,%l1

	mov	%o0,%l2
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp

shareF:
	call	@file_share
	mov	%l1,%o0
	
	ld	[sp],%o7
	set	-1,%l0
	retl
	inc	4,sp
	
openSF:	mov	%l0,%o1
	call	@open_s_file
	add	%i0,4,%o0

	orcc	%o0,%g0,%l1
	mov	0,%l0
	ld	[sp],%o7
	clr	%l2
	bpos,a	openSF_1
	mov	-1,%l2
openSF_1:
	retl
	inc	4,sp

readSFC:
	sub	sp,4,%o1
	st	%l0,[sp-4]
	call	@file_read_s_char
	mov	%l1,%o0

	mov	%o0,%l2
	addcc	%o0,1,%g0
	be	readSFC_eof
	ld	[sp-4],%l0

	ld	[sp],%o7
	mov	-1,%l3
	retl
	inc	4,sp

readSFC_eof:
	clr	%l2
	ld	[sp],%o7
	clr	%l3
	retl
	inc	4,sp

readSFI:
	sub	sp,4,%o2
	st	%l0,[sp-4]
	sub	sp,8,%o1
	call	@file_read_s_int
	mov	%l1,%o0

	ld	[sp-8],%l2
	ld	[sp-4],%l0
	ld	[sp],%o7
	mov	%o0,%l3
	retl
	inc	4,sp

readSFR:
	sub	sp,4,%o2
	st	%l0,[sp-4]
	set	tmp_real,%o1	
	call	@file_read_s_real
	mov	%l1,%o0

	sethi	%hi tmp_real,%g1
	ldd	[%g1+%lo tmp_real],%f0
	ld	[sp-4],%l0
	ld	[sp],%o7
	mov	%o0,%l2
	retl
	inc	4,sp

readSFS:
	add	%l0,8+3,%l5
	srl	%l5,2,%l5
	subcc	%l7,%l5,%l7
	bneg	readSFS_gc
	nop

readSFS_r_gc:
	add	%l7,%l5,%l7
	mov	%l2,%l4
	mov	%g6,%l3

	set	__STRING__+2,%o0
	st	%o0,[%g6]
	inc	4,%g6

	sub	sp,4,%o3
	st	%l1,[sp-4]
	mov	%g6,%o2
	mov	%l0,%o1
	call	@file_read_s_string
	mov	%l2,%o0

readSFS_end:
	inc	3,%l0
	and	%l0,-4,%l0
	inc	4,%g6
	add	%g6,%l0,%g6
	srl	%l0,2,%l0
	inc	4,%l0
	sub	%l7,%l0,%l7

	mov	%l3,%i0
	mov	%l4,%l1
	ld	[sp],%o7
	ld	[sp-4],%l0
	retl
	inc	4,sp

readSFS_gc:	dec	4,sp
	call	collect_0
	st	%o7,[sp]
	
	b,a	readSFS_r_gc

readLineSF:
	mov	32+2,%l5
	subcc	%l7,%l5,%g0
	bneg	readLineSF_gc
	nop

readLineSF_r_gc:
	st	%l0,[sp-4]
	mov	%l1,%l4
	mov	%g6,%l3
	
	set	__STRING__+2,%o0
	st	%o0,[%g6]
	inc	4,%g6

	sub	sp,4,%o3
	add	%g6,4,%o2
	sub	%l7,2,%o1
	sll	%o1,2,%o1
	call	@file_read_s_line
	mov	%l4,%o0

	orcc	%o0,%g0,%l0
	bpos	readSFS_end
	st	%l0,[%g6]

	tst	%l5
	be	out_of_memory_4
	nop

	sub	%l7,2,%l0
	sll	%l0,2,%l0
	st	%l0,[%g6]
	inc	4,%g6
	add	%g6,%l0,%g6

	add	%l7,32+2,%l5
	neg	%l5,%l7
	mov	%l3,%i0

	dec	4,sp
	call	collect_1
	st	%o7,[sp]

	add	%l7,%l5,%l7

	mov	%i0,%i1
	ld	[%i1+4],%l0
	inc	8,%i1
	add	%l0,3,%l1
	srl	%l1,2,%l1
	dec	2,%l7
	sub	%l7,%l1,%l7

	set	__STRING__+2,%o0
	st	%o0,[%g6]
	mov	%g6,%l3
	st	%l0,[%g6+4]
	b	st_copy_string2
	inc	8,%g6

copy_st_lp2:
	inc	4,%i1
	st	%g1,[%g6]
	inc	4,%g6
st_copy_string2:
	deccc	1,%l1
	bcc,a	copy_st_lp2
	ld	[%i1],%g1

	sub	sp,4,%o3
	mov	%g6,%o2
	sll	%l7,2,%o1
	call	@file_read_s_line
	mov	%l4,%o0

	orcc	%o0,%g0,%l0
	bneg	out_of_memory_4
	mov	%l3,%i0

	ld	[%i0+4],%g1
	add	%l0,3,%l1

	add	%g1,%l0,%g1
	st	%g1,[%i0+4]

	srl	%l1,2,%l1
	sub	%l7,%l1,%l7
	sll	%l1,2,%l1
	add	%g6,%l1,%g6
	
	ld	[sp-4],%l0
	ld	[sp],%o7
	mov	%l4,%l1
	retl
	inc	4,sp

readLineSF_gc:
	sub	%l7,%l5,%l7
	dec	4,sp
	call	collect_0
	st	%o7,[sp]

	add	%l7,%l5,%l7
	b	readLineSF_r_gc
	clr	%l5

endSF:
	mov	%l0,%o1
	call	@file_s_end
	mov	%l1,%o0
	
	ld	[sp],%o7
	mov	%o0,%l0
	retl
	inc	4,sp

positionSF:
	mov	%l0,%o1
	call	@file_s_position
	mov	%l1,%o0
	
	ld	[sp],%o7
	mov	%o0,%l0
	retl
	inc	4,sp

seekSF:
	sub	sp,4,%o3
	st	%l2,[sp-4]
	mov	%l0,%o2
	mov	%l1,%o1
	mov	%l3,%o0
	call	@file_s_seek
	mov	%l3,%l1
	
	ld	[sp-4],%l0
	ld	[sp],%o7
	mov	%o0,%l2
	retl
	inc	4,sp