94 lines
1.3 KiB
ArmAsm
94 lines
1.3 KiB
ArmAsm
i=r3
|
|
.globl lptr,rptr,sptr
|
|
.globl succ,fail
|
|
.globl iget
|
|
.globl find,enter
|
|
.globl seekchar,getword,getchar
|
|
.globl putword,putchar,alterword
|
|
.globl getcstr,rewcstr
|
|
.globl length,rewind
|
|
|
|
index=0
|
|
tablep=2
|
|
temp=4
|
|
which=6
|
|
framel=10
|
|
|
|
find:
|
|
mov pc,-(sp) /which(sp)
|
|
br 1f
|
|
enter:
|
|
clr -(sp)
|
|
1:
|
|
jsr pc,rewcstr
|
|
jsr pc,getcstr
|
|
bne 1f
|
|
tst (sp)+
|
|
jmp fail
|
|
1:
|
|
clr -(sp) /temp(sp)
|
|
jsr pc,iget
|
|
mov (r0),-(sp) /tablep(sp)
|
|
clr -(sp) /index(sp)
|
|
|
|
right:
|
|
add $rptr,index(sp)
|
|
br 1f
|
|
left:
|
|
add $lptr,index(sp)
|
|
1: /get index of next entry
|
|
mov tablep(sp),r1
|
|
mov index(sp),r0
|
|
jsr pc,seekchar
|
|
jsr pc,getword
|
|
tst r0
|
|
beq nomore
|
|
mov r0,index(sp)
|
|
add $sptr,r0
|
|
jsr pc,seekchar
|
|
jsr pc,rewcstr
|
|
1: /comparison loop
|
|
mov tablep(sp),r1
|
|
jsr pc,getchar
|
|
mov r0,-(sp)
|
|
jsr pc,getcstr
|
|
cmp r0,(sp)+
|
|
bgt right
|
|
blt left
|
|
tst r0
|
|
beq found
|
|
br 1b
|
|
|
|
nomore: /not in table
|
|
tst which(sp)
|
|
beq 1f
|
|
tst (i)+ /exit from find
|
|
add $framel,sp
|
|
jmp fail
|
|
1:
|
|
mov tablep(sp),r1
|
|
jsr pc,length
|
|
mov r0,temp(sp)
|
|
clr r0
|
|
jsr pc,putword /scratch word
|
|
jsr pc,putword /left pointer
|
|
jsr pc,putword /right
|
|
mov index(sp),r0
|
|
jsr pc,seekchar
|
|
mov temp(sp),r0
|
|
mov r0,index(sp)
|
|
jsr pc,alterword
|
|
jsr pc,rewcstr
|
|
1: /copy loop
|
|
jsr pc,getcstr
|
|
mov tablep(sp),r1
|
|
jsr pc,putchar
|
|
tst r0
|
|
bne 1b
|
|
|
|
found:
|
|
jsr pc,iget
|
|
mov index(sp),(r0)
|
|
add $framel,sp
|
|
jmp succ
|