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