MiniUnix/usr/source/tmg/tmgb/cstr.s
.globl jget,iget
.globl succ
.globl create,rewind,putchar,getchar,allocate
.globl smark
.globl rewcstr,putcstr,getcstr,size
/ currnet string manipulations
/ keep a initial fragment handy for quick access
/go to allocator for the rest
smark:
jsr pc,jget
clr cstrw
jmp succ
rewcstr:
clr cstrr
rts pc
putcstr:
mov cstrw,r1
inc cstrw
cmp r1,$cstrt /is it quick access?
bge 1f
movb r0,cstrb(r1) /yes, stash the char
rts pc
1:
bne 1f
mov r0,-(sp) /first char to allocator
mov symp,r1
bne 2f
mov $64,r0
jsr pc,allocate
mov r1,symp
2:
jsr pc,create
mov (sp)+,r0
1:
mov symp,r1
jsr pc,putchar
rts pc
getcstr:
mov cstrr,r1
cmp r1,cstrw
blt 1f
clr r0 /end of string
rts pc
1:
inc cstrr
cmp r1,$cstrt
bge 1f
movb cstrb(r1),r0
rts pc
1:
bne 1f
mov symp,r1
jsr pc,rewind
1:
mov symp,r1
jsr pc,getchar
rts pc
size:
jsr pc,iget
mov cstrw,(r0)
jmp succ
cstrt = 16 /top of quick access current string
.data
symp: 0 /pointer to dynamicallly allocated current string
cstrw: 0 /current string write pointer
.bss
cstrr: .=.+2 /read pointer
cstrb: .=.+cstrt /base of quick access fragment