add LCC - a better C-Compiler for WEGA
This commit is contained in:
parent
f6696e9a93
commit
fc60ef4050
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue