.globl	getchar
.globl	stats
.globl	lookchar
.globl	fsfile
.globl	seekchar
.globl	backspace
.globl	putchar
.globl	alterchar
.globl	move
.globl	rewind
.globl	create
.globl	zero
.globl	allocate
.globl	release
.globl	collect
.globl	getword, putword
.globl	length, position
.globl	w, r, a, l
.globl	error
/
testing = 0
/
/
/	routine to return the length of a string
/
/	mov	...,r1
/	jsr	pc,length
/	mov	r0,...
/
length:
	mov	w(r1),r0
	sub	a(r1),r0
	rts	pc
/
/
/	routine to return the read pointer position
/
/	mov	...,r1
/	jsr	pc,position
/	mov	r0,...
/
position:
	mov	r(r1),r0
	sub	a(r1),r0
	rts	pc
/
/
/
/
/	routine to get a word from the string
/	mov	...,r1
/	jsr	pc,getword
/	mov	r0,...
/
getword:
	jsr	pc,getchar
	bes	noch
	movb	r0,nchar
	jsr	pc,getchar
	bec	2f
	dec	r(r1)
	br	noch
2:	movb	r0,nchar+1
	mov	nchar,r0
	tst	r0		/tst clears c-bit
	rts	pc
/
/
/	routine to put a word onto the string
/	mov	...,r1
/	mov	...,r0
/	jsr	pc,putword
/
putword:
	jsr	pc,putchar
	swab	r0
	jsr	pc,putchar
	swab	r0
	rts	pc
/
.bss
nchar:	.=.+2
.text
/
/
/
/	routine to read next character from string
/	pointed to by r1;  character returned in r0
/	c-bit set if character not available (end of file)
/	r1 is preserved
/
/	mov	...,r1
/	jsr	pc,getchar
/	movb	r0,...
/
getchar:
	jsr	pc,lookchar
	bec	2f
	rts	pc
2:	inc	r(r1)
	tst	r0		/tst clears c-bit
	rts	pc
/
noch:	clr	r0
	sec
	rts	pc
/
/	routine to look at next character from string
/	pointed to by r1;  character returned in r0
/	c-bit set if character not available (end of file)
/	r1 is preserved
/
/	mov	...,r1
/	jsr	pc,lookchar
/	movb	r0,...
/
lookchar:
	.if	testing
	jsr	pc,plausible
	inc	stats+6.
	.endif
	cmp	w(r1),r(r1)
	blos	noch
	movb	*r(r1),r0
	clc
	rts	pc
/
plausible:
	cmp	r1,$headers
	bhis 9f; 4; 9:
	cmp	r1,$headend
	blo 9f; 4; 9:
	rts	pc
/
/
/
/	routine to move the read pointer of a string to a
/	specified point.  If the string is not long enough,
/	the string is extended
/
/	mov	position,r0
/	mov	...,r1
/	jsr	pc,seekchar
/
seekchar:
	mov	r1,-(sp)
	mov	r0,-(sp)
	.if	testing
	jsr	pc,plausible
	inc	stats+10.
	.endif
1:
	mov	(sp),r0
	add	a(r1),r0
	cmp	r0,l(r1)
	bhi	3f
	mov	r0,r(r1)
	cmp	r0,w(r1)
	blo	1f
	mov	r0,w(r1)
	br	1f
3:
	mov	(sp),r0
	jsr	pc,allocate
	mov	2(sp),r0
	jsr	pc,move
	jsr	pc,swap
	jsr	pc,release
	mov	2(sp),r1
	br	1b
1:
	mov	(sp)+,r0
	mov	(sp)+,r1
	rts	pc
/
/
/	routine to move read pointer of string to end of string
/
/	mov	...,r1
/	jsr	pc,fsfile
/
fsfile:
	.if	testing
	jsr	pc,plausible
	inc	stats+10.
	.endif
	mov	w(r1),r(r1)
	rts	pc
/
/
/	routine to read a string backwards
/	the read pointer is decremented before reading
/
/	mov	...,r1
/	jsr	pc,backspace
/	mov	r0,...
/
backspace:
	.if	testing
	jsr	pc,plausible
	inc	stats+6.
	.endif
	cmp	a(r1),r(r1)
	bhis	noch
	dec	r(r1)
	movb	*r(r1),r0
	clc
	rts	pc
/
/
/
/
/	routine to put a character into the string
/	pointed to by r1;  character in r0
/	r0 and r1 are preserved.
/
/	movb	ch,r0
/	mov	...,r1
/	jsr	pc,putchar
/
putchar:
	mov	r1,-(sp)
	mov	r0,-(sp)
	.if	testing
	jsr	pc,plausible
	inc	stats+8.
	.endif
1:	cmp	w(r1),l(r1)
	blt	3f
	mov	w(r1),r0
	inc	r0
	sub	a(r1),r0	/W-A+1
	jsr	pc,allocate
	mov	2(sp),r0	/r1
	jsr	pc,move
	jsr	pc,swap
	jsr	pc,release
	mov	2(sp),r1	/r1
	cmp	w(r1),l(r1)
	blt	3f
	4
/
3:	movb	(sp),*w(r1)
	inc	w(r1)
	mov	(sp)+,r0
	tst	(sp)+
	rts	pc
/
/
swap:
	mov	w(r1),-(sp)
	mov	w(r0),w(r1)
	mov	(sp),w(r0)
	mov	r(r1),(sp)
	mov	r(r0),r(r1)
	mov	(sp),r(r0)
	mov	a(r1),(sp)
	mov	a(r0),a(r1)
	mov	(sp),a(r0)
	mov	l(r1),(sp)
	mov	l(r0),l(r1)
	mov	(sp)+,l(r0)
	rts	pc
/
/
/	routine to alter a character in the string
/	pointed to by r1;  character in r0
/	r0 and r1 are preserved.
/
/	movb	ch,r0
/	mov	...,r1
/	jsr	pc,alterchar
/
alterchar:
	mov	r1,-(sp)
	mov	r0,-(sp)
	.if	testing
	jsr	pc,preposterous
	inc	stats+8.
	.endif
1:	cmp	r(r1),l(r1)
	blt	3f
	mov	l(r1),r0
	inc	r0
	sub	a(r1),r0	/W-A+1
	jsr	pc,allocate
	mov	2(sp),r0	/r1
	jsr	pc,move
	jsr	pc,swap
	jsr	pc,release
	mov	2(sp),r1	/r1
	cmp	r(r1),l(r1)
	blt	3f
	4
/
3:	movb	(sp),*r(r1)
	inc	r(r1)
	cmp	r(r1),w(r1)
	ble	1f
	mov	r(r1),w(r1)
1:
	mov	(sp)+,r0
	tst	(sp)+
	rts	pc
/
/
/	routine to move the contents of one string
/	to another.
/
/	mov	source,r0
/	mov	dest,r1
/	jsr	pc,move
/
/	on return, r1 points to the new string and should
/	be saved.  r0 is preserved.
/
move:
	mov	r3,-(sp)
	mov	r2,-(sp)
	mov	r1,-(sp)
	mov	r0,-(sp)
	mov	w(r0),r2
	sub	a(r0),r2	/W-A
	mov	l(r1),r3
	sub	a(r1),r3	/L-A
	cmp	r2,r3
	ble	1f
	mov	r2,r0
	jsr	pc,allocate
	mov	2(sp),r0	/r1
	jsr	pc,swap
	jsr	pc,release
	mov	r0,r1
	mov	0(sp),r0	/r0
/
1:	mov	a(r0),(r0)
	mov	a(r1),(r1)
1:	dec	r2
	blt	1f
	movb	*(r0),*(r1)
	inc	(r0)
	inc	(r1)
	br	1b
/
/	fix up read ptr of new string
/
1:	mov	r(r0),r2
	sub	a(r0),r2
	add	a(r1),r2
	mov	r2,r(r1)
/
/	restore and return
/
	mov	(sp)+,r0
	mov	(sp)+,r1
	mov	(sp)+,r2
	mov	(sp)+,r3
	rts	pc
/
/
/	routine to rewind read pointer of string
/	pointed to by r1
/
/	mov	...,r1
/	jsr	pc,rewind
/
rewind:
	.if	testing
	jsr	pc,plausible
	inc	stats+10.
	.endif
	mov	a(r1),r(r1)
	rts	pc
/
/	routine to rewind write pointer of string
/	pointed to by r1
/
/	mov	...,r1
/	jsr	pc,create
/
create:
	.if	testing
	jsr	pc,plausible
	inc	stats+10.
	.endif
	mov	a(r1),w(r1)
	mov	a(r1),r(r1)
	rts	pc
/
/
/	routine to zero a string
/
/	mov	...,r1
/	jsr	pc,zero
/
zero:
	mov	r0,-(sp)
	.if	testing
	jsr	pc,preposterous
	.endif
	mov	a(r1),r0
1:	cmp	r0,l(r1)
	bhis	1f
	clrb	(r0)+
	br	1b
1:	mov	(sp)+,r0
	rts	pc
/
/
