359 lines
4.1 KiB
ArmAsm
359 lines
4.1 KiB
ArmAsm
rti = 2
|
|
.globl rm
|
|
.globl ck
|
|
.globl loop
|
|
.globl oct
|
|
.globl argc
|
|
.globl arg
|
|
.globl tfiget
|
|
.globl asmem
|
|
.globl qflag
|
|
.globl vflag
|
|
.globl getspq
|
|
.globl q
|
|
.globl ask
|
|
.globl getword
|
|
.globl r
|
|
.globl w
|
|
.globl output
|
|
.globl buffer
|
|
.globl bufend
|
|
.globl fv
|
|
.globl getsp
|
|
.globl release
|
|
.globl nothere
|
|
.globl getn
|
|
.globl getchar
|
|
.globl rewind
|
|
.globl iflag
|
|
.globl inter
|
|
/ output buffer
|
|
/ r2 = last char in buffer + 1
|
|
/ r2 returned at beginning of buffer
|
|
/
|
|
output:
|
|
sub $buffer,r2
|
|
blos 1f
|
|
mov r2,0f
|
|
mov $1,r0
|
|
sys write; buffer; 0:..
|
|
mov $buffer,r2
|
|
1:
|
|
rts pc
|
|
/
|
|
/
|
|
/ routine to find the string pointed to by r0
|
|
/ in either memory or curly
|
|
/ r1 = where to look
|
|
/
|
|
/ returns error set if string not there
|
|
/ returns r1 = header of string if there
|
|
getsp:
|
|
mov r0,-(sp)
|
|
mov asmem,r1
|
|
jsr pc,rewind /memory
|
|
3:
|
|
jsr pc,getword
|
|
bes 1f
|
|
mov r0,r1
|
|
jsr pc,rewind
|
|
mov (sp),r2
|
|
2:
|
|
jsr pc,getchar
|
|
bes 2f
|
|
tstb (r2)
|
|
beq 4f
|
|
cmpb r0,(r2)+
|
|
beq 2b
|
|
4:
|
|
mov asmem,r1
|
|
add $2,r(r1)
|
|
br 3b
|
|
2:
|
|
tstb (r2)
|
|
bne 4b
|
|
mov r1,r2
|
|
mov asmem,r1
|
|
jsr pc,getword
|
|
tst (sp)+
|
|
rts pc
|
|
1:
|
|
mov (sp)+,r0
|
|
sec
|
|
rts pc
|
|
/
|
|
/ finds header of string with name same as that pointed to by r0
|
|
/ taking into account ? and *
|
|
getspq:
|
|
mov r0,-(sp)
|
|
mov asmem,r1
|
|
tst qflag
|
|
bgt 1f
|
|
jsr pc,rewind
|
|
1:
|
|
jsr pc,getword
|
|
bes 1f
|
|
mov r0,r1
|
|
jsr pc,rewind
|
|
mov (sp),r2
|
|
2:
|
|
cmpb (r2),$'*
|
|
bne 3f
|
|
clr strflg
|
|
mov $2,qflag
|
|
inc r2
|
|
tstb (r2)
|
|
beq 6f
|
|
mov r2,ch
|
|
3:
|
|
jsr pc,getchar
|
|
bes 2f
|
|
tstb (r2)
|
|
bne 3f
|
|
cmp $2,qflag
|
|
bne 4f
|
|
mov ch,r2
|
|
3:
|
|
cmpb (r2),$'?
|
|
bne 3f
|
|
inc r2
|
|
tst qflag
|
|
bne 2b
|
|
mov $1,qflag
|
|
br 2b
|
|
3:
|
|
cmpb r0,(r2)+
|
|
bne 5f
|
|
inc strflg
|
|
br 2b
|
|
5:
|
|
cmp $2,qflag
|
|
bne 4f
|
|
tst strflg
|
|
bne 4f
|
|
dec r2
|
|
br 2b
|
|
4:
|
|
mov asmem,r1
|
|
add $2,r(r1)
|
|
br 1b
|
|
2:
|
|
tstb (r2)
|
|
bne 4b
|
|
6:
|
|
mov r1,r2
|
|
mov asmem,r1
|
|
jsr pc,getword
|
|
tst (sp)+
|
|
rts pc
|
|
1:
|
|
mov $-1.,qflag
|
|
mov (sp)+,r0
|
|
sec
|
|
rts pc
|
|
/
|
|
/ tfiget
|
|
/ jsr r5,tfiget
|
|
/
|
|
tfiget:
|
|
clr r0
|
|
sys read; ch; 1
|
|
bes 1f
|
|
tst iflag
|
|
beq 9f; jmp loop; 9:
|
|
tst r0
|
|
beq 1f
|
|
movb ch,r0
|
|
rts pc
|
|
1: jmp q
|
|
/
|
|
/ routine to print file name and error message
|
|
/ r2 = next free byte in buffer
|
|
/
|
|
nothere:
|
|
mov $buffer,r2
|
|
1:
|
|
tstb (r1)
|
|
beq 1f
|
|
movb (r1)+,(r2)+
|
|
br 1b
|
|
1:
|
|
sub $buffer,r2
|
|
mov r2,0f
|
|
mov $1,r0
|
|
sys write; buffer; 0:..
|
|
mov $1,r0
|
|
sys write; err4; 16.
|
|
rts pc
|
|
/
|
|
/
|
|
/ routine to put characters from string in buffer
|
|
/ r1 = header of string
|
|
/ on return r2 = next free byte in buffer
|
|
/
|
|
getn:
|
|
mov $buffer,r2
|
|
jsr pc,rewind
|
|
1:
|
|
jsr pc,getchar
|
|
bes 1f
|
|
movb r0,(r2)+
|
|
cmp r2,$bufend
|
|
bhis 1f
|
|
br 1b
|
|
1: rts pc
|
|
/
|
|
ask:
|
|
mov r2,-(sp)
|
|
mov r0,r1
|
|
jsr pc,getn
|
|
movb $' ,(r2)+
|
|
jsr pc,output
|
|
jsr pc,tfiget
|
|
cmpb $'\n,r0
|
|
bne 1f
|
|
2:
|
|
mov asmem,r1
|
|
add $2,r(r1)
|
|
mov (sp)+,r2
|
|
sec
|
|
rts pc
|
|
1:
|
|
cmpb r0,$'y
|
|
beq 4f
|
|
cmpb r0,$'q
|
|
beq 3f
|
|
1:
|
|
tst iflag
|
|
bne 2b
|
|
jsr pc,tfiget
|
|
cmpb $'\n,r0
|
|
bne 1b
|
|
br 2b
|
|
4:
|
|
tst iflag
|
|
bne 2b
|
|
jsr pc,tfiget
|
|
cmpb $'\n,r0
|
|
bne 1b
|
|
mov asmem,r1
|
|
mov (sp)+,r2
|
|
clc
|
|
rts pc
|
|
3:
|
|
tst iflag
|
|
bne 2b
|
|
jsr pc,tfiget
|
|
cmpb $'\n,r0
|
|
bne 1b
|
|
mov (sp)+,r2
|
|
jmp loop
|
|
inter:
|
|
inc iflag
|
|
rti
|
|
/ to remove an entry from asmem - r points to name ptr
|
|
/
|
|
rm:
|
|
mov r3,-(sp)
|
|
mov asmem,r1
|
|
mov r(r1),r3
|
|
sub $4,r(r1)
|
|
mov r(r1),r2
|
|
mov r2,-(sp)
|
|
1:
|
|
mov r3,r(r1)
|
|
jsr pc,getword
|
|
bes 1f
|
|
mov r(r1),r3
|
|
mov r2,r(r1)
|
|
jsr pc,alterword
|
|
mov r(r1),r2
|
|
br 1b
|
|
1:
|
|
mov r2,w(r1)
|
|
mov (sp)+,r(r1)
|
|
mov (sp)+,r3
|
|
rts pc
|
|
/
|
|
/ check that header pointed to by r2 released
|
|
/
|
|
ck:
|
|
mov r2,-(sp)
|
|
mov l(r2),r0
|
|
sub a(r2),r0
|
|
sub $hblk,r2
|
|
jsr pc,log2
|
|
asl r0
|
|
mov r0,ch
|
|
mov frlist(r0),r0
|
|
1:
|
|
beq 1f
|
|
cmp r2,r0
|
|
beq 2f
|
|
add $hblk,r0
|
|
mov (r0),r0
|
|
br 1b
|
|
2:
|
|
mov ch,r0
|
|
inc freeb(r0)
|
|
mov (sp)+,r2
|
|
rts pc
|
|
1:
|
|
mov (sp)+,r2
|
|
sec
|
|
rts pc
|
|
oct:
|
|
mov r1,-(sp)
|
|
mov r0,r1
|
|
clr r0
|
|
div $8.,r0
|
|
mov r1,-(sp)
|
|
add $'0,(sp)
|
|
tst r0
|
|
beq 1f
|
|
jsr r5,oct
|
|
1:
|
|
movb (sp)+,ch
|
|
mov $1,r0
|
|
sys write; ch; 1
|
|
mov (sp)+,r1
|
|
rts r5
|
|
|
|
decml:
|
|
mov r1,-(sp)
|
|
mov r0,r1
|
|
clr r0
|
|
div $10.,r0
|
|
mov r1,-(sp)
|
|
add $'0,(sp)
|
|
tst r0
|
|
beq 1f
|
|
jsr r5,decml
|
|
1:
|
|
movb (sp)+,ch
|
|
mov $1,r0
|
|
sys write; ch; 1
|
|
mov (sp)+,r1
|
|
rts r5
|
|
/
|
|
/
|
|
iflag: 0
|
|
qflag: 0
|
|
vflag: 0
|
|
.data
|
|
err4: < not in memory.\n>
|
|
err1: <Cannot open file >
|
|
end1: .even
|
|
.bss
|
|
freeh: .=.+2
|
|
freeb: .=.+32.
|
|
freen:
|
|
ch: .=.+2
|
|
strflg: .=.+2
|
|
buffer: .=.+512.
|
|
bufend: .=.+2
|
|
argc = buffer + 20.
|
|
arg = buffer + 256.
|
|
fv: .=.+2
|
|
.text
|