93 lines
1.2 KiB
ArmAsm
93 lines
1.2 KiB
ArmAsm
/ getw/getc -- get words/characters from input file
|
|
/ fopen -- open a file for use by get(c|w)
|
|
/
|
|
/ calling sequences --
|
|
/
|
|
/ mov $filename,r0
|
|
/ jsr r5,fopen; ioptr
|
|
/
|
|
/ on return ioptr buffer is set up or error bit is set if
|
|
/ file could not be opened.
|
|
/
|
|
/ jsr r5,get(c|w)1; ioptr
|
|
/
|
|
/ on return char/word is in r0; error bit is
|
|
/ set on error or end of file.
|
|
/
|
|
/ ioptr is the address of a 518-byte buffer
|
|
/ whose layout is as follows:
|
|
/
|
|
/ ioptr: .=.+2 / file descriptor
|
|
/ .=.+2 / charact+2 / pointer to next character (reset if no. chars=0)
|
|
/ .=.+512. / the buffer
|
|
|
|
.globl getc,getw,fopen
|
|
|
|
fopen:
|
|
mov r1,-(sp)
|
|
mov (r5)+,r1
|
|
mov r0,0f
|
|
sys 0; 9f
|
|
.data
|
|
9:
|
|
sys open; 0:..; 0
|
|
.text
|
|
bes 1f
|
|
mov r0,(r1)+
|
|
clr (r1)+
|
|
mov (sp)+,r1
|
|
rts r5
|
|
1:
|
|
mov $-1,(r1)
|
|
mov (sp)+,r1
|
|
sec
|
|
rts r5
|
|
|
|
.data
|
|
getw:
|
|
mov (r5),9f
|
|
mov (r5)+,8f
|
|
jsr r5,getc; 8:..
|
|
bec 1f
|
|
rts r5
|
|
1:
|
|
mov r0,-(sp)
|
|
jsr r5,getc; 9:..
|
|
swab r0
|
|
bis (sp)+,r0
|
|
rts r5
|
|
.text
|
|
|
|
getc:
|
|
mov r1,-(sp)
|
|
mov (r5)+,r1
|
|
dec 2(r1)
|
|
bge 1f
|
|
mov r1,r0
|
|
add $6,r0
|
|
mov r0,0f
|
|
mov r0,4(r1)
|
|
mov (r1),r0
|
|
sys 0; 9f
|
|
.data
|
|
9:
|
|
sys read; 0:..; 512.
|
|
.text
|
|
bes 2f
|
|
tst r0
|
|
bne 3f
|
|
2:
|
|
mov (sp)+,r1
|
|
sec
|
|
rts r5
|
|
3:
|
|
dec r0
|
|
mov r0,2(r1)
|
|
1:
|
|
clr r0
|
|
bisb *4(r1),r0
|
|
inc 4(r1)
|
|
mov (sp)+,r1
|
|
rts r5
|
|
|