From fc60ef405086031f2a7e388cfbff42d80811f1c7 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Thu, 3 May 1990 16:40:18 +0000 Subject: [PATCH] add LCC - a better C-Compiler for WEGA --- WEGA/contrib/lcc/lib/libc/u8k/gen/memchr.s | 33 +++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strcat.s | 25 ++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strchr.s | 23 +++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strcmp.s | 37 ++++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strcpy.s | 20 ++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strcspn.s | 52 ++++++++++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strlen.s | 19 ++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strncat.s | 31 ++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strncmp.s | 32 ++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strncpy.s | 29 +++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strpbrk.s | 51 +++++++++++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strrchr.s | 25 ++++++++++ WEGA/contrib/lcc/lib/libc/u8k/gen/strspn.s | 54 +++++++++++++++++++++ 13 files changed, 431 insertions(+) create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/memchr.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strcat.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strchr.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strcmp.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strcpy.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strcspn.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strlen.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strncat.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strncmp.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strncpy.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strpbrk.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strrchr.s create mode 100644 WEGA/contrib/lcc/lib/libc/u8k/gen/strspn.s diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/memchr.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/memchr.s new file mode 100644 index 0000000..6ed5952 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/memchr.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strcat.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcat.s new file mode 100644 index 0000000..a794d2f --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcat.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strchr.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strchr.s new file mode 100644 index 0000000..cab5359 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strchr.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strcmp.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcmp.s new file mode 100644 index 0000000..2b0f767 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcmp.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strcpy.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcpy.s new file mode 100644 index 0000000..78dec80 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcpy.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strcspn.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcspn.s new file mode 100644 index 0000000..7944447 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strcspn.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strlen.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strlen.s new file mode 100644 index 0000000..f3bc90f --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strlen.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strncat.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncat.s new file mode 100644 index 0000000..3bb6030 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncat.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strncmp.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncmp.s new file mode 100644 index 0000000..7ac1a99 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncmp.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strncpy.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncpy.s new file mode 100644 index 0000000..0ac18a9 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strncpy.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strpbrk.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strpbrk.s new file mode 100644 index 0000000..0bf7a29 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strpbrk.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strrchr.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strrchr.s new file mode 100644 index 0000000..8fedade --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strrchr.s @@ -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 + } diff --git a/WEGA/contrib/lcc/lib/libc/u8k/gen/strspn.s b/WEGA/contrib/lcc/lib/libc/u8k/gen/strspn.s new file mode 100644 index 0000000..fb27554 --- /dev/null +++ b/WEGA/contrib/lcc/lib/libc/u8k/gen/strspn.s @@ -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 + }