Change Log


3.1.3 17/12/2001 9:31 PM


[demos] Fox Hunting, Highway Hitman, Lisard Luncheon and Tic Tac Toe were retouched to use C++ features.


[demos] makefiles were reworked for using vcc.


[vcc] Added automatic root.inf generation for Cybiko Xtreme.


[sdk-win] Added C++ compiler, debugger (Beta version) and librarian into installation package.


[doc] Fixed some examples in the documentation.


[vcc] Files with '.a' extension are recognized as libraries and passed directly to the linker.


[sdk-win] 153 new bitmaps in the collection of the royalty-free media files. With this addition, total number of bitmaps reaches 4327.


2.1.9 08/09/2001 6:35 PM


[sdk-linux] Fixed some documentation formatting flaws.


[vcc1] C compiler now handles the 'unsigned' type qualifier, so it is now possible to use 'unsigned char', 'unsigned int' etc. types.

IMPORTANT NOTICE: if you're using 'unsigned' in the 'bytecode' (vs. 'native') compilation mode, you have to upload the newest bytecode.dl (found in the 'lib' folder) to your Cybiko computer, otherwise your program will not start. The thing is that currently there is no syspack with 'bytecode.dl' supporting 'unsigned' opcodes. If however you compile your program with '-n' switch, you don't have to bother yourself with that.


[tools] Several new or improved utilities: Media Converter, 2music, etc. The latter introduces new, advanced algorithm for handling multi-track MIDI scores; it is to be shipped with SDK Pro only.


[vcc1] Many important internal improvements and bug fixes in the compiler. In particular, many annoying problems with explicit type casts had been fixed (in the course of the 'unsigned' type qualifier implementation). Please note however that the new compiler is somewhat less forgiving in that it tries to strictly follow ANSI C specification – as a result, some pieces of invalid source code that used to "work" will most probably fail.


[media] 519 new bitmaps in the collection of the royalty-free media files. With this addition, total number of bitmaps reaches 4174. It is to be shipped with SDK Pro only.


[installer] Cybiko SDK Pro can now be downloaded both as a single installation package, or in 1-megabyte chunks.


[vcc] -V option doesn't check the maximum version limit anymore


2.0.7 04/27/2001 18:12


[vas] no more extra checks in 'skip'


[vcc1] implemented '-W' and '-w' options


[vcc1] 'return' without expression is now illegal in a non-void function


[vcc1] subsequent type casts (e.g. '(int)(int)123') handled improperly


[vlink] diagnostics quality has been improved significantly


[vcc1] local structures' and arrays' initializers did not work


[vcc] occasional crash in the middle of compilation has been fixed


[vcc1] introduced new 'unsigned shift' operators '>>>' and '>>>=')


[vcc1] 'enum' did not work correctly under some circumstances


[vcc1] better handling of scope rules


[vcc] bytecode.dl requirement has been removed from the automatically generated root.infs


[vcc, vlink] implemented -g and -G options


[vcc1, vas] implemented -g option


[sdk] bitmaps, MIDI scores and other resources are now part of the SDK distribution


[vcc, vcc1, vas, vlink] implemented -n switch (native code generation mode)
1.2.21 03/26/2001 17:52


[docs] miscellaneous improvements in the documentation


[2mus] fixed command line parsing


[inc] Mutex_dtor(), Flag_dtor() and Flagex_dtor() have been fixed


[vcc1] implemented shifts by variable number of bits


[vcc1] fixed multiplication / division / modulo with long operands


[vcc1] size of a structure is even if it contains even a single field that needs alignment (for better compatibility with Cygnus compilers)


[vcc1] function pointers could be 'typedef'-ed (i.e. it is now possible to introduce a type 'pointer to function returning...')


[vas, vlink] line number info is included in object files (though not used yet)


[vcc1] introduced extended format for the '__dl' function type modifier


[vcc1] '__inline' is now a synonym of 'inline' (and the latter is deprecated)


[vcc1] 'inline' function type modifier has been fixed


[vcc] fixed bug with empty default object file extension in compile-only mode


[vcpp] the -E option is now described in online help


[tutorials] added dynamic linkage tutorials, dl_app and dl_lib
1.1.15 03/01/2001 18:35


[vcpp] fixed bug that caused lockup under Windows 9x and some minor issues under Windows NT/2000 when including headers from an include search list specified with -I option


[vcc] -R option added to manage automatic root.inf generation


[vlink] added support for dynamic libraries


[vas] added .dl <label> <ordinal> directive that allows to export functions from dynamic libraries


[vcc1] functions pointer acceptable
1.1.10 02/14/2001 19:15


[vcc1] fixed bug that prevented prototypes of functions returning structures or references to work properly


[vcc] fixed -S option


[vcc1] structures are considered lvalues so that an element of an array of structures can be used at the left side of assignment


[vcc1] even small structures are returned by reference
1.1.9 02/05/2001 17:38


[vas\vcc1] new option -Vsp54 to build big application for syspack 54


[bytecode.dl\vas] new opcode "leagb.u"


[vcpp] preprocessor exits when stumbles upon unrecognized option (used to just issue a warning)


[vcpp] if given either of -M options, preprocessor turns itself into dependencies generator -- it outputs dependency records for the specified C/C++ source file rather then its preprocessed contents; even in this mode, it recognizes and processes other switches, e.g. -D, -I, etc.
1.1.8 01/25/2001 15:26


[vcc1] type check for arguments and return values is improved


[vcc1] large structures assignment is implemented
1.1.7 01/19/2001 19:16


[vcc1] redundant code removal for expressions is implemented


[vcc] -A option allows to specify a library search path; if not specified, defaults to $(CYBIKO_SDK)/lib


[vlink] -A option allows to specify a library search path, so that object files not found in current directory are searched there; only one path can be specified


[vlink] running vlink without parameters displays help


[vcc1] large structures can be passed and returned by value


[vcc1] error messages are now in Microsoft format (Windows version only)


[vcc1] new option '-ws'


[vcc1] bug with deref lvalue fixed (Ex: "char **p; main() { *p = 34; }")


[vcc1] implemented keyword 'inline'; inlining is restricted and does not apply under some circumstances (that is, some inline functions would be treated as regular)


[vcc] bug is fixed that prevented temporary files from being removed if compilation wasn't successful


[API] added simple serial port interface


[vcc1] final comma available in enum declaration


[vcc1, vas, vcc] new option '-V<ver> 'for bytecode.dl compatibility<![endif]>
1.1.1 01/30/2001 23:37


[vcc] specifying `.o' extension for output file automatically enables compile-only mode


[vas] stack.c stack.c collapsed


[vas] new parameter <type> for pipe_push_into()


[vas] add_patch() generates emit_????() now


[vas] all optimizations moved to pipe_push_into()


[vcc1] try to generate setz instead setnz


[vas] new opcodes jumple(gt).c <- setgt(lt) jumpz.c


[vas] new opcode muladd.c <- mul.c add


[vcc] temporary files are stored in system temp directory, not in `/tmp' as it used to be


[vcc] smarter SDK home directory detection algorithm


[vcpp] added support for backslashes in both source and include filenames
1.0.19 10/23/2000 17:00


[vas] new opcodes: add.c(s) -> inci?.b


[vas] new optimize algorithm (pipe)


[vlink] new tool for separate compilation


[vcc1] adjusted to support separate compilation. Introduces new assembler directives. Incompatible with previous versions as a result


[vas] adjusted to support separate compilation. Produces object files instead of binaries


[vas] statistic moved to dump procedure


[vcc1] bug with enum type fixed


[vas] new opcode: mul.c


[vas] new opcode: patch


[vas] new opcode: popadd <- pop add


[vcc1\vas] new opcodes: inci?1 && deci?1


[vcc1] fixed bug with / 2(4)


[vas] new version used flex and bizon


[vcc1] fixed bug with char omitted size array initialization


[vcc1] fixed bug with array with size != 1, 2, 4


[vas\bytecode.dl] .disp is unsigned now


[vas] profiler for frequency pair opcodes (-p<num> option)


[vmake] fixed bug with not existing “rm –f tmp\*”


[vas\vasx] increase module size up to 128K; increase max label up to 32K
1.0.18 10/11/2000 17:00


[vmake] –p<0|1|2> option added
1.0.17 08/23/2000 00:30


[bytecode.dl] available to set and reset m_quit flag from the program


[vcc1] available to scan hex and octal constants as unsigned long


[vcc1] optimization: !a && !b -> !(a || b)


[vcc1] recognize expressions that would use single register (such as addition or subtraction of a constant) and generate 'move' rather than 'push/pop' to preserve result of previous expression (?)


[vcc1] compiler check arguments' and return value's types


[vcc1] omit unnecessary '.ln' directives at not typed nodes


[vcc1/vas/bytecode.dl] new command "patch.u" (for patching)


[vas] new directive ".ldisp "


[vas/vcc1/bytecode.dl] BSS segment supported


[vas/vcc1/bytecode.dl] module size up to 64Kb


[vcc1] new field in bytecode-file header (I_FIRST_EXPORT). Changing I_FIRST->I_FIRST_ACTOR in bytecode.h


[vcc] new option -L link in library module (a.k.a. 'static linkage')


[vcc] use ($CYBIKO_SDK)\inc (if exist) to find include files


[vcc] default output extension is the ".bin" instead the ".b"


[vcc1] possible to obtain pointer to n-th element of structure array ( struct Bitmap bmps[10] ;) using & operator.


[vcc1] operator continue works correct in for(;; i++) loop. i++ does call


[vcc1] implement initialized arrays with omitted last size


[vcc1] exportation variables from outside supported


[vas] switch "-v" (verbose) is implemented.


[vcc1] introduced new keyword 'actor' as a replacement for 'export', in that it has exactly the same syntax and meaning


[vcc1] keyword 'export' re-implemented; from now on, it has the same syntax as 'import' (that is, accepts numerical argument) though the same impact on the functions as it used to have (i.e. not callable from within bytecode, emit "far" returns, etc.); exported functions get into the special 'table of exported functions' within bytecode module and are callable from within 'bootstrap' module compiled with Cygnus C++


[vmake] vmake now supports paths etc. with inner spaces provided that respective string is enclosed in either double or single quotes, as in:
    "c:/Program Files/Cybiko SDK/bin/vcc1"
    "c:\Program Files\Cybiko "SDK\bin\vcc1
1.0.16 08/19/2000 22:50


[vcc1] static objects are now output in the order that allows for more compact in-memory layout (i.e. bigger modules could be generated)


[vas] added extra diagnostics: longest forward and backward patches


[vcc] first public release of compiler's driver


[vcc1] the main() proc (application entry point), as well as any other exported function, could now be given up to 3 arguments, of any type (passed as 'long's)


[vcc1] fixing fetching address of array element on the right side of 'arrow' operator


[vcc1] 'static' qualifier works with variables declared within blocks; it is also possible to specify initializers for such variables


[vcc1] max number of elements per array's dimension enlarged up to 64000


[vcc1] keyword 'extern' now works not only with functions but also with variables; i.e. forward declaration of variables is also possible




[vcc1] if compilator's compilation's return code is not 0 (i.e. if compile-time errors were detected), output (usually .bin) file will be removed


[vcc1] unions are now fully implemented


[vcc1] now if we try to assign a number to a variable and the number is not within the range for respective type, we'll get a warning


[vcc1] duplicate case labels in 'switchfast' statements now get rejected
1.0.15 07/30/2000 00:04


[vcc1] unions implemented.


[vcc1] 'static' qualifier has effect within functions' bodies. [vas/bytecode.dl] implemented 40 new opcodes, which are combinations of 'old' opcodes with subsequent 'push' or 'move'; assembler touch to replace these sequences (in fact, pairs) with single opcode


[vcc1] new opcodes used to emit some types of relocation records


[vas] implemented 'dead code' elimination (excludes all opcodes after 'ret', 'jump.c' etc up to the next .label); this covers some rare cases not yet handled by the compiler, e.g. 'break' at the very end of 'switch'


[vcc1] fixed optimizer's handling of [ ]; that used to be treated as [ ]


[vcc1] fixed '<' '>' '<=' and '>=' operators applied to pointers
1.0.14 07/09/2000 06:16


[vcc1] while generating code for the 'struct_pointer->struct_field' construct, compiler emits single opcode
    add.c
rather than
    move
    load.c
    add


[bytecode.dl/vas] implemented six new opcodes: loadgc.s loadgs.s loadgl.s storegc.s storegs.s storegl.s


[vcc1] compiler tought to use the above mentioned opcodes in place of 'leag/loadi' and 'leag/storei' pairs; also, 'leag/move/load.c/storei' sequences now look like 'load.c/storeg' etc.


[vcc1] 'cbd/cwd' opcodes are no longer generated after imported/system functions whose result isn't actually used


[vcc1] addition/subtraction opcodes are no longer generated after post-decrements and post-decrements, respectively, if results of the latter are actually unused, as in for() loops


[vcc1] compiler outputs relocation records as:
    leag.s
    storegl.s
rather than (much longer)
    leag.s
    move
    leag.s
    storeil


[vas] implemented counter for the most frequent opcode pairs
1.0.13 07/06/2000 11:48


[bytecode.dl] ATTENTION! bytecode.dl 1.0.13 is INCOMPATIBLE with old bytecode modules; from now on, backward compatibility will be maintained for every release, but right now you have to download new bytecode.dl AND re-compile your applications with vcc1/vas 1.0.13


[vas] implemented 'cbd' (stands for 'Convert Byte to Double word') opcode


[vcc1] the above mentioned 'cbd' opcode now gets emitted right after system functions that return bytes (in fact, 'bool', since for 'char' functions gcc actually returns 'int')


[bytecode.dl] added version number; bytecode loader now ensures that its own version is not less than that of the module being loaded


[bytecode.dl] added room for the table of functions exported by bytecode modules; though functions that are not methods (of exported structures) could not be exported yet
1.0.12 06/25/2000 21:05


[vcc1] ++foo.bar, ++baz->bar etc did not work since results of '.' and '->' were not recognized as lvalues
1.0.11 06/13/2000 07:04


[bytecode.dl] common library cache size extended (up to 80 entries) to fit cylandia's grown demands
1.0.10 06/05/2000 00:04


[vcc1] option -d (dump code tree) caused GPF on some files
1.0.9 06/04/2000 00:11


[vas/vcc1] implemented new 'cwd' opcode (see cybiko_pcode.htm for details); with this opcode, fixed problems with results of CyOS functions that return 'char' or 'int', such as rand()
1.0.8 06/03/2000 03:44


[vcc1] compiler does not emit '.even' directives for static data bigger than 1 byte that actually do not need alignment; this makes code shorter a bit; quite important for programs (such as Cylandia) that use 'video sequence compiler' vseq.tsh, which generates a lot of 3-byte so called 'sequence loops' that reside in 'static' memory


[vcc1] compiler did not reject prototypes of gcc-compiled vararg functions with no named arguments (ANSI C requires at least one)


[vcc1] gcc-compiled (i.e. 'import' or '__cyos') vararg functions with more than one named argument used to be called incorrectly: all arguments used to be pushed on stack, while all named arguments but the very last one (up to 3) should have been passed in registers; for that reason, sprintf() and some other CyOS functions did not work


[t2mf] PD t2mf utility by Piet van Oostrum has been ported to Win32 and included into the distributive of SDK so that the output of our mus2txt utility could be converted back to .mid (MIDI Type 0) format
1.0.7 06/01/2000 03:29


[bytecode.dl/main.e] bytecode bootstrap module is re-built based on the cWinApp class, so it is now possible to use more of the CyWin API; as a drawback, .bss segment of the module became larger: 308 bytes vs. 256 (see [old] table below), and entire module now takes 404 bytes (vs. 352)


[vcc1] structure fields that need to be aligned are now aligned correctly; alignment rules match those of the GNU C compiler except for some dword-sized fields that GNU C (unnecessary) aligns on a 4-byte boundary when 2-byte would do; for example, if we define 'c' as 'struct { char a; long b; } c;' then 'sizeof c' would be 6 for vcc1 and 8 for GNU C; if some application requires strict binary structure compatibility with GNU C, then it should define 'c' like this: 'struct { char a, STUB; long b; } c;'


[vcc1] compiler now supports initialized static 'char' arrays with omitted size, i.e. such constructs as 'char foo[] = "Foo";'


[vcc1] initialized static data buffers were not freed (i.e. there were small memory leaks within compiler itself)


[vcc1] compiler now supports relocation records; most important is that now it is possible to initialize static pointer with static object's address, like this:
    static char* arr[ 3 ] = { "foo1", "bar", "baz" };
or even like this:
   struct foo { void* x1; int x2[ 5 ][ 3 ]; } myfoo;
   static void* ptr = & myfoo.x2[ 3 ][ 1 ];
1.0.6 05/30/2000 01:30


[vcc1/vas] there was no way to escape most special characters (e.g. quotes or newline) within character strings; compiler parsed all strings correctly, but failed to escape certain characters while passing them to assembler; as a remedy, compiler now passes strings byte by byte, it doesn't use assembler's '.string' directive anymore (for this purpose)


[vcc1] logical operators || and && produced 'zero/non-zero' rather than strictly correct 'zero/one' when used
- on the right side of assignments (=, +=, -=, etc.),
- within expressions used as functions' arguments,
- within expressions used as functions' return values


[vcc1/vas] implemented 'setz' and 'setnz' opcodes and used them
- to fix the problem with operators || and && (see above),
- to optimize code sequence generated for the ! (logical not) operator


[vcc1] implementation of access to dynamic libs had numerous flaws:
- static variables holding pointers were not always aligned properly,
- DynamicLibrary dtor was always given wrong 'this' pointer,
- init/cleanup of a library was triggered with just function prototype, not actual usage (i.e. rtl was attempting to load at startup, and free at exit, all libraries that vcc1 compiler saw in system headers)


[bytecode.dl/main.e] greatly reduced per-application overhead; the size of main.e (interpreter's bootstrap code that gets included into any application's .app archive) reduced from 1207 to 213 bytes; its memory map now looks like this:
    code 52 bytes
    idata 44 bytes
    bss 256 bytes (this includes app's internal name, own timer, etc.)
    ----- ---------
    total 352 bytes


[sdk] minor changes in SDK directory structure; sample makefiles updated to reflect these changes

1.0.5 05/29/2000 01:36


[vcc1] initialization expressions at the start of each block used to be computed in the reverse order; that was particularly evil if these expressions engaged function calls or referred to each other's values


[vcc1] compiler (erroneously) did not allow 'long' constants sometimes


[vcc1] compiler did not recognize a structure if it (structure) were the very last symbolic name defined in the module


[vcc1] namespaces' clashes resolved (did complete overhaul of pass1)
1.0.4 05/27/2000 13:41


[vas/vcc1] implemented new 'add.[c|s|l]' opcodes which are capable of adding arbitrary constants to R0; compiler tought to emit these opcodes


[vcc1] post-increment and post-decrement operators re-implemented with new 'add.?' opcodes, so that they handle pointers to any structures now


[vas/vcc1] implemented 'cmpe.[c|s|l]' opcodes which compare arbitrary constants with R0 and set the latter to 1 if R0 equals to the constants, or to 0 otherwise; compiler tought to emit these opcodes


[vas/vcc1] implemented "standard" 'switch' statement (that is: with optional 'default' label; doesn't break if switch expression is "out of range"; number of case labels not limited)


[vcc1] implemented 'switchfast' statement which acts exactly as old-style 'switch'; that is, no 'default' label, no negative cases, no comparisons: compiler generates jump table; the latter must not be "sparse": compiler ensures that at least 50% of jump addresses are used; if one of these conditions not met, compiler switches to "regular" 'switch'


[vcc1] processes (or, if more exactly, their queues) launched by modules made with vcc now get modules' names (sans extensions) at startup


[vas] implemented 'calld12.w' and 'calld3.w' opcodes; with these opcodes, in turn, implemented links to dynamic libraries; to call a function located within dynamic library (or even application) it is now necessary to just supply a prototype, like this: '__cyos "CyWin" 294 int imin(int,int);'
1.0.3 05/22/2000 12:33


[vcc1] both pre- and post-decrements of pointers produced incorrect results if the objects the pointers were pointing to were bigger than 128 bytes


[vas/vcc1] it is now possible to use arbitrary constants: compiler tought to emit and assembler tought to recognize 'load.l' opcode; bytecode.dl also modified to support new opcode


[vcc1] expressions '<expr> % 2' and '<expr> %= 2' are now handled even more effectively ('load1' is used instead of 'load.c1')
1.0.2 05/16/2000 20:07


[cybiko_pcode.htm] numerous changes and *corrections*


[vcc1] main() is now always considered vararg, regardless of actual definition; compiler also no longer requires at least 2 arguments to main(); any number of arguments will do


[vas] implemented 'jump.s', 'jumpz.s', and 'jumpnz.s' opcodes that use 16-bit signed offsets; made available 'load0' and 'load1' opcodes that were implemented earlier but were never included into the scheduler's table (there were no room); all opcodes are now emitted as indices, not offsets within scheduler's table (i.e. not pre-scaled)


[vcc1] compiler tought to make use of new opcodes 'load0' and 'load1'; however, compiler still writes 'jump*.c' opcodes with effective range -128..127, and it is up to assembler to replace them with 'jump*.s' opcodes whenever necessary


[vcc1] typedefs did not work properly; most annoying, compiler did not recognize simple integer typedefs (as in 'typedef long clock_t') as integers thus effectively disabling almost any use in expressions


[vcc1] compiler did not handle complex return types (such as pointers to structures) correctly
1.0.1 05/04/2000 12:09


[cybiko_pcode.htm] miscellaneous changes reflecting recent changes made to the compiler and opcode set; many hyperlinks added for convenience


[vcc1] added recognition of the program entry point (function main)


[vcc1] fixed bug in pass1.c (function expr): correct lvalues was not recognized in expressions involving structure members ('dot' and 'arrow' C constructs)


[vcc1] data and functions are now emitted to .asm file in correct order, i.e. as they were encountered in the source file; most important implication is that exported methods are now listed in the table of exported objects in the correct order, too


[vas] fixed emitting 'short' offsets to labels: assembler used to ignore extra displacements in 'label expressions' (compiled offsets to structure fields, array elements denoted with constant indices, etc.)


[vcc1] now it is possible to derive structure from some existing one defining no new fields, as in 'struct foo: public boo {};' (this is a notation device necessary for distinguishing exported methods)


[vcc1] compiler used to ban assignments to array elements which were pointers (it was failing to recognize them as lvalues)


[vcc1] when searching for structure fields while processing . and -> operators, compiler did not search base structures


[vcc1] in the 'dot' operator, size of structure element was never computed, so compiler used 4-byte indirect loads and saves by default; better diagnostics implemented to catch size mismatches similar to this one


[vcc1] if structure definition was not [properly] terminated with a semicolon, and that illegal definition was immediately followed by [correct] function definition, compiler would blow up instead of just reporting syntax error


[vcc1] while building code tree, compiler (sometimes) did not recognize fields of base structures within methods of derived ones


[vcc1] within structure's method, if field name to the right of the 'dot' operator was also a field of that structure then it could be treated as a 'this'-based variable and not as just a displacement


[vcc1] compiler now issues warning rather than error if it detects comparison that needs type cast (e.g. integer with non-integer; pointer with something other than 0 or pointer to the same type; etc.)


[vcc1] if static (v.s. local or 'this'-based) array were accessed with constant indices, compiler treated that array's elements as 4-byte


[vcc1] constant cast expressions, such as ('typename') 'number', did not produce any code


[vcc1] compiler did not handle negative constants correctly; for functions, this meant ineffective code, but for static data this meant inability to use negative initializers at all


[vseq] sequence compiler now supports 'idle' loops, that is loops which just count cycles but draw nothing; such loops can be specified using negative number (or just '-' which means '-1') as 'repetition counter'


[vseq] size of stored loop records reduced from 4 to 3 bytes each


[vcc1] both post- and pre-increments and decrements were actually compiled into pre-increments and pre-decrements, respectively; in other words, post-increments and post-decrements did not work
1.0.0 04/05/2000 09:22


First public release

Vadim Sytnikov.