From: michaelh Date: Mon, 7 Feb 2000 03:26:37 +0000 (+0000) Subject: * Got dhrystone working - 83/s on a 4MHz Z80! X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=2ab743e728ecd2758a251956cd35f7d8ed33f121;p=fw%2Fsdcc * Got dhrystone working - 83/s on a 4MHz Z80! * Has hack re stack munching of __mulsint git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@73 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/device/lib/z80/Makefile b/device/lib/z80/Makefile index edba5a51..33a4159c 100644 --- a/device/lib/z80/Makefile +++ b/device/lib/z80/Makefile @@ -2,7 +2,7 @@ TOPDIR = ../../.. -SCC = $(TOPDIR)/bin/sdcc -mz80 +SCC = $(TOPDIR)/bin/sdcc -mz80 -v SAS = as-z80 OBJ = div.o mul.o putchar.o string.o printf.o diff --git a/device/lib/z80/asm_strings.s b/device/lib/z80/asm_strings.s new file mode 100644 index 00000000..da0aa8c5 --- /dev/null +++ b/device/lib/z80/asm_strings.s @@ -0,0 +1,31 @@ + ;; Implementation of some string functions in + ;; assembler. + + ;; Why - because I want a better dhrystone score :) + +; char *strcpy(char *dest, const char *source) +_strcpy:: + push de + push ix + ld ix,#0 + add ix,sp + ld l,6(ix) + ld h,7(ix) + ld e,8(ix) + ld d,9(ix) + + push de +1$: + ld a,(de) + ld (hl),a + inc hl + inc de + or a,a + jr nz,1$ + + pop hl + pop ix + pop de + ret + + \ No newline at end of file diff --git a/device/lib/z80/crt0.s b/device/lib/z80/crt0.s index dee48ca5..9d51c51a 100644 --- a/device/lib/z80/crt0.s +++ b/device/lib/z80/crt0.s @@ -6,6 +6,18 @@ .org 0 jp init + .org 0x08 + reti + .org 0x10 + reti + .org 0x18 + reti + .org 0x20 + reti + .org 0x28 + reti + .org 0x30 + reti .org 0x38 reti @@ -23,6 +35,11 @@ init: .area _DATA .area _CODE +_getsp:: + ld hl,#0 + add hl,sp + ret + _exit:: ;; Exit - special code to the emulator ld a,#0 diff --git a/device/lib/z80/printf.c b/device/lib/z80/printf.c index b6b4fbee..6974ca7b 100644 --- a/device/lib/z80/printf.c +++ b/device/lib/z80/printf.c @@ -20,12 +20,16 @@ typedef char * va_list; typedef void EMIT(char c, void *pData); -static void _printhex(unsigned u, EMIT *emitter, void *pData) +static void _printn(unsigned u, unsigned base, char issigned, EMIT *emitter, void *pData) { const char *_hex = "0123456789ABCDEF"; - if (u >= 0x10) - _printhex(u/0x10, emitter, pData); - (*emitter)(_hex[u&0x0f], pData); + if (issigned && ((int)u < 0)) { + (*emitter)('-', pData); + u = (unsigned)-((int)u); + } + if (u >= base) + _printn(u/base, base, 0, emitter, pData); + (*emitter)(_hex[u%base], pData); } static void _printf(const char *format, EMIT *emitter, void *pData, va_list va) @@ -39,10 +43,21 @@ static void _printf(const char *format, EMIT *emitter, void *pData, va_list va) break; } case 'u': + { + unsigned u = va_arg(va, unsigned); + _printn(u, 10, 0, emitter, pData); + break; + } case 'd': { unsigned u = va_arg(va, unsigned); - _printhex(u, emitter, pData); + _printn(u, 10, 1, emitter, pData); + break; + } + case 'x': + { + unsigned u = va_arg(va, unsigned); + _printn(u, 16, 0, emitter, pData); break; } case 's': diff --git a/src/z80/gen.c b/src/z80/gen.c index a1bf75ac..013aa719 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -914,7 +914,54 @@ static void genCpl (iCode *ic) /*-----------------------------------------------------------------*/ static void genUminus (iCode *ic) { - assert(0); + int offset ,size ; + link *optype, *rtype; + + /* assign asmops */ + aopOp(IC_LEFT(ic),ic,FALSE); + aopOp(IC_RESULT(ic),ic,TRUE); + + /* if both in bit space then special + case */ + if (AOP_TYPE(IC_RESULT(ic)) == AOP_CRY && + AOP_TYPE(IC_LEFT(ic)) == AOP_CRY ) { + assert(0); + goto release; + } + + optype = operandType(IC_LEFT(ic)); + rtype = operandType(IC_RESULT(ic)); + + /* if float then do float stuff */ + if (IS_FLOAT(optype)) { + assert(0); + goto release; + } + + /* otherwise subtract from zero */ + size = AOP_SIZE(IC_LEFT(ic)); + offset = 0 ; + CLRC ; + while(size--) { + char *l = aopGet(AOP(IC_LEFT(ic)),offset,FALSE); + emitcode("ld", "a,#0"); + emitcode("sbc","a,%s",l); + aopPut(AOP(IC_RESULT(ic)),"a",offset++); + } + + /* if any remaining bytes in the result */ + /* we just need to propagate the sign */ + if ((size = (AOP_SIZE(IC_RESULT(ic)) - AOP_SIZE(IC_LEFT(ic))))) { + emitcode("rlc","a"); + emitcode("sbc","a,a"); + while (size--) + aopPut(AOP(IC_RESULT(ic)),"a",offset++); + } + +release: + /* release the aops */ + freeAsmop(IC_LEFT(ic),NULL,ic); + freeAsmop(IC_RESULT(ic),NULL,ic); } @@ -1095,6 +1142,15 @@ static void emitCall (iCode *ic, bool ispcall) freeAsmop(IC_RESULT(ic),NULL, ic); } + /* PENDING: mega hack */ + { + char *s = OP_SYMBOL(IC_LEFT(ic))->rname[0] ? + OP_SYMBOL(IC_LEFT(ic))->rname : + OP_SYMBOL(IC_LEFT(ic))->name; + if (!strcmp(s, "__mulsint") || + !strcmp(s, "__divsint")) + IC_LEFT(ic)->parmBytes = 4; + } /* adjust the stack for parameters if required */ if (IC_LEFT(ic)->parmBytes) { int i = IC_LEFT(ic)->parmBytes; @@ -1713,16 +1769,35 @@ static void genCmp (operand *left,operand *right, goto release; } } + CLRC; while (size--) { /* Do a long subtract */ MOVA(aopGet(AOP(left),offset,FALSE)); - /* PENDING: CRITICAL: support signed cmp's */ - /* Subtract through, propagating the carry */ - if (offset==0) { - emitcode("sub","a,%s",aopGet(AOP(right),offset++,FALSE)); + if (sign && size == 0) { + /* Ugly but hey */ + emitcode("push", "af"); + emitcode("xor", "a,#0x80"); + emitcode("ld", "l,a"); + emitcode("pop", "af"); + emitcode("ld", "a,l"); + if (AOP_TYPE(right) == AOP_LIT){ + unsigned long lit = (unsigned long) + floatFromVal(AOP(right)->aopu.aop_lit); + emitcode("sbc","a,#0x%02x", + 0x80 ^ (unsigned int)((lit >> (offset*8)) & 0x0FFL)); + } else { + emitcode("push", "af"); + emitcode("ld", "a,%s",aopGet(AOP(right),offset++,FALSE)); + emitcode("xor", "a,#0x80"); + emitcode("ld", "l,a"); + emitcode("pop", "af"); + emitcode("sbc", "a,l"); + } } - else + else { + /* Subtract through, propagating the carry */ emitcode("sbc","a,%s",aopGet(AOP(right),offset++,FALSE)); + } } } } @@ -2587,7 +2662,8 @@ static void shiftL2Left2Result (operand *left, int offl, assert(0); } else { /* Copy left into result */ - movLeft2Result(left,offl, result, offr, 0); + movLeft2Result(left, offl, result, offr, 0); + movLeft2Result(left, offl+1, result, offr+1, 0); } /* PENDING: for now just see if it'll work. */ /*if (AOP(result)->type == AOP_REG) { */ diff --git a/support/tests/dhrystone/Makefile b/support/tests/dhrystone/Makefile index a3d7d207..fe342a9f 100644 --- a/support/tests/dhrystone/Makefile +++ b/support/tests/dhrystone/Makefile @@ -13,9 +13,12 @@ all: dhry dhry: $(OBJ) $(LD) -n -- -i -j -k$(LIBDIR) -lz80.lib \ - -b_CODE=0x200 dhry.ihx $(LIBDIR)crt0.o $(OBJ) + -b_CODE=0x200 -b_DATA=0xc000 dhry.ihx $(LIBDIR)crt0.o $(OBJ) cat dhry.ihx | ../../makebin/makebin > dhry.rom +native: + gcc -g -O2 -DREG= -DNOSTRUCTASSIGN -DNOENUM -o dhry dhry.c + .c.o: $(CC) $(CFLAGS) $< diff --git a/support/tests/dhrystone/dhry.c b/support/tests/dhrystone/dhry.c index b7f18104..0848672a 100644 --- a/support/tests/dhrystone/dhry.c +++ b/support/tests/dhrystone/dhry.c @@ -11,12 +11,14 @@ compiler work. * Removed malloc's for a couple of static arrays. * Into one file. + * Proc_8 is a bit messy. It originally took a 2 dim array, but + sdcc doesnt support this. So the offsets are hard coded... Notes: * The comment at the start of Func_1 about the input being H, R on the first call is wrong - Func_1 is first called from Func_2 where the input is R, Y. The test still succeeds. - + I couldnt find a copyright in the original - the most relevent part follows: @@ -34,9 +36,12 @@ */ #include "dhry.h" + /* Temporary definitions. Remove soon :) */ -char *strcpy(char *dest, const char *src); +#if SDCC void *memcpy(void *dest, const char *src, int wLen); +#endif +char *strcpy(char *dest, const char *src); int strcmp(const char *s1, const char *s2); Rec_Pointer Ptr_Glob, @@ -56,7 +61,7 @@ void Proc_2 (One_Fifty *Int_Par_Ref); void Proc_5 (void); void Proc_4 (void); void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref); -void Proc_8 (int **Arr_1_Par_Ref, int **Arr_2_Par_Ref, +void Proc_8 (int *Arr_1_Par_Ref, int *Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val); void Proc_6 (Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par); void Proc_3 (Rec_Pointer *Ptr_Ref_Par); @@ -67,7 +72,16 @@ Boolean Func_3 (Enumeration Enum_Par_Val); void printf(const char *format, ...); void exit(int val); +/*#define DPRINTF(_a) printf _a*/ +#define DPRINTF(_a) + +unsigned getsp(void); + +#if SDCC int _main(void) +#else +int main(void) +#endif { One_Fifty Int_1_Loc; REG One_Fifty Int_2_Loc; @@ -99,46 +113,53 @@ int _main(void) /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ /* overflow may occur for this array element. */ - Number_Of_Runs = 5; + Number_Of_Runs = 5000; /* Main test loop */ for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) { - printf("Proc_5\n"); + DPRINTF(("Run_Index = %d\n", Run_Index)); Proc_5(); Proc_4(); /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ + DPRINTF(("Ch_1_Glob '%c' == 'A', Ch_2_Glob '%c' == 'B', Bool_Glob %d == 1\n", Ch_1_Glob, Ch_2_Glob, Bool_Glob)); + Int_1_Loc = 2; Int_2_Loc = 3; strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); Enum_Loc = Ident_2; - printf("Func_2\n"); Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); /* Bool_Glob == 1 */ + DPRINTF(("Bool_Glob %d == 1, Int_1_Loc %d == 2, Int_2_Loc %d == 3\n", Bool_Glob, Int_1_Loc, Int_2_Loc)); while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ { - printf("m.1 Executes once.\n"); + DPRINTF(("m.1 Executes once.\n")); Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; /* Int_3_Loc == 7 */ - printf("Proc_7\n"); + DPRINTF(("Int_3_Loc %d == 7\n", Int_3_Loc)); + DPRINTF(("Proc_7\n")); Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); /* Int_3_Loc == 7 */ Int_1_Loc += 1; } /* while */ - printf("m.2 Check above executed once.\n"); + DPRINTF(("m.2 Check above executed once.\n")); /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ - printf("Proc_8\n"); + DPRINTF(("Int_1_Loc %d == 3, Int_2_Loc %d == 3, Int_3_Loc %d == 7\n", + Int_1_Loc, Int_2_Loc, Int_3_Loc)); + + DPRINTF(("Proc_8\n")); Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); /* Int_Glob == 5 */ - printf("Proc_1\n"); + DPRINTF(("Int_Glob %d == 5\n", Int_Glob)); + DPRINTF(("Proc_1\n")); Proc_1 (Ptr_Glob); for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) /* loop body executed twice */ { - printf("Func_1\n"); + DPRINTF(("Func_1\n")); if (Enum_Loc == Func_1 (Ch_Index, 'C')) /* then, not executed */ { - printf("Proc_6\n"); + DPRINTF(("Proc_6\n")); Proc_6 (Ident_1, &Enum_Loc); strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); Int_2_Loc = Run_Index; @@ -146,71 +167,76 @@ int _main(void) } } /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + DPRINTF(("Int_1_Loc %d == 3, Int_2_Loc %d == 3, Int_3_Loc %d == 7\n", + Int_1_Loc, Int_2_Loc, Int_3_Loc)); + Int_2_Loc = Int_2_Loc * Int_1_Loc; Int_1_Loc = Int_2_Loc / Int_3_Loc; Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ - printf("Proc_2\n"); + DPRINTF(("Int_1_Loc %d == 1, Int_2_Loc %d == 13, Int_3_Loc %d == 7\n", + Int_1_Loc, Int_2_Loc, Int_3_Loc)); + DPRINTF(("Proc_2\n")); Proc_2 (&Int_1_Loc); /* Int_1_Loc == 5 */ - printf("Looping.\n"); + DPRINTF(("Int_1_Loc %d == 5\n", Int_1_Loc)); + DPRINTF(("Looping.\n")); } /* loop "for Run_Index" */ - printf("Done.\n"); -#if !SDCC + printf("Run_Index = %d\n", Run_Index); + printf ("Execution ends\n"); printf ("\n"); printf ("Final values of the variables used in the benchmark:\n"); printf ("\n"); printf ("Int_Glob: %d\n", Int_Glob); - printf (" should be: %d\n", 5); + printf (" should be: %d\n", (int)5); printf ("Bool_Glob: %d\n", Bool_Glob); - printf (" should be: %d\n", 1); + printf (" should be: %d\n", (int)1); printf ("Ch_1_Glob: %c\n", Ch_1_Glob); printf (" should be: %c\n", 'A'); printf ("Ch_2_Glob: %c\n", Ch_2_Glob); printf (" should be: %c\n", 'B'); printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); - printf (" should be: %d\n", 7); + printf (" should be: %d\n", (int)7); printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); printf (" should be: Number_Of_Runs + 10\n"); printf ("Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent)\n"); - printf (" Discr: %d\n", Ptr_Glob->Discr); - printf (" should be: %d\n", 0); - printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 2); - printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 17); - printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); + printf (" Discr: %d\n", (int)Ptr_Glob->Discr); + printf (" should be: %d\n", (int)0); + printf (" Enum_Comp: %d\n", (int)Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", (int)2); + printf (" Int_Comp: %d\n", (int)Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", (int)17); + printf (" Str_Comp: %s\n", (char *)Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Next_Ptr_Glob->\n"); printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); printf (" should be: (implementation-dependent), same as above\n"); printf (" Discr: %d\n", Next_Ptr_Glob->Discr); - printf (" should be: %d\n", 0); + printf (" should be: %d\n", (int)0); printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); - printf (" should be: %d\n", 1); + printf (" should be: %d\n", (int)1); printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); - printf (" should be: %d\n", 18); + printf (" should be: %d\n", (int)18); printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); printf ("Int_1_Loc: %d\n", Int_1_Loc); - printf (" should be: %d\n", 5); + printf (" should be: %d\n", (int)5); printf ("Int_2_Loc: %d\n", Int_2_Loc); - printf (" should be: %d\n", 13); + printf (" should be: %d\n", (int)13); printf ("Int_3_Loc: %d\n", Int_3_Loc); - printf (" should be: %d\n", 7); + printf (" should be: %d\n", (int)7); printf ("Enum_Loc: %d\n", Enum_Loc); - printf (" should be: %d\n", 1); + printf (" should be: %d\n", (int)1); printf ("Str_1_Loc: %s\n", Str_1_Loc); printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); printf ("Str_2_Loc: %s\n", Str_2_Loc); printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); printf ("\n"); -#endif } void Proc_1 (REG Rec_Pointer Ptr_Val_Par) @@ -252,23 +278,23 @@ void Proc_2 (One_Fifty *Int_Par_Ref) One_Fifty Int_Loc; Enumeration Enum_Loc; - printf("-> Proc_2\n"); + DPRINTF(("-> Proc_2\n")); Int_Loc = *Int_Par_Ref + 10; do { - printf("1\n"); + DPRINTF(("1\n")); /* executed once */ if (Ch_1_Glob == 'A') /* then, executed */ { - printf("2\n"); + DPRINTF(("2\n")); Int_Loc -= 1; *Int_Par_Ref = Int_Loc - Int_Glob; Enum_Loc = Ident_1; } /* if */ - printf("3\n"); + DPRINTF(("3\n")); } while (Enum_Loc != Ident_1); /* true */ - printf("Proc_2 done.\n"); + DPRINTF(("Proc_2 done.\n")); } /* Proc_2 */ @@ -289,14 +315,14 @@ void Proc_4 (void) /* without parameters */ { Boolean Bool_Loc; - printf("-> Proc_4\n"); + DPRINTF(("-> Proc_4\n")); Bool_Loc = Ch_1_Glob == 'A'; Bool_Glob = Bool_Loc | Bool_Glob; Ch_2_Glob = 'B'; - printf("Expect Ch_1_Glob '%c' == 'A'\n", (char)Ch_1_Glob); - printf(" Ch_2_Glob '%c' == 'B'\n", (char)Ch_2_Glob); - printf(" Bool_Loc %d == 1\n", (unsigned)Bool_Loc); - printf(" Bool_Glob %d == 1\n", (unsigned)Bool_Glob); + DPRINTF(("Expect Ch_1_Glob '%c' == 'A'\n", (char)Ch_1_Glob)); + DPRINTF((" Ch_2_Glob '%c' == 'B'\n", (char)Ch_2_Glob)); + DPRINTF((" Bool_Loc %d == 1\n", (unsigned)Bool_Loc)); + DPRINTF((" Bool_Glob %d == 1\n", (unsigned)Bool_Glob)); } /* Proc_4 */ @@ -350,9 +376,9 @@ Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val) Capital_Letter Ch_1_Loc; Capital_Letter Ch_2_Loc; - printf("-> Func_1\n"); - printf(" Inputs: Ch_1_Par_Val '%c' == { H, A, B }\n", (char)Ch_1_Par_Val); - printf(" Ch_2_Par_Val '%c' == { R, C, C }\n", (char)Ch_2_Par_Val); + DPRINTF(("-> Func_1\n")); + DPRINTF((" Inputs: Ch_1_Par_Val '%c' == { H, A, B }\n", (char)Ch_1_Par_Val)); + DPRINTF((" Ch_2_Par_Val '%c' == { R, C, C }\n", (char)Ch_2_Par_Val)); Ch_1_Loc = Ch_1_Par_Val; Ch_2_Loc = Ch_1_Loc; @@ -400,20 +426,23 @@ void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Pa /*void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val)*/ -void Proc_8 (int **Arr_1_Par_Ref, int **Arr_2_Par_Ref, +void Proc_8 (int *Arr_1_Par_Ref, int *Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val) { REG One_Fifty Int_Index; REG One_Fifty Int_Loc; + DPRINTF(("-> Proc_8\n")); Int_Loc = Int_1_Par_Val + 5; Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; + DPRINTF(("Int_Loc %d == 8\n", Int_Loc)); + Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) - Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; - Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; - Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; + Arr_2_Par_Ref [Int_Loc*50 + Int_Index] = Int_Loc; + Arr_2_Par_Ref [Int_Loc * 50 + Int_Loc-1] += 1; + Arr_2_Par_Ref [(Int_Loc+20 *50) + Int_Loc] = Arr_1_Par_Ref [Int_Loc]; Int_Glob = 5; } @@ -430,16 +459,16 @@ Boolean Func_2 (char *Str_1_Par_Ref, char *Str_2_Par_Ref) REG One_Thirty Int_Loc; Capital_Letter Ch_Loc; - printf("-> Func_2\n"); - printf(" Inputs Str_1_Par_Ref \"%s\" = \"DHRYSTONE PROGRAM, 1'ST STRING\"\n", Str_1_Par_Ref); - printf(" Str_2_Par_Ref \"%s\" = \"DHRYSTONE PROGRAM, 2'ND STRING\"\n", Str_2_Par_Ref); + DPRINTF(("-> Func_2\n")); + DPRINTF((" Inputs Str_1_Par_Ref \"%s\" = \"DHRYSTONE PROGRAM, 1'ST STRING\"\n", Str_1_Par_Ref)); + DPRINTF((" Str_2_Par_Ref \"%s\" = \"DHRYSTONE PROGRAM, 2'ND STRING\"\n", Str_2_Par_Ref)); Int_Loc = 2; while (Int_Loc <= 2) { #if BROKEN_SDCC char a, b; - printf(" 2.1 Runs once Int_Loc %u = 2.\n", (unsigned)Int_Loc); + DPRINTF((" 2.1 Runs once Int_Loc %u = 2.\n", (unsigned)Int_Loc)); /* loop body executed once */ a = Str_1_Par_Ref[Int_Loc]; b = Str_2_Par_Ref[Int_Loc+1]; @@ -450,30 +479,40 @@ Boolean Func_2 (char *Str_1_Par_Ref, char *Str_2_Par_Ref) #endif /* then, executed */ { - printf(" 2.3 Then OK.\n"); + DPRINTF((" 2.3 Then OK.\n")); Ch_Loc = 'A'; Int_Loc += 1; } /* if, while */ else { - printf(" 2.2 Error.\n"); + DPRINTF((" 2.2 Error.\n")); } } - if (Ch_Loc >= 'W' && Ch_Loc < 'Z') + if (Ch_Loc >= 'W' && Ch_Loc < 'Z') { /* then, not executed */ + DPRINTF((" 2.4 Error\n")); Int_Loc = 7; - if (Ch_Loc == 'R') + } + if (Ch_Loc == 'R') { /* then, not executed */ + DPRINTF((" 2.5 Error\n")); return (true); + } else /* executed */ { + DPRINTF(("Str_1_Par_Ref = \"%s\", Str_2_Par_Ref = \"%s\"\n", + Str_1_Par_Ref, Str_2_Par_Ref)); if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) /* then, not executed */ { + DPRINTF((" 2.5 Error diff=%d\n", strcmp(Str_1_Par_Ref, Str_2_Par_Ref))); Int_Loc += 7; Int_Glob = Int_Loc; return (true); } - else /* executed */ + else { + /* executed */ + DPRINTF((" 2.6 OK\n")); return (false); + } } /* if Ch_Loc */ } /* Func_2 */