+.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
+/
+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
+ jmp err
+/
+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
+ jmp err
+/
+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
+/
+/