409 lines
5.3 KiB
ArmAsm
409 lines
5.3 KiB
ArmAsm
.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
|
|
/
|
|
/
|