version 6.30 work arounds
--------------
- As a work around to the intermediate values in expressions not always being preserved, all Z180 register-loaded values are preserved when a new value is to be loaded into any Z180 register. The compiled code resulting from a complex expression may contain unnecessary push/pop combinations, but the inefficiency can be minimzed or even eliminated by splitting complex expressions into a series of simpler expressions.


version 6.30 new features
--------------
- The aascPrintf(), lk_printf(), lk_viewl(), op71Printf(), printf() and sprintf() functions now return the number of characters written.

- STDIO.LIB has a new snprintf() function (length limited sprintf() function) which returns the number of characters that would have been buffered if the buffer was large enough. The buffered string is guaranteed to be zero-terminated unless the specified buffer length is zero.

- The OP7100GE.C Graphics Engine sample program now automatically reduces the button text label font size from fontId #2 (default medium size) to fontId #1 (default small size) when necessary to fit longer text labels in the button.

- STRING.LIB's atol() function now sets the _xtoxErr conversion error flag in cases where the conversion string contains non-integer characters. This brings the behaviour of the atol() function into line with the existing atoi() and atof() functions.

- The OP7100GE.C Graphics Engine sample program's virtual keyboard now has enhanced entry checking when entering long integer or floating point numbers. Entries with unrecognized characters are now rejected in the Graphics Engine, reducing the amount of checking required in the host application.

- The compiler now features improved {} [] () #asm/#endasm block checking. The unmatched or mismatched block opener's or closer's line is highlighted as usual when the error message is selected, and when known the error message refers to the line number of the beginning of the block error.

- The BL17XX\KEYMACRO.C sample program now demonstrates more of the Graphics Engine's features. New additions include keyboard macro auto-quit on entry, password entry mode, enhanced range-limited numeric entry checking, momentary display of the previous keyboard entry result and optional right-to-left text direction.

- EZIOPLC2.LIB now has a new reset_pbus_wait() function and the existing eioResetPlcBus() function is now also exported as reset_pbus() for compatibility with EZIOPLC.LIB.

- UART232.LIB, UART2.LIB and UART3.LIB have been enhanced to automatically adapt at compile time to the target controller's PLCBUS addressing scheme. In particular, these libraries may now be used with the BL1700 and PK2600 families of controllers.

- The Dynamic C 32 compiler now helps with the task of application code certification.

By setting the new "Zero Time Stamp" check box in the "Compiler Options" dialog box, the compilation time stamp that is normally passed as a parameter to main() is forced to zero. This allows independent verification of compiler output where application code certification is desired or required. When the Zero Time Stamp check box is clear, Dynamic C 32 passes the usual compilation time stamp (long int seconds since 01/01/1980) as a parameter to main().

Note: In order to achieve repeatable (constant) compiler output, a given Dynamic C 32 compiler version together with a constant set of selected compile options, source code (application and libraries) and target controller or RTI file is required.

Caveat: When the Zero Time Stamp check box is set, the application must not depend in any way on the compilation time stamp's validity or variability.

- The OP7100GE.C Graphics Engine sample program's virtual keyboard now scrolls the echoed input to display as much of the most recently typed information as possible.

- The program Loader Utility (PLU) version 2.01 now incorporates QueryPerformanceFreq() and QueryPerformanceCount() based inter-character gap timing, if OS support for these functions exists (all win32 except win3.1's win32s).

- The new sysGetFlashID function in SYS.LIB uses an industry-standard method to determine the manufacturer/device ID code of supported Flash chips. The ID code can then be used to look up the Flash's sector count, sector size, write timing and mode via calls to the sysGetFlashSCnt, sysGetFlashSSize, sysGetFlashWEDly, sysGetFlashPrTO and sysGetFlashWMode functions, respectively. This is the method used by the updated sysChk2ndFlash function to fill in the _flashInfo structure information. Note that the _flashInfo structure itself has been updated to include a code to indicate the Flash's write method type.

- Sample programs SAMPLES\PLCBUS\sm_demo2.c and SAMPLES\PLCBUS\sm_demo3.c now feature '+' and '-' direction stepping for each board. This enables the user to test both SD and EL response in each direction.

- The SAMPLES\OP7100\OP7100GE.C Graphics Engine sample program now features the ability to draw an existing button using either normal or inverted display. A new command, DISPLAY_BUTTON_Q (CMD=107, FXN=1 for normal display or FXN=2 for inverted display), has been added to provide this functionality.

- The Program Loader Utility (PLU) version 2.01 now accomodates longer pathlists, whose usage is increasingly common in win32.

- The SAMPLES\OP7100\OP7100GE.C Graphics Engine sample program's disable/enable button command now has added enable buttons area functionality (no changes in display). When CMD=79, FXN=3, DATA0=top left cell index and DATA1=bottom right cell index, all buttons either completely or partially in the desginated touch screen cell area which were previously disabled by a disable buttons area command are enabled. This command function may be linked to a button press in order to automatically enable a group of buttons in the designated touch screen cell area.

- After the "Compile | Compile to Target" menu selection (or its "F3" keyboard shortcut equivalent) is made, the Debug Edit Window cursor is left at the same position as the cursor in the Edit Window when debug execution begins. Thereafter, either when single stepping or a break point is encountered the Debug Editor Window and Edit Window cursors follow the application's debug execution as in previous versions of Dynamic C. This allows program test runs on the target controller without having to seek back to the point where editing left off, which can be especially handy when developing large applications.

- The SAMPLES\OP7100\OP7100GE.C Graphics Engine sample program's disable/enable button command now has added disable buttons area functionality (no changes in display). When CMD=79, FXN=2, DATA0=top left cell index and DATA1=bottom right cell index, all buttons either completely or partially in the desginated touch screen cell area are disabled. This command function may be linked to a button press in order to automatically disable a group of buttons in the designated touch screen cell area.

- Compilation now stops at the end of the first file in which errors are encountered. This prevents the obscuring or loss of important error messages in a potentially huge cascade of error and warning messages caused by an initial error.

- The message window now provides suppression information when the total number of errors plus warnings exceeds the message window's capacity of 32 messages. Note that excess messages are preferentially deleted in the following order: 1) trivial warnings, 2) serious warnings, 3) errors.

- AASC.LIB's aascPeek, aascReadBlk, aascReadChar and aascScanTerm functions have updated automatic receiver enable (aascRxSwitch) logic to reduce CTS/RTS handshake "flap" (when enabled).


version 6.30 fixes
--------------
-  When tabbing through "View Only" Function Lookup/Insert window selections the "Insert Call" tab stop is now included, and the parameter number from the "Insert Call" window is no longer displayed (or settable) in the "View Only" window.

- In KDM.LIB the kxget(), lk_tdelay(), lk_putc(), lg_putc() and Set_Pixel() functions now call hitwd() to prevent watchdog timeouts. This allows applications (such as the KDM sample program LK_KEY_2.C) to wait indefinitely for user input whenever a value is selected to be changed.

- The Edit Window Undo and Redo commands work correctly after block insertions, and no longer add an extra blank line after the block insertion is redone nor delete another line elsewhere in the edit buffer.

- The maximum number of error and/or warning messages tracked (but not displayed) has been increased to 1000 in order to minimize the possibility of numerous warning messages masking subsequent errors encountered during compilation.

- printf output of specified field width, right justified, 0 padded negative integers has been corrected. For example, printf("%08d %08ld\n", -1, -1L) now properly results in "-0000001 -0000001" being output. Note that this bug affected all XXXprintf functions, and the fix also applies to all XXXprintf functions.

- The OP7100GE.C Graphics Engine's virtual keyboard now correctly restores the previous screen display and previous button enable status when it terminates.

- The compile to file options and the auto-config memory option no longer interfere with each other's value when set. Previously set values are correctly retained until explicitly changed by the user.

- Dynamic C 32 now correctly reports the error instead of crashing when source code attempts to initialize an undefined structure.

- The editor now performs change-all no-prompt reverse search and replace correctly, even when the search string is a substring of the replace string.

- The Program Loader Utility now properly identifies itself in its "About . . ." dialog box.

- In EZIOLP31.LIB, _sysZIfPwrFail() is now "#asm nodebug root" to eliminate the incorrect "nouseix" declaration.

- The sizeof() result is now correctly treated as an unsigned integer (size_t) type by the compiler.

- The compiler now generates code that calls the appropiate >, >=, < or <= float comparison BIOS routine in all cases. This prevents incorrect results which sometimes occurred when comparing exactly equal float values.

-  The Graphics Engine (SAMPLES\OP71\OP7100GE.C) sample program now loads and displays bit maps properly, even when the bit map width is not an exact multiple of 8 bits.

- An ill-formed subfunction definition now generates an error message, and does not cause a GPF crash in the Dynamic C compiler.

- In AASC.LIB, the aascGets() and aascGetsWF() functions have been swapped (names exchanged) to follow Dynamic C's convention that function names ending with "WF" indicate the function is useful in a costatement's waitfor() construct. Note that this exchange causes incorrect parameter warning messages when compiling applications which use the old function names. Such applications can be easily updated by exchanging references to aascGets() and aascGetsWF().

- The aascGets() and aascGetsWF() functions in AASC.LIB now ignore '\0' characters in received data, and now return a string complete result only after a carriage return is received.

- Library function name length in BeginHeader/EndHeader block is now truncated at 32 characters (not including the zero terminator) to prevent a buffer overflow and subsequent target controller lock up. This standardizes BeginHeader/EndHeader symbol truncation with other symbol's truncation length.

- The compiler now properly accounts for the stack usage when an indirect call is made to a function with arguments and/or which uses auto variables. This prevents an incorrect jump which often resulted in a crash or, during debugging, a "Target Not Responding" error message.

- The compiler now supports assignment of the address of a variable declared extern in one library to another (constant) variable inside a Begin/End Header block in a different library. Note that such an assignment uses code and/or data space whenever the library is used, regardless of whether or not the function or variable described by the Begin/End Header block is referenced.

- The SAMPLES\OP71XX\OP7100GE.C Graphics Engine sample program now correctly executes the button disable/enable commands in a macro when the macro runs.

- The watch window now properly displays a signed (negative) integer's decimal representation as a signed value.

- The compiler now correctly evaluates any integral type variable value modulo constant 1 to zero.

- The compiler's #if/#elif/#else/#endif directive block checking no longer locks up if the directive evaluates to false and is left open at the end of an application file. The error message is reported at the last occurrence of a #if/#elif/#else directive block opener in the file.

- Target communication is more stable during debugging, even when a high serial rate (eg: 56Kbps) and a slow controller (eg: LP31XX) are combined. The increased stability is achieved by inserting small, accurate inter-character gaps into the debugging serial communication stream. During debug run mode, debug stop mode and run no-poll mode the inter-character gap is set to 2mS, 1mS and 0mS respectively, +/- 0.5 timer counts. The small gap between characters during debugging allows the target controller to execute a greater percentage of instructions outside of the debugging kernel's serial communication interrupt service routine. Note that the increased stability depends on OS support (any win32 except win3.1's win32s) for the QueryPerformanceCount() and QueryPerformanceFreq() functions. Without this OS support, Dynamic C 32 falls back on the standard BIOS tick timer which has approximately 55mS granularity.

- The _eioBrdAI() function in EZIOPK25.LIB now properly handles the ADC chip's end of conversion (EOC) signal, and will report an error (-1 return value) if the EOC signal remains low for too long.

- The OP7100GE.C Graphics Engine sample program can now execute Super Reset and/or Delete Button commands even when all available XRAM is already allocated. As before, the Delete Macro command may also be executed when XRAM is totally allocated. This allows the master application to release some or all XRAM in order for the Graphics Engine to execute commands in the play and/or macro queues.

It may be necessary to delete 5 or 6 sequentially defined buttons to release enough XRAM in order for the Graphics Engine to execute commands in the play queue. The number of buttons or macros that must be deleted after exhausting XRAM in order to execute macro commands depends on the amount of XRAM required by the particular macro. The Super Reset command frees all user defined  XRAM and Flash memory, requiring that user defined buttons, bit maps, fonts and macros be reloaded before use.

Note: Due to the linked list implementation of XRAM allocation and the way buttons and macros are sorted numerically by ID, it is fastest to define buttons and/or macros in reverse numerical order. This places the last defined button or macro at the start of the linked list, which saves considerable search time when the Graphics Engine checks for duplicate button or macro definitions.

- The OP7100GE.C Graphics Engine sample program now maintains all user defined button, bitmap and font information across resets or power cycles, until explicitly cleared by a user SuperReset() command.

- Fixed a memory access bug which often caused a GPF when no target is or was attached and compile to file with RTI is attempted.

- In the OP7100GE.C Graphics Engine sample program, deleting a button now also clears its cell to button mapping. If a new button is subsequently defined which re-uses the old ID but is sized or placed differently, then only the new button's cells will activate the new button. The work around of always disabling a button before deleting it is still valid, but no longer required.

- The OP7100GE.C Graphics Engine sample program's virtual keyboard macro's password entry mode now correctly displays the password prompt (instead of asterisks). The password itself is still echoed as asterisks as characters are typed.

- The OP7100GE.C Graphics Engine sample program now reports only a single button press when more than one cell is touched in a multi-cell button.

- The STDIO.LIB dkDoMsg() function which performs the low level Dynamic C debugging kernel communication which supports the printf(), puts() and putchar() functions now waits for the message complete handshake from Dynamic C before returning. This prevents duplicate lines being printed to the STDIO window.

- In SYS.LIB, the sysDI() function has been corrected to return a value which can be used to restore the previous interrupt enable status. Also in SYS.LIB, the sysRestoreI() function has been corrected to properly restore the previous interrupt enable status based on its parameter x.

- AASC.LIB's aascGetsWF now reports done (-1 result) only if a carriage return is read from the AASC Channel's input buffer. Note that the string will not be zero terminated if the string's length equals the maximum size argument, and that the string's length is never permitted to exceed this value.

- The KP_OP71.LIB's kpDriveAndRead() function now has a small added delay of approximately 100 microseconds to allow extra ramp-up time for the read-column capaciitor, which prevents incorrect keypress detection. The default row drive to column read and drive release to result return delays can be overridden in the application by defining either or both of KP_DRIVEREAD_CT (default 35) and KP_RELEASERET_CT (default 100) to an approximately microseconds value from 0 through 255, inclusive.

- UTIL.LIB's  IsZ80180 function now recognizes a Z8L180/Z8S180 CPU core type after either a software reset (Reset Target Ctrl+Y) or a hardware reset.

- AASC.LIB's aascReadXModem() function now responds correctly to the End-Of-Transmission character.

- When an application is running (not stopped at a break point or via Ctrl-Z) in debug mode, the context of any new watch expression that is evaluated or added to the watch list is taken to be the main() function. If the watch expression context is outside of the main() function, then a break point should be set and program execution stopped in the function of interest. Following these guidelines will eliminate the uninformative "Invalid end of section, check for open /*, {, [, and #asm" error message which previous versions of Dynamic C 32 sometimes reported when entering a watch expression on the fly.

- KDM.LIB now has correct headers, prototypes and declarations for all functions. This allows Dynamic C to correctly set up debug vs. nodebug mode for applications which use KDM.LIB. In addition, many of the function help descriptions are now more informative.

- Highlight mismatches between #asm code debug edit and assembly windows while single stepping near 'jp' and 'call' instructions have been eliminated.

- Duplicate case constants within the same switch statement now produce a compile time error message.

- Rewrote AASCZ0.LIB's z0Int and AASCZ1.LIB's z1Int ISRs to fix a bug which sometimes mishandled an errored Rx data byte interrupt, eventually causing stack overflow and a watchdog time out. This bug was the cause of controller resets when using the AASC Z1 RS-485 device in noisy conditions.

- The compiler now generates a serious warning message when a variable name is redefined by a global assembly label or when a library symbol is redefined in an application.

- The AASC.LIB aascPipe function has been corrected to set up a bidirectional I/O pipe between two AASC devices.

- Fixed the incorrect plcbus_isr() function pointer casts in DRIVERS.LIB's relocate_int1() function, which on some controllers caused the INT1 vector to be invalid. PLCBus INT1 is now handled correctly in applications which call relocate_int1() to set up plcbus_isr(), for example those applications which use UART232.LIB, UART2.LIB or UART3.LIB to access XP8700 PLCBus boards.

- The compiler now enforces the maximum array dimension of 32767 and the maximum product of dimensions of 32767. New error messages inform the user of the attempted dimension or product of dimensions count, as well as the maximum dimension or product of dimensions limit.

- The sysChk2ndFlash() function in SYS.LIB is updated to correctly identify all Atmel AT29LV020s as well as other Flash chips that may be used as a second Flash in the LP31XX and OP71XX families of controllers.

- In SYS.LIB, the LockReset() function's bit clear operation is now atomic, and cannot be interrupted and corrupted by another task.

- Expressions involving sizeof() where one or more spaces immediately followed the sizeof() are now evaluated corrrectly.

- The lcd_clr_line() function in DRIVERS.LIB now clears exactly 20 characters in the specified line, and no longer clears characters in following lines on 4x20 LCDs. Note that lcd_clr_line() is intended for use with a 2x20 LCD.


version 6.20 work arounds
--------------
- Also applies to 5.x, 6.02, 6.03 and 6.05. Assigning the sizeof() result to an unsigned integer variable and then performing operations on the unsigned variable results in correct unsigned evaluation.

- Also applies to 6.05. The Real Time Kernel (RTK) works with tasks that suspend, and the compiler's implementation of register variables is the same as that found in Dynamic C 32 version 6.02. The general use of register variables is strongly discouraged, however, they are necessary for the run_timer and rkernel functions in RTK.LIB. These functions must be reentrant but can not use auto variables because of RTK restrictions. All other occurrences of register variables in Z-World's libraries have been changed to auto, or removed, as appropriate.

- Also applies to 5.x, 6.02, 6.03 and 6.05. To create a *.BIN file which will communicate with Dynamic C and/or the Program Loader Utility (PLU) when programmed into a blank EPROM (including Flash type), compile to the target controller and then extract the entire EPROM contents using either the PLU or a device programmer (if the EPROM is socketed) to a *.BIN file. The extracted *.BIN includes the BIOS, program and BIOS' symbol library, and when programmed into a blank EPROM will communicate with Dynamic C and/or the PLU.


version 6.20 new features
--------------
- See the new SAMPLES\PK22XX\pk22mm.c sample program for a visual example of a Modbus master. Coil or register command (query) and response information is displayed on the LCD.

- Previously available separately, now included MS.LIB and MSZ.LIB libraries provide support for Modbus Slave applications using either the Z0 or Z1 serial port on any Z180 based Z-World microcontroller. See the new Modbus Slave Libraries chapter (updated from the previously separate manual) in the Dynamic C 32 Function Reference manual for information on using these libraries. The new chapter also includes step by step instructions for creating a custom Modbus Slave communication support library.

- See the updated SAMPLES\BL15XX\bl15ms.c, SAMPLES\BL17XX\bl17ms.c, SAMPLES\LP31XX\lp31ms.c and SAMPLES\PK22XX\pk22ms.c sample programs for examples of Modbus slave applications. The lp31ms.c (optional) and pk22ms.c programs feature LCD updates of the slave's coil and register information as Modbus commands (queries) are processed.

- New MM.LIB and MMZ.LIB libraries add support for Modbus Master applications using either the Z0 or Z1 serial port on any Z180 based Z-World microcontroller. See the new Modbus Master Libraries chapter in the Dynamic C 32 Function Reference manual for information on using the new libraries. The new chapter also includes step by step instructions for creating a custom Modbus Master communication support library.


version 6.20 fixes
--------------
- Function Reference, setbeep() function is now correctly listed in MISC.LIB section.

- Function Reference, PK2600 and OP7100 support library lists are corrected to read OP71HW.LIB, OP71L.LIB and OP71P.LIB.


version 6.20 feature request
--------------
- Compile to *.BIN file which will communicate with Dynamic C and/or the Program Loader Utility (PLU) after being programmed into a blank EPROM.

Using DC's "Compile to *.BIN file" (Ctrl-F3) option produces a file that when burned into a blank EPROM (including Flash type), does not communicate with either Dynamic C or the Program Loader Utility (PLU). Because the BIOS' symbol library at the top of EPROM is missing, the error message "Controller not reset or bad BIOS, try resetting the controller." is reported. However, the program itself runs properly.

Note that this behavior can be useful in situations where extra code security is desired, as tampering via Dynamic C and/or the PLU is prevented. See "6.20 work arounds" for a method to create a *.BIN file which includes the BIOS' symbol library.


version 6.20 bugs
--------------
- Also in 5.25 Supplemental Software, 6.02, 6.03 and 6.05. The _eioBrdAI() function in EZIOPK25.LIB does not properly handle the ADC chip's end of conversion (EOC) signal, and will hang until a watchdog time out if the EOC signal remains low for too long.

- Also in 6.02, 6.03 and 6.05. In the OP7100GE.C Graphics Engine sample program, when all available XRAM is used up (as by defining many buttons and/or macros), the Graphics Engine NAKs almost every command (essentially locks up) until reloaded onto the OP7100 or PK2600 display controller.

- Also in 5.26, 6.02, 6.03 and 6.05. BL1700 SCC port A receives 7 bit data with the most significant bit always set.

- Also in 6.02, 6.02 and 6.05. Compile to file options and auto-config memory option interfere with each other, each causing the other's setting to be changed without warning.

- Also in 6.02, 6.03 and 6.05. The OP7100GE.C Graphics Engine sample program loses track of all user defined buttons, bitmaps and fonts after every reset or power-down.

- Also in 5.26, 6.02, 6.03 and 6.05. The aascPipe function only sets up a one-way pipe with one shared buffer.

- Also in 6.02, 6.03 and 6.05. If no target attached during and after startup, Dynamic C 32 compile to file with RTI often causes GPF.

- Also in 6.02, 6.03 and 6.05. In the OP7100GE.C Graphics Engine sample program, simply deleting a button does not clear its cell to button mapping. If a new button is subsequently defined which re-uses the old ID but is sized or placed differently, then both the new and the old button's cells will activate the new button. The work around is to always disable a button before deleting it.

- Also in 6.02, 6.03 and 6.05. Occasional single stepping highlight mismatch between #asm code debug edit and assembly windows.

- Also in 6.02, 6.03 and 6.05. The OP7100GE.C Graphics Engine's virtual keyboard does not always restore the screen display after it terminates, and any previously enabled buttons in the lower half of the screen are left disabled.

- Also in 6.02, 6.03 and 6.05. The OP7100GE.C Graphics Engine sample program's virtual keyboard macro's password entry mode displays asterisks instead of the password prompt.

- Also in 5.26, 6.02, 6.03 and 6.05. When tabbing through "View Only" Function Lookup/Insert window selections the "Insert Call" tab stop is missed, and it displays (and allows setting) the parameter number from "Insert Call" window.

- Also in 6.02, 6.03 and 6.05. In the OP7100GE.C Graphics Engine sample program, when a multi-cell button in unsolicited response mode is pressed on a cell boundary multiple button presses are reported.

- Also in 6.02, 6.03 and 6.05. Occasionally, the printf(), puts() or putchar() functions result in a duplicate line being printed to the STDIO window.

- Also in 6.02, 6.03 and 6.05. Application Reference Manual page 50. Rule 3 (using saveix/restoreix to avoid problems with suspend) should be ignored. The saveix and restoreix functions do not exist, and the RTK automatically saves the task's IX register at each task switch.

- Also in 5.26, 6.02, 6.03 and 6.05. A printf of specified field width, right justified, 0 padded negative integers has incorrect output. For example, printf("%08d %08ld\n", -1, -1L) results in "000000-1 000000-1" being output.

- Also in 5.26, 6.02, 6.03 and 6.05. In SYS.LIB, the sysDI() function does not return a value which can be used to restore the previous interrupt enable status. Also in SYS.LIB, the sysRestoreI() function does not correctly restore interrupts based on its parameter x.

- Also in 5.26, 6.02, 6.03 and 6.05. No warning is generated when a global assembly label is redefined.

- Also in 6.02, 6.03 and 6.05. AASC.LIB's aascGetsWF function sometimes reports done (-1) without actually reading a character from the AASC Channel's input buffer.

- Also in 5.25 OP71/PK25 Supplemental Software, 6.02, 6.03 and 6.05. OP7100 keypad read routines sometimes return an incorrect keypress.

- Also in 6.02, 6.03 and 6.05. Some applications using the XP8700 board lock up when the UART generates an interrupt.

- If a program has numerous warnings before errors are encountered, the compiler will disregard the errors and compile as if only warnings exist.

- Also in 6.02, 6.03 and 6.05. After a target controller is reset via "Reset Target Ctrl+Y" the IsZ80180 function does not recognize a Z8L180/Z8S180 CPU core.

- Also in 6.02, 6.03 and 6.05. Technical Reference Manual, Appendix C, page 193: the list of libraries includes non-existent  XP*.LIB library names.

- Also in 5.x, 6.02, 6.03 and 6.05.In SYS.LIB, the LockReset() function's bit clear operation may be interrupted and corrupted by another task.

- Also in 5.x, 6.02, 6.03 and 6.05. The sysChk2ndFlash() function in SYS.LIB incorrectly identifies recent Atmel AT29LV020 Flash chips as being 128KBytes instead of 256KBytes. Flash chips with date codes 0052 (52nd week of 2000) and afterward may be affected. Note that the BIOS correctly identifies the main (BIOS) Flash size, the problem is with the second Flash (if so equipped).

- Also in 5.x, 6.02, 6.03 and 6.05. Sometimes expressions involving sizeof() are evaluated incorrrectly. For example, in "calc( 2 + 1*sizeof(char) + 3);" Dynamic C 5.x will erroneously complain about a missing ')' while Dynamic C 32 6.x will evaluate the parameter passed to calc() as 3, rather than 6.

- Also in 5.x, 6.02, 6.03 and 6.05. The compiler does not enforce the maximum array dimension of 32767 nor the maximum product of dimensions of 32767.

- Also in 6.02, 6.03 and 6.05. When running SAMPLES\CPLC\DIGDEMO.C, entering the suggested watch expression following the steps "CNTL w", "k", "ALT a" results in an "Invalid end of section, check for open /*, {, [, and #asm" error message.

- Also in 5.x, 6.02, 6.03 and 6.05. The sizeof() result is treated as a signed integer by the compiler, not unsigned (size_t) type.

- Also in 6.02, 6.03 and 6.05. In EZIOLP31.LIB, _sysZIfPwrFail() is incorrectly declared "#asm nodebug root nouseix". The "nouseix" causes an error report.

- Also in 6.02, 6.03 and 6.05. Float >= and <= comparison results are sometimes incorrect if operands are exactly equal.

- Also in 6.02, 6.03 and 6.05. Sometimes when compiling a program to the target controller (F3 or F9) the result is a "Target not responding" message, even though the program is actually running on the target just as if "#nodebug" or "nodebug main" had been specified in the program. The work around is to specify "debug main" (not "#debug") which forces the compiler to generate debuggable code for the main() function.

- Also in 6.02, 6.03 and 6.05. The Graphics Engine (SAMPLES\OP71\OP7100GE.C) sample program displays bit maps that are not exact multiples of 8 bits wide with a ragged edge.

- Also in 5.x, 6.02, 6.03 and 6.05. An ill-formed subfunction definition causes a Dynamic C GPF crash.

- Also in 5.x, 6.02, 6.03 and 6.05. The Program Loader Utility's "About . . ." dialog claims to be Dynamic C.

- Also in 5.x, 6.02, 6.03 and 6.05. In AASC.LIB, the aascGets() and aascGetsWF() functions do not follow Dynamic C's convention that function names ending with "WF" are suitable for use in costatement's waitfor() construct. In fact, while the aascGetsWF() function is unsuitable for such use, the "non-WF" aascGets() function is suitable for use in a costatement's waitfor() construct.

- Also in 5.26, 6.02, 6.03 and 6.05. Identical case constants within the same switch statement do not produce a compile time error. All subsequently defined identical case constants' code will never be executed.

- Also in 6.02, 6.03 and 6.05. In AASC.LIB, the aascGets() and aascGetsWF() functions return prematurely (before receiving a carriage return) if the received data contains a '\0' character.

- Also in 6.03 and 6.05. The target controller may lock up (loss of target communication) when a library function is called whose name in the BeginHeader/EndHeader block exceeds 32 characters in length.

- Also in 5.2x, 6.02, 6.03 and 6.05. The editor locks up when change-all no-prompt reverse search and replace propagates the search string. To see the bug's effect without locking up the editor, open a new edit file, enter an "a" and then do a reverse search and replace of "a" to "aa" with prompt. The "a" is propagated until canceled.

- Also in 6.02, 6.03 and 6.05. Indirect calls to functions with arguments or auto variables causes crash or results in "Target Not Responding" error message during debugging.

- Also in 6.02, 6.03 and 6.05. Application Frameworks near the bottom of page 36. A line in the code fragment near the bottom reads "waitfor ( (flag_DelayMs (200L) ) || x);" but the underscore should be an equals sign.

- Also in 6.02, 6.03 and 6.05. The address of a variable declared extern in one library assigned to another (constant) variable inside a Begin/End Header block in a different library is invalid.. Note that such an assignment uses code and/or data space whenever the library is used, regardless of whether or not the function or variable described by the Begin/End Header block is referenced.

- Also in 6.02, 6.03 and 6.05. In the SAMPLES\OP71XX\OP7100GE.C Graphics Engine sample program, any button disable/enable command which is put in a macro is not executed when the macro runs.

- Also in 6.02, 6.03 and 6.05. The intermediate value of some (usually mixed-type) expressions is not always preserved for completion of the operation. For example, given that L1, L2 and L3 are long integers, in the logical expression ((L1 + L2) > L3), the intermediate value of (L1 + L2) is not preserved (stacked) before the logical comparison is done. In another example, "char c; c = 0; if(c--) printf("oops\n");" in a Dynamic C program results in "oops" being output on the STDIO Window.

- Also in 6.02, 6.03 and 6.05. The watch window displays a signed (negative) integer's decimal representation as an unsigned value.

- Also in 6.02, 6.03 and 6.05. Technical Reference page 222, New Libraries list reads MOP71HW.LIB, MOP71L.LIB, MOP71P.LIB but should read OP71HW.LIB, OP71L.LIB, OP71P.LIB.

- Also in 6.02, 6.03 and 6.05. The compiler generates no modulus code for the expression "i % 1" (where 1 is constant), the result is simply the value on the left hand side of the modulus operator. Any value modulo 1 should always evaluate to zero.

- Also in 6.02, 6.03 and 6.05. An application program that has an open #if/#elif/#else block that evaluates to false at end of file hangs Dynamic C up in an endless loop.

- Also in 6.02, 6.03 and 6.05. Dynamic C 32 crashes when attempting to initialize an undefined structure.

- Also in 6.02, 6.03 and 6.05. While debugging, target communication is often unstable when a high serial rate (eg: 56Kbps) and a slow controller (eg: LP31XX) are combined. The result is frequent loss of target communication.

- Also in 6.02, 6.03 and 6.05. Technical Reference middle of page 126. The shift right operator says vacated bits become zero, which is true for unsigned int and long, but signed int and long are sign-extended. The example code fragment is wrong, it should say that j gets 0xFF00.

- Also in 5.26, 6.02, 6.03 and 6.05. When using AASCZ1.LIB, noise on Z1 RS-485 serial line sometimes causes controller to reset.

- Also in 5.26, 6.02, 6.03 and 6.05. AASC.LIB's aascReadXModem() function does not respond correctly to End-Of-Transmission character.

- Also in 6.02, 6.03 and 6.05. Inserting a block of code, undoing the insert and then redoing the insert (using undo & redo, not cut & paste) results in the insertion of an extra blank line after the block of code and the possible deletion of some other line of code elsewhere in the edit buffer.

- Also in 5.26, 6.02, 6.03 and 6.05. The KDM sample program LK_KEY_2.C times out on a watchdog reset whenever a value selected to be changed is not entered quickly.

- Also in 5.24, 5.25, 5.26, 6.02, 6.03 and 6.05. The lcd_clr_line() function in DRIVERS.LIB clears a portion of the third or fourth line on a 4x20 LCD, in addition to the line specified. Note that lcd_clr_line() is intended for use with a 2x20 LCD.


version 6.03 new features
--------------
- Added UART3.LIB and modified DRIVERS.LIB and LIB.DIR to support 3rd UART board on PLCBus. Also added U_test.c sample program to check the operation of 3 UART boards.

- Expanded default message window from 10 to 32 lines.

- The Down Load Manager (DLM) sample program (SAMPLES\AASC\DLM_Z0.C) now minimizes Flash EPROM writes in order to reduce the chance that corrupted RAM will make a currently loaded DLP unrecognizable to the DLM. The Down Loaded Program (DLP), its vector table (as modified by the DLM), and the device function pointers block (passed by DLM to the DLP) are all written to the Flash only once after a successful download.

- A new Ctrl+S keyboard shortcut has been added to save the current edit file.

- SAMPLES\BL17XX\keymacro.c sample program now includes backlight timeout after 10 minutes of inactivity.

- The Down Load Manager sample program has been renamed from SAMPLES\AASC\DLM01.C to SAMPLES\AASC\DLM_Z0.C to indicate the default AASC serial channel used. Improved comments are intended to make porting the DLM to other AASC serial channels easier.

- OP7100GE Graphics Engine virtual keyboard macro's text entry line now has an underscore "cursor" to indicate the next character's position. This is particularly helpful when backspacing over spaces.


version 6.03 fixes
--------------
- Updated STDIO.LIB to make '__ftoa()', '_gltoa()' and '_gltoan()' globally available to user-callable library functions, and to ensure that all functions are 'nodebug'. Also inserted "Oct" into list of abbreviated month names.

- Dynamic C 32 returns to edit mode after errors such as ROM code in same 4K memory page as stack (RAM data) are reported, instead of continuing to load the target's program.

- Print preview screen's printer icon now functions correctly.

- The lp31ADCEnb() function in EZIOLP31.LIB is modified to reenable as well as reselect the ADC after it has been deselected and disabled by the lp31ADCDis() function. The ADC channel readings are stable when the ADC is actually functioning.

- The compiler can now parse source code lines up to 255 characters in length including the terminating '\0'.

- The compiler now supports symbol names up to 32 characters in length. All symbol names longer than 32 characters, including macro names within library headers, are truncated to 32 characters. If two or more symbol names are identical after truncation, error or warning messages will be generated depending on the type of symbol. Macro symbol redefinitions generate warnings and redefinition of variable or function names generates errors.

- Initializers using the selection operator now compile correctly for the following semantically equivalent cases (p1 and p2):
struct foo { int x; int y;} foovar;
main() { int *p1= &((*(&foovar)).x);  int *p2 = &((&foovar)->x); }

- The OP7100.C Graphics Engine sample program's cell enable/disable command logic is corrected to match the manual's description.

- The OP7100.C Graphics Engine sample program's button/cell unsolicited responses now work outside of as well as within the built-in keyboard macro.

- The compiler now checks the value of floats before conversion to long int to prevent GPFs due to out of range assignments. Note that the result of out of range conversions is undefined.

- The compiler now treats "register" as a synonym for "auto" when declaring a variable's storage class, which maintains reentrancy at the possible expense of a small reduction in execution speed. *** See 6.03 bugs list for RTK problems and 6.05 work arounds list for partial resolution. ***

- File/path name and message-box buffers' sizes increased to suit Win 32's long pathlists (in some cases, several times "_MAX_PATH") in order to prevent crashes due to buffer overrun.

- To prevent the compiler from incorrectly reporting it is out of root code space, the compiler's address fix-up routine now checks for the special case where an xmem jump instruction's address to be fixed up falls exactly on the root/xmem boundary at E000h. The xmem reference's base (page number) is decremented and the xmem reference's address is adjusted upwards by 1000h (1 page, to F000h) to keep the opcode and its address all together in the xmem window during the address fix-up.

- The "Help | About" dialog box has been corrected to read "Dynamic C 32".

- SYS.LIB's malloc() now returns pointer to available memory block. The register variable declaration was removed from the function, and some invalid (void *) pointer arithmetic was corrected.

- Updated SAMPLES\NETWORK\z0rem.c to eliminate the demotion warning, to optionally run on bl17xx controllers, and also to fix the displayed date for Y2K.

- All functions in EZIOPBDV.LIB which should bit-or error code EIO_NODEV into eioErrorCode, now do so. Changed all occurrences of 'eioErrorCode != EIO_NODEV;' to 'eioErrorCode |= EIO_NODEV;'.

- The inlined 'outport' function now saves the output value (second parameter, loaded into HL) on the stack before retrieving the output port address from the stack, which results in the correct value being output to the port.

- A Down Loaded Program (DLP) now has full access to all available AASC channels, including the one shared with the Down Load Manager (DLM). The _aascInitDF_DLP function chain has been eliminated and the _aascInitDF segments in the AASC device initialization functions plus the _GLOBAL_INIT segments in aascOpen and aascDLPReOpen have been reworked to install the DLM's device function pointer information into only the AASC device defined as AASC_DLM_DEVICE. If not explicitly defined in the user application, AASC_DLM_DEVICE defaults to DEV_Z0.

- The Down Load Manager (SAMPLES\AASC\DLM01.C) now checks the LP31xx BOARD_TYPE to allow it to work on the LP3100 controller.

- Fixup of references to extern unsigned long declaration of xdata item within BeginHeader/EndHeader in a C source file is now handled correctly.

- The UART2.LIB function descriptions have been corrected to reference board address 0x040010.

- File access errors, such as when compiling in a directory where the user does not have write permission, are now properly caught and an informative error message is displayed.

- Removed unmatched '#ifdef LANDSCAPE' line in SAMPLES\BL17XX\keymacro.c sample program which caused compile time block error if LANDSCAPE is not defined (ie: in portrait mode).

- The compiler now generates complete RTI files for OP71XX and LP31XX controllers. Unlike other controllers, the OP71XX and LP31XX series do not "ghost" multiple copies of smaller than 512 KByte Flash EPROMs.


version 6.03 bugs
--------------
- Also in 6.02. Function Reference page 91, setbeep() function is listed as being in DRIVERS.LIB, should be listed in MISC.LIB.

- Making register a synonym for auto caused stack misalignment problems in the Real Time Kernel (RTK), affecting applications that use the RTK and which have tasks that suspend.

- Also in 6.02. Function Reference pp. 141, 142 PK2600 and OP7100 support library lists read MOP71xx.LIB, should read OP71xx.LIB.


version 6.02 new features
--------------
- Now a true 32-bit Windows application, runs faster and more reliably on all Win32 platforms. Especially noticeable is the speedier debugging STDIO communication and overall improvement in system responsiveness.

- Printer page set up now allows margin width adjustment, dynamically displays page orientation and margin changes as they are made. Please note that lines are character-wrapped and not word-wrapped at the margins. This may result in odd looking line wraps when printing some fixed line length files.

- New "Graphics Engine" sample software. The primary purpose of the OP7100 Graphics Engine is to enable the use of an OP7100 controller from another controller (not necessarily Z-World) via RS232 without re-programming the OP7100.  An OP7100 with a well-documented and versatile serial graphics command interpreter is a product that can be useful to people who don't use Z-World controllers and to those who do (check out the new PK2600).

- UTIL.LIB IsZ80180() function added to distinguish between original Z80180 (returns non-zero) and newer Z8S180 (returns zero) CPU cores. This function contains part of the _GLOBAL_INIT chain, which should be executed by calling the appropriate one of _GLOBAL_INIT(), uplc_init(), or VdInit() at the beginning of the application program.
Note: The method used is undocumented, but deemed reliable by a Zilog designer.

- Streamlined libraries and faster routines enhance the graphics capabilities built into the OP7100 and PK2600 families of controllers.

The new libraries are OP71HW.LIB (general hardware support), OP71L.LIB (landscape mode) and OP71P.LIB (portrait mode). These libraries have improved functionality while retaining as much compatibility with the old libraries as possible. Application programs must contain exactly one of either '#use OP71L.LIB' or '#use OP71P.LIB', followed by '#use OP71HW.LIB'.

There is no longer a default font library included, so if the program uses fonts a specific '#use xxxFONTL.LIB' is required. The new libraries always use landscape format bitmaps and fonts, even when Portrait Mode is selected. The ENGFONTL.LIB (previous default) and ENGFNT2L.LIB font libraries may thus be used in either mode. Similarly, custom generated bitmaps and fonts must also be in landscape format in order to be useful.

Examples of how to use these new libraries can be found in the SAMPLES\OP71XX subdirectory of the main Dynamic C 32 installation directory.

GLCD.LIB is still required for use by other controllers with a graphics LCD or VFD. However, the EZIOOP71.LIB, GLCD.LIB, LQVGA.LIB and PQVGA.LIB libraries are now considered obsolete by Z-World, Inc. The EZIOOP71.LIB, LQVGA.LIB and PQVGA.LIB are still available in the LIB\OBSOLETE subdirectory of Dynamic C 32's main installation directory.

- Search dialog boxes now save substrings of previous search strings in addition to the previous string.


version 6.02 fixes
--------------
- Logical &&, || operators correctly short circuit when their result is determined by left side operand. This prevents right side operands from assigning values that should never be evaluated.

- AASC.LIB aascGets() function corrected to echo "\n\r" only when echo is enabled.

- EZIOLP31.LIB missing 'on_232()' and 'off_232()' functions implemented as macros.

- STRING.LIB strrchr() function now checks all character positions in the string parameter.

- STRING.LIB strncmp(str1, str2, n) now correctly returns non-zero (ie: no match) when str1 is longer than str2 and n > strlen(str2) and str2 matches the left-most characters in str1.

- Reference to 'INT0_VEC' in DRIVERS.LIB plcbus_isr() function corrected to read 'INT1_VEC'.

- The compiler now produces appropriate demotion warnings when assigning values from "larger" to "smaller" types.

- DMA.LIB DMA0_IOM() function corrected to add parameter definition to function description and parameter declaration to function prototype.

- EZIOPBDV.LIB _plcXP85RawIn not found error message fixed by moving function in library and addition of BeginHeader/EndHeader.

- Each instance of a function name (ie: when the function exists in multiple library files) in the Library Look-up on the Help Menu now brings up the appropriate library's function help description when selected.

- Single stepping through assembly code 'djnz label' now correctly decrements the b register in the Registers window.

- STDIO.LIB ftoa() references to @S changed to @SP.

- STDIO.LIB pint() and plint() functions now correctly format strings at -32768 and -2147483648 for any field width (if specified), respectively.

- Corrected zero addition, subtraction bugs in F.add, F.sub BIOS routines by adding F_add, F_sub to MATH.LIB which avoid calling BIOS routines when zero addend, subtrahend in the hl register. This bug was the underlying cause of atof("0.0") returning a non-zero result.

- MATH.LIB pow() function now avoids unnecessary EDOM run time errors. pow(x,0.0) returns 1.0 and when y is non-zero pow(0.0,y) returns 0.0.
Caveat 1: When x is negative, y is rounded to the nearest integer value to enforce a Real float result.
Caveat 2: When y is negative, pow(0.0,y) results in an ERANGE (divide by zero) run time error.

- Compiler now recognizes long, short as modifiers for int.

- SYS.LIB sysWrite2ndFlash() function now temporarily disables interrupts during critical section.

- AASCZ0.LIB ASCI_PARAM_OPARITY definition corrected from 0x00020000 to 0x120000.

- The prog_param structure information is once again correct. In particular, the AASC\DLM01.C sample program now works on the OP71XX series as it does on other controllers.

- STDIO.LIB ftoa() function has new implementation which is more precise, but is probably slower. Also fixed incorrectly implemented carry propagation in _gltoa function.

- Added op71BackLight(1) and op71SetContrast() calls after glInit() in the following sample programs for OP7100: backlite.c, bitmap.c, brushes.c, contrast.c,defdemol.c,demo1.c,demo1l.c, glprintf.c, kpdeflt.c,kpgrid.c, kpitscn.c,kpmulti.c, kpq.c.

- The correct version information is now displayed in the main window title bar.

- Corrected test for hexadecimal and octal default conversions in STRING.LIB's strtol() function. Note that this fix also applies to the following functions which call strtol(): STRING.LIB's atoi(), atol() and strtod() functions; STDIO.LIB's _atodt(), _atotm() and doprnt() functions. Also note that this fix further applies to all the ?printf() functions which call doprnt().

- Typo in eziolp31.lib corrected, LP3100 Enable PFI and Disable PFI now address the same interrupt lp31EnbPFI() calls sysINT1(1) and now lp31DisPF() calls sysINT1(0).

- reload_vec now reads the i register to determine the location of the vector table, as required when programs are downloaded through the DLM.

- EZIOLP31.LIB typo 'eioBrdD0' corrected to read: '#define swEnb485Rx(x) eioBrdDO(n485RE, !x)'.

- If AASC devices DEV_Z0 or DEV_Z1 are opened with no line break handler and a line break is received, the interrupt service routine will not call the NULL routine.

- STEP2.LIB smq_read16() function now uses the correct 'BUSRD0' address

- Function Reference manual malloc description corrected to read ". . . Because *malloc uses a global free list pointer, *malloc must not be preempted by another *malloc. Heap . . ."

- Added _sysZIfPwrFail() in EZIOPL31.LIB as required by SYS.LIB _sysIfPwrFail(). Note: Must include #use eziolp31.lib in program in order to recognize  _sysZIfPwrFail().

- Logical operators &&, || now work with mixed 16-bit and 32-bit operands.


version 6.02 bugs
--------------
- uart2.lib function descriptions have incorrect references to board address 0x040018, should be 0x040010.

- Several functions in EZIOPBDV.LIB contain the useless statement 'eioErrorCode != EIO_NODEV;'.

- Unmatched '#ifdef LANDSCAPE' line in SAMPLES\BL17XX\keymacro.c sample program causes compile time block error if LANDSCAPE is not defined (ie: in portrait mode).

- DC crashes when compiling in a directory where the user doesn't have write permission.

- Also in 5.26. When using a Down Loaded Program (DLP), only the AASC channel that is shared with the Down Load Manager (DLM) works correctly. Commumication on other AASC channels is ignored.

- The "Help | About" dialog box reports it is the "Dynamic C Deluxe" version.

- Also in 5.26. The compiler can not parse source code lines longer than 129 characters including the terminating '\0'.

- Also in 5.26. Macro names longer than 16 characters defined within library headers cause a GPF crash during compilation.

- Also in 5.26. The compiler parser truncates some symbol names which are longer than 16 characters, then later gives an error message that the truncated symbol name can't be found.

- The initializers in the following code are semantically equivalent, but p1 compiles correctly while p2 generates a compile time error:
struct foo { int x; int y;} foovar;
main() { int *p1= &((*(&foovar)).x);  int *p2 = &((&foovar)->x); }

- The OP7100.C Graphics Engine sample program does not enable or disable cells as described in the manual.

- The OP7100.C Graphics Engine sample program does not send unsolicited responses when enabled for button presses.

- Conversion of some out of range float values to long int causes a GPF.

- LP3100 ADC channel readings are extremely unstable.

- Register variable values are sometimes not preserved by the compiler.

- DC 32 occasionally crashes (GPF or more rarely even quits without warning) when using long pathlists.

- Printing from print preview printer icon crashes Dynamic C 32.

- DC 32 sometimes reports it is out of root memory, even with small program and data sizes.

- SYS.LIB's malloc() function always returns 0, even when sufficient heap space exists.

- Dynamic C 32 loads target program to controller after ROM code in same 4K memory page as stack (RAM data) error message.

- Using DC 32 v.6.02 to compile SAMPLES\NETWORK\z0rem.c results in the following error messages:
line    1 : ERROR ERROR        : Undefined (but used) global label __ftoa
line    1 : ERROR ERROR        : Undefined (but used) global label _gltoa

- Also in 5.25 OP71/PK25 Supplemental Software. The Down Load Manager (SAMPLES\AASC\DLM01.C) does not work on the LP3100.

- When the port parameter to the inlined 'outport ( port , value )' function is an auto variable or auto variable plus a simple constant zero, the wrong value is output to the port. Work around this bug  by using a constant for the port parameter, or add an almost-trivial constant zero to the port auto variable, such as 'outport ( 1 + port - 1 , value )'.

- extern unsigned long declaration of xdata item within BeginHeader/EndHeader in a C source file causes subsequent definition to always point to NULL.

- Also in 5.25 OP71/PK25 Supplemental Software. When trying to create an .RTI file for an OP71XX or LP31XX controller, a "Target not responding" error is returned after a few seconds.


version 5.26 fixes
--------------
- AASC.LIB aascScanTerm() function changed to be reentrant.

- AASC.LIB aascPeek() function changed to be reentrant.

- ZNPAKFMT.LIB _znInt() function modified to include protection for af' registers.

- AASC.LIB aascClose() now maintains _channel linked list correctly. Removed PipexxChannel field from struct _channel. Use nextChannel instead for both the used and free lists. Modifed aascOpen, aascDLPOpen and aascClose to match.

- float to long conversion corrected. Problem was due to improper exponent range checking, should be compared against 31, not 30.

- Previously mislinked #use entries in Lib.dir (those with identical right-most characters) are now resolved correctly.

- The code defining "fast" and "indirect" to NULL was removed. Note: Defining indirect and fast to null breaks some old programs, most notably the down load manager.

- AASC.LIB aascScanTerm() function call to circbufChkTerm() parameters corrected..

- At 10,000 line source code limit a warning was added and code loss is prevented. The 10,00 line limit will be removed in a future release.


version 5.26 bugs
--------------
- The strrchr() function in string.lib does not find the first 2 characters in a string.

- The function _sysZIsPwrFail is missing from EZIOLP31.LIB. This is required by the function _sysIsPwrFail in SYS.LIB.

- DMA0_IOM function in DMA.LIB is missing the parameter for increments.

- Reference to 'INT0_VEC' in DRIVERS.LIB plcbus_isr() function should read 'INT1_VEC'.

- Also in 4.0, 5.25 and 5.25 OP71/PK25 Supplemental Software. STRING.LIB strncmp("abcd", "abc", 4) returns 0 (ie: equal).

- In the Library Look-up on the Help Menu, if a function appears more than once on the list because it exists in multiple library files, only one instance will work when clicked. Other instances close the dilaog box.

- In eziolp31.lib the line '#define swEnb485Rx(x) eioBrdD0(n485RE, !x)' is using a zero instead of an upper case "O" in eioBrdDO.

- The djnz instruction does not decrement b register in the Registers window when single stepping.

- pint() incorrectly outputs asterisks when the signed integer to be output is -32768 (ie: 0x8000) and the field width is specified as "%6d". plint() similarly incorrectly outputs asterisks when the signed long integer to be output is -2147483648 (ie: 0x8000000) and the field width is specified as "%11ld". plint() also outputs "--2147483648" (has two minus signs).

- The pow(x,y) function results in needless run time error when x == 0 and y >= 0.

- Function Reference manual malloc description incorrectly reads ". . . Because *malloc uses a global free list pointer, *malloc must be preempted by another *malloc. Heap . . ."

- STEP2.LIB smq_read16() function uses wrong '0xC0' address, should be 'BUSRD0".

- If DEV_Z0 is opened with no line break handler and a line break is received, the interrupt service routine may call the NULL routine.

- Logical &&, || operators do not short circuit when their result is determined by left side operand. This can result in right side operands assigning values that should never be evaluated.

- Function aascGets() echo's "\n\r" when echo parameter is disabled(set to 0).

- The LP3100 user manual indicates that there is an on_232() and off_232() function, however the functions don't exist in Dynamic C release 5.26.

- The atof function returns 1.17549e-38 for the string "0.0".

- When using the keywords short/long int the compiler generates an error.

- In STDIO.LIB ftoa() function will not compile, @S was found twice.

- Odd parity defined wrong in AASCZ0.LIB.

- Also in 5.25. The wrong version "Dynamic C Deluxe 5.24" appears in the title bar.

- By default, strtol() only converts decimal numbers correctly, not hexadecimal or octal numbers. Hexadecimal numbers are ingnored, while octal numbers are incorrectly converted.

- When you assign an integer (signed or unsigned) value to a character variable, the compiler does not give a warning.

- Using the function call plcXP85InC without first calling plcXP85In gives the error message _plcXP85RawIn as not found.

- STDIO.LIB ftoa() function is imprecise.

- Older OP7100 sample programs depend on glInit() to initialize the backlight and set the contrast, which no longer occurs in glInit().

- In eziolp31.lib, LP3100 Enable PFI and Disable PFI address different interrupts. lp31EnbPFI() calls sysINT1(1), but lp31DisPF() calls sysINT2(0).

- reload_vec assumes the vector table is at 2000h. This is not the case with programs downloaded through the DLM.

- Logical operators &&, || don't work with mixed 16-bit and 32-bit operands.


version 5.25 OP71/PK25 Supp. bugs
--------------
- The prog_param structure information is not filled in correctly. In particular, the AASC\DLM01.C sample program does not function correctly.

- The version number is missing and Dynamic C's title bar shows "Distribution Unknown".


version 5.25 bugs
--------------
- Call to circbufChkTerm in aascScanTerm has too many parameters.

- If one file is user.lib and the other one is a_user.lib, the #use directive incorrectly matches the contents of the file to the #use label, depending on the order of definition in lib.dir.

- "fast" and "indirect" are defined to NULL, which breaks some programs.

- AASC.LIB aascPeek() function is not reentrant.

- Problem writing to second flash on the LP3100.

- AASC.LIB aascClose() may corrupt _channel linked list.

- float to long type cast does not appear to work correctly if the MSBs of the mantissa are dominated by zeroes.

- ZNPAKFMT.LIB _znInt() function may lose contents of af' registers.

- AASC.LIB aascScanTerm() function is not reentrant.

- No warning is given prior to reaching 10,000 line limit, and source code is lost.

