Hi,
first of all, I want to thank Andrey Nikitin and Mark Ogden for their outstanding quality work on decompiling CGEN.
Thanks to them, I had a very good starting point for the optimization of the
CGEN.COM for the RC2014's provided with 128KB RAM.
And, it seems I am on the good path...the first tests of the "new" CGEN are a success!
Here are some samples, obtained by running the 'submit' file that I use to build the "optimized" OPTIM:
(this was run on an RC2014 with SC108 - 128KB RAM)
(first, try with the "old" set of HiTech tools)
(comments marked with ***)
-----------------------------------------------
D>type makeopt.sub
c -v -c -o ctype1.c
c -v -c -o initvar1.c
c -v -c -o optim1.c
c -v -c -o part21b.c
c -v -c -o part21c2.c
c -v -c -o part21d.c
c -v -c -o part31b.c
c -v -c -o part31c.c
c -v -c -o part41a.c
D>submit makeopt
D>c -v -c -o ctype1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I CTYPE1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oCTYPE1.OBJ $CTMP2.$$$
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o initvar1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I INITVAR1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oINITVAR1.OBJ $CTMP2.$$$
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o optim1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I OPTIM1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
OPTIM1.C:
318: int strtoi(char *s, int base) {
^ s: storage class redeclared
OPTIM1.C: strtoi()
319: int val;
^ val: storage class redeclared
320: int digit;
^ digit: storage class redeclared
322: val = 0;
^ not a variable identifier: val
^ only lvalues may be assigned to or modified
324: val *= base;
^ not a variable identifier: val
^ only lvalues may be assigned to or modified
type conflict ^
^ illegal conversion
326: digit = *(s++) - '0';
^ not a variable identifier: digit
^ only lvalues may be assigned to or modified
illegal conversion ^
329: digit = ( ( ccClass[*s] & 1 ) ? (char)(*s | 0x20) : (char) * s) - ('a' - 10);
^ not a variable identifier: digit
only lvalues may be assigned to or modified ^
illegal conversion ^
333: if (digit >= base) {
^ not a variable identifier: digit
^ illegal use of void expression
337: val += digit;
^ not a variable identifier: val
^ not a variable identifier: digit
^ only lvalues may be assigned to or modified
type conflict ^
339: return val;
^ not a variable identifier: val
^ illegal conversion
(***OPTIM crashes, so I rebooted...)
Small Computer Monitor - S3
*cpm
RC2014 CP/M BIOS 1.2 by G. Searle 2007-18
CP/M 2.2 Copyright 1979 (c) by Digital Research
A>c -v -c -o part21a.c
C?
A>d:
(***let's continue, file by file, by manual compile commands...)
D>c -v -c -o part21a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART21A.C:
21: int val_1795;
^ val_1795: storage class redeclared
PART21A.C: sub_1795()
24: register inst_t *pi_1795;
^ identifier redefined: pi_1795
65: for (; pi_1795->type != 0xB && pi_1795->type != 8 && pi_1795->type != 0x10 && (pi_1795->type != 0x11 ||
simple type required for != ^
logical type required ^
66: GetByte((char*)(pi_1795-> u.o.lhs )+ 1) != (uint8_t) 0x0D);
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART21B.C: sub_1ec1()
43: GetByte((char*)(gPi-> u.o.lhs )+ 1) == (uint8_t) 0x07 &&
D>c -v -c -o part21c2.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21C2.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART21C2.OBJ $CTMP2.$$$
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21d.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21D.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART21D.C: sub_2ef8()
37: regValues[ 0x05].aux == regValues[ 0x04].aux && regValues[ 0x05]. term.val + 1 == regValues[ 0x04]. ter
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part31a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART31A.C:
17: 0x01,
^ simple type required for @
^ illegal conversion
49: int valO;
^ valO: storage class redeclared
PART31A.C: evalOperand()
52: register operand_t *operO;
^ operO: storage class redeclared
58: operO = allocOperand();
^ only lvalues may be assigned to or modified
illegal conversion ^
63: PutByte((char*)operO+ 0, (uint8_t) 0);
^ : storage class redeclared
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
>c -v -c -o part31b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART31B.C: loadFunction()
120: if (psF->label[0] != 'f')
type conflict ^
128: if ( GetByte((char*)(piF-> u.o.lhs )+ 0) != (uint8_t)0x32 ||
: storage class redeclared ^
129: GetWord((char*)(piF-> u.o.lhs )+ 4 ) )
logical type required ^
logical type required ^
logical type required ^
132: fpBase = GetWord((char*)(piF-> u.o.lhs )+ 2 );
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part31c.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31C.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART31C.C: sub_404d()
166: valid = IsValid((char*)pop);
: storage class redeclared ^
illegal conversion of integer to pointer ^ (warning)
175: v = GetWord((char*)pop+ 2 );
: storage class redeclared ^
type conflict ^
illegal conversion ^
204: else if (valid && !usesIXorIY && pi->type == 0xB && pi->aux == 0 && pi->pNext->aux == 0 &&
simple type required for == ^
logical type required ^
logical type required ^
205: sub_4000(pi->pNext) && ps->label[0] == '_')
logical type required ^
logical type required ^
logical type required ^
PART31C.C: pr_instruction()
248: ps_i = (sym_t*)GetWord((char*)po_i+ 4 );
: storage class redeclared ^
type conflict ^
illegal conversion ^
264: strcmp( ps_i->label, "csv") == 0)
logical type required ^
273: if (pi->type == 8 || pi->type == 0xB || pi->type == 0xC )
simple type required for == ^
too much indirection ^
logical type required ^
277: if (pi->aux != 0)
pointer required ^
(***P1 crashes, so I rebooted...continuing compile file by file...)
Small Computer Monitor - S3
*cpm
RC2014 CP/M BIOS 1.2 by G. Searle 2007-18
CP/M 2.2 Copyright 1979 (c) by Digital Research
A>d:
D>c -v -c -o part41a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART41A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART41A.C: sub_436e()
14: operand_t local_pi;
^ local_pi: storage class redeclared
15: operand_t *pi = &local_pi;
^ pi: storage class redeclared
^ can't initialise auto aggregates
21: ReadMem((char*)&local_pi, (char*)pi_arg, sizeof(operand_t));
^ : storage class redeclared
^ can't take address of register variable
can't take this address ^
illegal conversion ^
24: switch (pi->type) {
pointer required ^
^ struct/union required
27: fputc('(', (&_iob[1]));
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part41b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART41B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART41B.C: sub_47e0()
42: fprintf( (&_iob[2]), "%d\n", reg);
illegal conversion between pointer types ^ (warning)
50: if (IsValid((char*)pi1-> u.o.lhs ))
^ : storage class redeclared
illegal conversion between pointer types ^ (warning)
53: ps = (sym_t*)GetWord((char*)po+ 4 );
^ : storage class redeclared
illegal conversion ^
75: ps->label[0] == '_')
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
------------------------------------------
(and now, with the new set of HiTech tools : ZAS, CPP, P1, CGEN, OPTIM are all substituted with the "new" optimized variants...)
D>submit makeopt
D>c -v -c -o ctype1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I CTYPE1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oCTYPE1.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o initvar1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I INITVAR1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oINITVAR1.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o optim1.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I OPTIM1.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
OPTIM1.C:1017: No room
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART21A.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 47
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
PART21B.C: sub_1ec1()
197: GetByte((char*)(gPi->pNext-> u.o.lhs )+ 1) == (uint8_t) 0x11) {
Out of memory ^
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21c.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21C.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
PART21C.C:123: No room
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21c2.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21C2.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART21C2.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 10
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part21d.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART21D.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
(***P1 crashes, so I rebooted...continuing compile file by file...)
Small Computer Monitor - S3
*cpm
RC2014 CP/M BIOS 1.2 by G. Searle 2007-18
CP/M 2.2 Copyright 1979 (c) by Digital Research
A>d:
D>c -v -c -o part31a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART31A.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 15
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part31b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART31B.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 43
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part31c.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART31C.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART31C.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 48
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part41a.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART41A.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART41A.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 54
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>c -v -c -o part41b.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I PART41B.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oPART41B.OBJ $CTMP2.$$$
Z80AS Macro-Assembler V4.7
Errors: 0
Jump optimizations done: 62
Finished.
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA $$EXEC.$$$
D>
----------------------------------------------------
Summary of results:
File Size(KB) Old HiTech tools New HiTech tools
ctype1.c 2 ok ok
initvar.c 4 ok ok
optim1.c 50 OPTIM crashes OPTIM: no room
part21a.c 10 P1: out of memory ok
part21b.c 19 P1: out of memory P1: out of memory
part21c.c 12 P1: out of memory CGEN: no room
part21c2.c 4 ok ok
part21d.c 14 P1: out of memory P1 crashes
part31a.c 7 P1: out of memory ok
part31b.c 11 P1: out of memory ok
part31c.c 8 P1 crashes ok
part41a.c 9 P1: out of memory ok
part41b.c 14 P1: out of memory ok
There is an obvious progress, but there is still room for improvement...
I will soon publish the new P1, I'm done with the tests.
I'm still working and testing the "optimised" GGEN, on both versions:
- for "usual" RC2014
- for RC2014's with 128 KB RAM
Ladislau