add LCC - a better C-Compiler for WEGA

This commit is contained in:
Oliver Lehmann 1990-05-03 16:40:18 +00:00
parent f6696e9a93
commit fc60ef4050
13 changed files with 431 additions and 0 deletions

View File

@ -0,0 +1,33 @@
//
// memchr - Returns a pointer to the first occurrence of character c in
// the first n characters of memory area s1, or NULL if c does
// not occur
//
// Input: s1 - memory area in which to conduct search
// c - character being sought
// n - maximum number of characters to search
//
// Output: pointer to character 'c' or NULL
//
.seg
sp := r15
SP := rr14
.psec
.code
_memchr::
{
ldm r2,|_stkseg+4|(sp),#4 // rr2 = s1
// r4 = c
// r5 = n
cp r5,#0
jr le,~ret0
cpirb rl4,@rr2,r5,eq
jr nz,~ret0
dec r3,#1
ret
~ret0: // return ((char *)0)
subl rr2,rr2
ret
}

View File

@ -0,0 +1,25 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec
.code
_strcat::
{
ldm r4,|_stkseg+4|(sp),#4 // rr4 - s1
// rr6 - s2
ld r1,#%fff6 // cnt = 65526
xor r0,r0
cpirb rl0,@rr4,r1,eq // search for zero byte
dec r5,#1 // rr4 - addr of s1_zero byte
ldl rr2,rr6
ld r1,#%fff6
cpirb rl0,@rr2,r1,eq
sub r3,r7 // length of s2
ldirb @rr4,@rr6,r3
ldl rr2,|_stkseg+4|(sp) // rr2 - s1
ret
}

View File

@ -0,0 +1,23 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec
.code
_strchr::
{
ldm r2,|_stkseg+4|(sp),#3 // rr2 - s , rl4 - c
jr ~start
~loop:
inc r3,#1 // nxt byte
~start:
cpb rl4,@rr2
ret eq
testb @rr2
jr nz,~loop // no end of string
subl rr2,rr2
ret
}

View File

@ -0,0 +1,37 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec data
.data
.psec
.code
_strcmp::
{
ldm r4,|_stkseg+4|(sp),#4 // rr4 <-> s1 , rr6 <-> s2
cpl rr4,rr6
jr eq,~ret0
~while: ldl rr2,rr6
inc r7
ldb rl0,@rr2
cpb rl0,@rr4
jr ne,~L2
ldl rr2,rr4
inc r5
ldb rl0,@rr2
testb rl0
jr nz,~while
~ret0:
xor r2,r2
ret
~L2: dec r7
ldb rl3,@rr6
ldb rl2,@rr4
subb rl2,rl3
extsb r2
ret
}

View File

@ -0,0 +1,20 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec
.code
_strcpy::
{
ldm r4,|_stkseg+4|(sp),#4 // rr4 - s1 , rr6 - s2
ldl rr2,rr6
subl rr0,rr0
cpirb rl0,@rr2,r1,eq
neg r1 // strlen(s2) + 1
ldl rr2,rr4 // return value s1
ldirb @rr4,@rr6,r1
ret
}

View File

@ -0,0 +1,52 @@
/*
* Return the number of characters in the maximum leading segment
* of string which consists solely of characters NOT from charset.
*
* int
* strcspn(string, charset)
* char *string;
* register char *charset;
* {
* register char *p, *q;
* char rl0, rl1;
*
* for (q=string; (rl0=*q)!='\0'; q++)
* for (p=charset; (rl1=*p++)!='\0'; )
* if (rl1 == rl0)
* goto finis;
* finis:
* return(q-string);
* }
*/
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strcspn::
{
ldm r2,|_stkseg+4|(sp),#4 // rr2 <-> q=string, rr4 <-> charset
~for1:
ldb rl0,@rr2 // fst/nxt *q
testb rl0
jr nz,~L1
~finis:
sub r3,|_stkseg+6|(sp) // q-string
ld r2,r3
ret
~L1:
ldl rr6,rr4 // rr6 <-> p=charset
~for2:
ldb rl1,@rr6 // fst/nxt *p
testb rl1
jr z,~L2
inc r7,#1 // p++
cpb rl0,rl1
jr eq,~finis
jr ~for2
~L2:
inc r3,#1 // q++
jr ~for1
}

View File

@ -0,0 +1,19 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec
.code
_strlen::
{
ldl rr4,|_stkseg+4|(sp) // s
xor r2,r2
ld r1,r2
cpirb rl1,@rr4,r2,eq
neg r2
dec r2,#1
ret
}

View File

@ -0,0 +1,31 @@
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strncat::
{
ldm r2,|_stkseg+4|(sp),#5 // rr2 <-> s1 , rr4 <-> s2 , r6 <-> n
subl rr0,rr0
cpirb rl0,@rr2,r1,eq
dec r3,#%1 // 0 Byte of s1
ld r0,r3 // offset(s1)
ld r1,r5 // offset(s2)
L15:
ld r3,r0
inc r0,#1
ld r5,r1
inc r1,#1
ldb rl7,@rr4
ldb @rr2,rl7
testb rl7
jr z,L16
dec r6,#1
jpr ge,L15
clrb @rr2
L16:
ldl rr2,SP(#4)
ret
}

View File

@ -0,0 +1,32 @@
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strncmp::
{
ldm r2,|_stkseg+4|(sp),#5 // rr2 <-> s1 , rr4 <-> s2 , r6 <-> n
cpl rr2,rr4
jr eq,~zeroout
~while:
dec r6,#1
jpr lt,L15
ldb rl0,@rr2
ldb rl1,@rr4
inc r5,#1
cpb rl0,rl1
jpr ne,L15
inc r3,#%1
testb rl0
jr nz,~while
~zeroout:
xor r2,r2
ret
L15:
test r6
jr mi,~zeroout
subb rl0,rl1
ret
}

View File

@ -0,0 +1,29 @@
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strncpy::
{
ldm r2,|_stkseg+4|(sp),#5 // rr2 <-> s1 , rr4 <-> s2 , r6 <-> n
~while:
dec r6,#1
jpr lt,~out
ldb rl7,@rr4
ldb @rr2,rl7
inc r5,#1
inc r3,#1
testb rl7
jr nz,~while
~while1:
dec r6,#1
jpr lt,~out
clrb @rr2
inc r3,#1
jpr ~while1
~out:
ldl rr2,SP(#4)
ret
}

View File

@ -0,0 +1,51 @@
/*
* Return ptr to first occurance of any character from `brkset'
* in the character string `string'; NULL if none exists.
*
* #define NULL (char *) 0
*
* char *
* strpbrk(string, brkset)
* register char *string, *brkset;
* {
* register char *p;
* char rl0, rl1;
*
* do {
* rl0 = *string;
* for(p=brkset; (rl1=*p++)!= '\0'; )
* if (rl1 == rl0)
* return(string);
* }
* while(string++, rl0 != '\0');
* return(NULL);
* }
*/
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strpbrk::
{
ldm r2,|_stkseg+4|(sp),#4 // rr2 <-> string , rr4 <-> brkset
~do:
ldb rl0,@rr2 // rl0=*string
ldl rr6,rr4 // rr6 <-> p=brkset
~for:
ldb rl1,@rr6 // rl1=*p
inc r7,#1 // p++
testb rl1
jr z,~while
cpb rl0,rl1
jr ne,~for
ret
~while:
inc r3,#1 // string++
testb rl0
jr nz,~do
subl rr2,rr2
ret
}

View File

@ -0,0 +1,25 @@
.seg
sp := r15
SP := rr14
fp := r13
FP := rr12
.psec
.code
_strrchr::
{
ldm r4,|_stkseg+4|(sp),#3 // rr4 - s , rl6 - c
subl rr2,rr2
jr ~start
~loop:
inc r5,#1 // nxt byte
~start:
cpb rl6,@rr4
jr ne,~endtest
ldl rr2,rr4 // preliminary return value
~endtest:
testb @rr4
jr nz,~loop // no end of string
ret
}

View File

@ -0,0 +1,54 @@
/*
* Return the number of characters in the maximum leading segment
* of string which consists solely of characters from charset.
*
* int
* strspn(string, charset)
* char *string;
* register char *charset;
* {
* register char *p, *q;
* char rl0, rl1;
*
* for(q=string; (rl0=*q) != '\0'; ++q) {
* p = charset;
* goon:
* rl1 = *p++;
* if (rl1 == '\0')
* break;
* if (rl0 == rl1)
* continue;
* goto gogon;
* }
* return(q-string);
* }
*/
.seg
fp := r13
FP := rr12
sp := r15
SP := rr14
.psec
.code
_strspn::
ldm r2,|_stkseg+4|(sp),#4 // rr2 <-> q=string , rr4 <-> charset
~for1:
ldb rl0,@rr2 // rl0=*q
testb rl0
jr nz,~L1
~finis:
sub r3,|_stkseg+6|(sp)
ld r2,r3
ret
~L1:
ldl rr6,rr4 // rr6 <-> p=charset
~for2:
ldb rl1,@rr6 // rl1=*p
testb rl1
jr z,~finis
inc r7,#1 // p++
cpb rl0,rl1
jr ne,~for2
inc r3,#1 // q++
jr ~for1
}