V2/c/rt/libc.sa
mÿbsw.s ¡šS
X / crt -- c runtime routines
.globl retrn
.globl bswitch
.globl _getchar
.globl _putchar
.globl _flush
.globl _fin
.globl _fout
.globl _main
.globl getc
.globl putc
.globl flush
start:
mov $mq,r4
mov sp,r0
mov (r0),-(sp)
tst (r0)+
mov r0,2(sp)
jsr pc,*_main
clr r0
sys exit
retrn:
mov r5,sp
mov (sp)+,r5
rts pc
_getchar:.+2
1:
jsr r5,getc; _fin
bcs 1f
tst r0
beq 1b
rts pc
1:
clr r0
rts pc
_putchar:.+2
mov 2(sp),r0
tst _fout
bne 1f
mov $1,_fout
1:
jsr r5,putc; _fout
movb 3(sp),r0
beq 1f
jsr r5,putc; _fout
1:
cmp _fout,$1
bne 1f
jsr r5,flush; _fout
1:
mov 2(sp),r0
rts pc
_flush:
.+2
jsr r5,flush; _fout
rts pc
bswitch:
mov *(sp),r1
mov r1,base
mov (r1),r2 / low
mov (r1)+,r3 / hi
mov $1,-(sp) / n
tst (r1)+
bne 1f
4 / n = 0
1:
tst 2(r1)
beq 1f
cmp (r1),r2
bhis 2f
mov (r1),r2
2:
cmp (r1)+,r3
blo 2f
mov -2(r1),r3
2:
tst (r1)+
inc (sp)
br 1b
1:
sub r2,r3 / spread
asl (sp)
inc r3
cmp r3,(sp)
blo initd / if spread < 2*ncase direct
initb:
clr (sp) / flag
mov base,r2
mov r2,r3
add $4,r3
1:
cmp r3,r1
bhis 1f
cmp (r2)+,(r3)+
blos 2f
mov -(r2),-(sp)
mov -(r3),(r2)+
mov (sp)+,(r3)+
mov (r2),-(sp)
mov (r3),(r2)
mov (sp)+,(r3)
inc (sp)
2:
cmp (r2)+,(r3)+
br 1b
1:
tst (sp)
bne initb
cmp (sp)+,(r1)+
mov r1,-(sp)
1:
mov -(r1),2(r1)
cmp r1,base
bhi 1b
mov (sp)+,(r1)
mov $binary+4,r3
br init
initd:
mov (sp)+,r3
mov r3,twon
mov r3,twona
mov r2,-(sp) / low
mov r3,-(sp) / 2*n
1:
mov base,r3
2:
cmp (r3)+,r2
beq 2f
tst (r3)+
cmp r3,r1
blo 2b
mov (r1),-(sp) / no match, default
br 3f
2:
mov (r3),-(sp) / match
3:
inc r2
dec twon
bne 1b
add $4,r1
add $2,twona
1:
mov (sp)+,-(r1)
dec twona
bne 1b
mov $direct+4,r3
init:
mov (sp)+,r2
mov -(r3),-(r2)
mov -(r3),-(r2)
jmp (r2)
direct:
jsr pc,*$1f
/ lowval; nval
/ l1; l2; ...; ln
/ ld
1:
mov *(sp)+,r1
sub (r1)+,r0 / low limit
cmp r0,(r1)+ / n cases
blo 1f
mov -(r1),r0 / default
1:
asl r0
add r0,r1
jmp *(r1)+
binary:
jsr pc,*$1f
/ end
/ v1;l1; v2;l2; ...; vn;ln
/end: ld
1:
mov *(sp)+,r1 / low
mov (r1)+,r2 / high
mov (r2),-(sp) / default
br 1f
llo:
mov r3,r2
br 1f
lhi:
mov r3,r1
add $4,r1
1:
mov r2,r3
sub r1,r3
beq 1f
asr r3
bic $3,r3
add r1,r3
cmp r0,(r3)
bhi lhi
blo llo
tst (sp)+
jmp *2(r3)
1:
rts pc
.bss
base: .=.+2
twon: .=.+2
twona: .=.+2
_fin: .=.+518.
_fout: .=.+518.
chdir.s D¡än
“ / C library -- chdir
/ error = chdir(string);
.globl _chdir
.data
_chdir:
1f
.text
1:
mov 2(sp),0f
clr r0
sys chdir; 0:..
adc r0
rts pc
chmod.s D¡l
/ C library -- chmod
/ error = chmod(string, mode);
.globl _chmod
.data
_chmod:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
clr r0
sys chmod; 0:..; ..
adc r0
rts pc
chown.s D¡m
® / C library -- chown
/ error = chown(string, owner);
.globl _chown
.data
_chown:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
clr r0
sys chown; 0:..; ..
adc r0
rts pc
close.s D¡b–
– / C library -- close
/error = close(file);
.globl _close
.data
_close:
1f
.text
1:
mov 2(sp),r0
clr r1
sys close
adc r1
mov r1,r0
rts pc
creat.s D¡[¨
Ë / C library -- creat
/ file = creat(string, mode);
/
/ file == -1 if error
.globl _creat
.data
_creat:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
sys creat; 0:..; ..
bec 1f
mov $-1,r0
1:
rts pc
crt0.s I¡¡Š
Ä / C runtime startoff
.globl retrn
.globl _main
start:
mov $mq,r4
mov sp,r0
mov (r0),-(sp)
tst (r0)+
mov r0,2(sp)
jsr pc,*_main
clr r0
sys exit
retrn:
mov r5,sp
mov (sp)+,r5
rts pc
ctime.s D¡‡Ç
</ C library -- ctime
/ ctime(v1, v2);
/ v1 is input time [2]
/ v2 is char[16] ascii time
/ format is 0123456789012345
/ Mmm dd hh:mm:sse
/
.globl _ctime
.globl ctime
.data
_ctime:
1f
.text
1:
mov 2(sp),r0
mov (r0)+,-(sp)
mov (r0)+,mq
mov (sp)+,ac
mov 4(sp),r0
clrb 15.(r0)
jsr pc,ctime
rts pc
execl.s D¡«á
· / C library -- execl
/ execl(file, arg1, arg2, ... , 0);
/
/
.globl _execl
.data
_execl:
1f
.text
1:
mov 2(sp),0f
mov sp,r0
add $4,r0
mov r0,0f+2
sys exec; 0:..; ..
rts pc
execv.s E¡
å / C library -- execv
/ execv(file, argv);
/
/ where argv is a vector argv[0] ... argv[x], 0
/ last vector element must be 0
/
.globl _execv
.data
_execv:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
sys exec; 0:..; ..
rts pc
exit.s E¡‹U
… / C library -- exit
/ exit(code)
/ code is return in r0 to system
.globl _exit
.data
_exit:
1f
.text
1:
mov 2(sp),r0
sys exit
fork.s E¡Ýa
Ø / C library -- fork
/ pid = fork();
/
/ pid == 0 in child process; pid == -1 means error return
.globl _fork
.data
_fork:
1f
.text
1:
sys fork
br 1f
bes 2f
rts pc
2:
mov $-1,r0
rts pc
1:
clr r0
rts pc
fstat.s E¡
…
ø / C library -- fstat
/ error = fstat(file, statbuf);
/ int statbuf[17] or
/ char statbuf[34]
/ as appropriate
.globl _fstat
.data
_fstat:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
sys fstat; 0:..
bec 1f
mov $1,r0
rts pc
1:
clr r0
rts pc
getchr.sH¡0å
» / C library -- getchar
.globl _getchar
.globl _fin
.globl getc
.data
_getchar:
1f
.text
1:
jsr r5,getc; _fin
bcs 1f
tst r0
beq 1b
rts pc
1:
clr r0
rts pc
.bss
_fin: .=.+518.
getuid.sE¡Õ›
° / C library -- getuid
/ uid = getuid();
/
/ uid == -1 if error
.globl _getuid
.data
_getuid:
1f
.text
1:
sys getuid
bec 1f
mov $-1,r0
rts pc
1:
bic $!377,r0
rts pc
gtty.s sE¡F³
/ C library -- gtty
/ error = gtty(filep, ttyvec);
/ filep is descriptor of open tty
/ ttyvec[0, 1, 2] correspond to args of gtty
.globl _gtty
.data
_gtty:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
sys gtty; 0:..
bes 1f
clr r0
rts pc
1:
mov $1,r0
rts r0
intr.s sF¡Åh
Š/ C library -- intr
/ intr(0); /* exit on interrupt */
/ intr(anything_odd); /* ignore interrupts */
/ intr(label); /* goto label on interrupts */
.globl _intr
.data
_intr:
1f
.text
1:
mov 2(sp),r0
beq 1f
bit $1,r0
beq 2f
1:
bic $1,r0
mov r0,0f
sys intr; 0:..
rts pc
2:
mov r5,9f
mov r0,9f+2
sys intr; 1f
rts pc
/ here on interrupts
1:
mov 9f,r5
jmp *9f+2
.bss
9:
.=.+4
link.s sF¡fw
° / C library -- link
/ error = link(old-file, new-file);
/
.globl _link
.data
_link:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
clr r0
sys link; 0:..; ..
adc r0
rts pc
makdir.sF¡$€
˜ / C library -- makdir
/ error = makdir(string);
.globl _makdir
.data
_makdir:
1f
.text
1:
mov 2(sp),0f
clr r0
sys makdir; 0:..
adc r0
rts pc
open.s sF¡’Š
È / C library -- open
/ file = open(string, mode)
/
/ file == -1 means error
.globl _open
.data
_open:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
sys open; 0:..; ..
bec 1f
mov $-1,r0
1:
rts pc
printf.s„¡6
q.globl _printn
.data; _printn:1f
.text; 1:mov r5,-(sp); mov sp,r5
tst -(sp)
mov 4(r5),(r4)
mov 6(r5),div
mov (r4),r0
mov r0,-2(r5)
bne l2
jmp l1
l2:mov 6(r5),-(sp)
mov -2(r5),-(sp)
jsr pc,*_printn
cmp (sp)+,(sp)+
l1:mov 4(r5),(r4)
mov 6(r5),div
mov ac,r0
mov r0,-(sp)
add $60,(sp)
jsr pc,*_putchar
tst (sp)+
jmp retrn
.globl _printf
.data; _printf:1f
.text; 1:mov r5,-(sp); mov sp,r5
add $-10,sp
mov r5,r0
add $6,r0
mov r0,-4(r5)
.data; l3: 1f; .text; 1:
l4:mov 4(r5),r0
inc 4(r5)
movb (r0),r0
mov r0,-10(r5)
cmp r0,$45
bne l6
jmp l5
l6:tst -10(r5)
beq l8
jmp l7
l8:jmp retrn
l7:mov -10(r5),-(sp)
jsr pc,*_putchar
tst (sp)+
jmp l4
l5:mov -4(r5),r0
add $2,-4(r5)
mov (r0),-6(r5)
mov 4(r5),r0
inc 4(r5)
movb (r0),r0
mov r0,-10(r5)
jsr pc,bswitch; l9
l10:l11:tst -6(r5)
blt l13
jmp l12
l13:mov -6(r5),r0
neg r0
mov r0,-6(r5)
tst -6(r5)
blt l15
jmp l14
l15:cmp -10(r5),$157
beq l17
jmp l16
l17:.data; l18:
.byte 61,60,60,60,60,60,0
.even;.text
mov $l18,-(sp)
jsr pc,*_printf
tst (sp)+
jmp l19
l16:.data; l20:
.byte 55,63,62,67,66,70,0
.even;.text
mov $l20,-(sp)
jsr pc,*_printf
tst (sp)+
l19:jmp *l3
l14:mov $55,-(sp)
jsr pc,*_putchar
tst (sp)+
l12:cmp -10(r5),$157
bne l21
mov $10,-(sp)
br l22
l21:mov $12,-(sp)
l22:mov -6(r5),-(sp)
jsr pc,*_printn
cmp (sp)+,(sp)+
jmp *l3
l23:mov -6(r5),-(sp)
jsr pc,*_putchar
tst (sp)+
jmp *l3
l24:mov -6(r5),-2(r5)
l25:mov -2(r5),r0
inc -2(r5)
movb (r0),r0
mov r0,-10(r5)
bne l27
jmp l26
l27:mov -10(r5),-(sp)
jsr pc,*_putchar
tst (sp)+
jmp l25
l26:jmp *l3
l28:.data
l9:163; l24
143; l23
157; l11
144; l10
l28; 0
.text
mov $45,-(sp)
jsr pc,*_putchar
tst (sp)+
dec 4(r5)
mov -4(r5),r0
sub $2,-4(r5)
jmp *l3
jmp retrn
putchr.s…¡Y€
½/ C library -- putchar
/ char = putchar(char)
/ buffer output if fout is not 1
.globl _putchar
.globl _fout
.globl _flush
.globl putc
.globl flush
.data
_putchar:
1f
.text
1:
mov 2(sp),r0
tst _fout
bne 1f
mov $1,_fout
1:
jsr r5,putc; _fout
movb 3(sp),r0
beq 1f
jsr r5,putc; _fout
1:
cmp _fout,$1
bne 1f
jsr r5,flush; _fout
1:
mov 2(sp),r0
rts pc
.data
_flush:
1f
.text
1:
jsr r5,flush; _fout
rts pc
.bss
_fout: .=.+518.
read.s sF¡W–
õ / C library -- read
/ nread = read(file, buffer, count);
/
/ nread ==0 means eof; nread == -1 means error
.globl _read
.data
_read:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
mov 6(sp),0f+2
sys read; 0:..; ..
bec 1f
mov $-1,r0
1:
rts pc
seek.s sF¡º¨
Ò / C library -- seek
/ error = seek(file, offset, ptr);
.globl _seek
.data
_seek:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
mov 6(sp),0f+2
sys seek; 0:..; ..
bec 1f
mov $1,r0
rts r0
1:
clr r0
rts pc
setuid.sF¡œ±
¥ / C library -- setuid
/ error = setuid(uid);
.globl _setuid
.data
_setuid:
1f
.text
1:
mov 2(sp),r0
sys setuid
bec 1f
mov $1,r0
rts pc
1:
clr r0
rts pc
stat.s sF¡¦Â
û / C library -- stat
/ error = stat(string, statbuf);
/ int statbuf[17] or
/ char statbuf[34]
/ as appropriate
.globl _stat
.data
_stat:
1f
.text
1:
mov 2(sp),0f
mov 4(sp),0f+2
sys stat; 0:..; ..
bec 1f
mov $1,r0
rts pc
1:
clr r0
rts pc
stty.s sF¡LÐ
/ C library -- stty
/ error = stty(filep, ttyvec);
/ filep is descriptor of open tty
/ ttyvec[0, 1, 2] correspond to args of stty
.globl _stty
.data
_stty:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
sys stty; 0:..
bes 1f
clr r0
rts pc
1:
mov $1,r0
rts pc
switch.sI¡66
¢ / C library -- switch
.globl bswitch
bswitch:
mov *(sp)+,r1
1:
cmp (r1)+,r0
beq 1f
tst (r1)+
bne 1b
2:
mov -4(r1),pc
1:
mov (r1)+,r0
beq 2b
mov r0,pc
time.s sF¡Þ
¶ / C library -- time
/ tvec = time(tvec);
/
/ tvec[0], tvec[1] contain the time
.globl _time
.data
_time:
1f
.text
1:
mov 2(sp),r0
sys time
mov ac,(r0)
mov mq,2(r0)
rts pc
unlink.sF¡1å
š / C library -- unlink
/ error = unlink(string);
/
.globl _unlink
.data
_unlink:
1f
.text
1:
mov 2(sp),0f
clr r0
sys unlink; 0:..
adc r0
rts pc
wait.s sG¡XP
]/ C library -- wait
/ pid = wait();
/ or,
/ pid = wait(&status);
/
/ pid == -1 if error
/ status idicates fate of process, if given
.globl _wait
.data
_wait:
1f
.text
1:
clr mq
sys wait
bec 1f
mov $-1,r0
rts pc
1:
cmp *(sp),tstins / arg count
bne 1f
mov mq,*2(sp) / status return
1:
rts pc
tstins: tst (sp)+ / stack pop for 1 arg
write.s G¡P\
ë / C library -- write
/ nwritten = write(file, buffer, count);
/
/ nwritten == -1 means error
.globl _write
.data
_write:
1f
.text
1:
mov 2(sp),r0
mov 4(sp),0f
mov 6(sp),0f+2
sys write; 0:..; ..
bec 1f
mov $-1,r0
1:
rts pc
printf.cH¡¦H
Pprintn(n,b) {
extern putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
char fmt[];
{
extern printn, putchar;
char s[];
auto adx[], x, c;
adx = &x1; /* argument pointer */
loop:
while((c = *fmt++) != '%') {
if(c == '\0')
return;
putchar(c);
}
x = *adx++;
switch (c = *fmt++) {
case 'd': /* decimal */
case 'o': /* octal */
if(x < 0) {
x = -x;
if(x<0) { /* is - infinity */
if(c=='o')
printf("100000");
else
printf("-32768");
goto loop;
}
putchar('-');
}
printn(x, c=='o'?8:10);
goto loop;
case 'c': /* char */
putchar(x);
goto loop;
case 's': /* string */
s = x;
while(c = *s++)
putchar(c);
goto loop;
}
putchar('%');
fmt--;
adx--;
goto loop;
}