v3.6.12.0 Exit cleanly on crash. v3.6.11.0 Improve dead loop removal v3.6.10.1 Fix issue with LAS, LAC and LAT v3.6.10.0 Fix issue with constant referance to string (or other named object). v3.6.9.1 Fix issue with loops within loops and intervening pointer operations v3.6.9.0 Fix issues with 64 bit constants > 07FFFFFFFFFFFFFFFh v3.6.8.2 Enhance special debug mode to make it less confusing v3.6.8.1 Bug fix Rare issue with skip could casue problems v3.6.8.0 Bug fix (could loop infinitely). Some small improvements to optimisation. v3.6.7.2 Improvements to register detection v3.6.7.0 Fix space saving analysis by function v3.6.6.0 Bug fix - only does one iteration! v3.6.5.0 Bug fix for memory offset calculations in some cases. v3.6.4.0 Improve unexpected error handling; Fix bug in hand crafted assembler. v3.6.3.0 Bug fix with Word handling v3.6.2.0 Bug fix - skipped line problem v3.6.1.0 Bug fix - incorrect optimisation of SBI/SBCI v3.6.0.0 Reintroduce and extend Funstional Analysis system (.FAS files) Fix issue of jmp optimisation in bootloaders etc. v3.5.12.0 Bug fix - incorrect operation of .OPTI NO_CHECK_RET_REGS v3.5.11.0 Bug fix where a POP services two or more PUSHes and no JMP or call exists between first PUSH and POP pair v3.5.10.1 Bug fix in special debug mode. v3.5.10.0 Bug fix crash when '%.' used in assembly lines. v3.5.9.0 Improved handling of flags v3.5.8.4 Minor Bug fixes v3.5.8.2 Bug fix - Check if frame value changes between successive loads v3.5.8.1 Bug in evaluating when register address loaded into pointer register v3.5.8.0 Minor speed improvement Bug fix when e.g. ROR follows LSR v3.5.7.3 Bug fix for issue with SBIW and ADIW v3.5.7.2 Bug fix for issue with SBC, ADC and SBCI. v3.5.7.1 Allow invalid syntax of terminating ',' in hand crafted assembler, because native Assembler program allows it. v3.5.7.0 Bug fix for interrupt optimisations wher asm has multiple RET or RETI statements. v3.5.6.0 Speed improvement v3.5.5.3 Bug fix for 'Tiny' processors with Interrupt optimisations v3.5.5.2 Further general improvements, particularly to MOV and MOVW optimisations. v3.5.5.1 Reversed a change which introduced an issue v3.5.5.0 Improvements to unused register assignmments and MOV, MOVW optimisations v3.5.4.2 Bug fix to MOV optimisation v3.5.4.1 Bug fix for LDS/STS v3.5.4.0 Improvements to interrupt register optimisation v3.5.3.13 bug fix in LDS/STS optimisation v3.5.3.12 Bug fix in boundry case for branch optimisation v3.5.3.11 Bug fix to local variable optimisation v3.5.3.10 Bug fix and improvements to complex conditional optimisations v3.5.3.8,9 Bug with mul optimisation v3.5.3.7 Bug - risk of error in register calculation when two pointers access the same location on stack v3.5.3.6 Loop bug fix v3.5.3.5 Support register variables in interrupts v3.5.3.4 Bug Fix v3.5.3.3 Speed improvement Local Var optimisation improvement v3.5.3.2 Bug Fix. Speed Improvement v3.5.3.1 Enhancement so that if EICALL, ICALL, EIJMP or IJMP are used in an interrupt routine, only those registers used somewhere in the program are saved/restored v3.5.3.0 New Interrupt PUSH/POP autocorrection feature Turn off with {$OPTI NO_OPTI_INTERRUPT_REGS} Auto corrects register saving and restoring in interrupt routines, so any register needed will be saved/restored. Any saving of registers not needed is removed. v3.5.2.1 Further Interrupt routine optimization v3.5.2.0 Further Interrupt routine optimisation v3.5.1.0 Bug Fix v3.5.0.0 New feature is added for interrupt routines. If this is used the optimiser will save and restore all registers used in the routine, and, if necessary, remove associated SaveAllRegs and RestoreAllRegs calls. Although it can be used as an optimisation, its can also be used to save you the worry of working out which registers need to be saved and restored in an interrupt routine. When used this way it is a tool, not an optimisation. v3.4.8.2 Bug Fix or LD/ST optimisation v3.4.8.1 Improvement to Optimise Boolean v3.4.8.0 Optimise Boolean v3.4.7.0 Optimise some LD/ST lines with LDS/STS. Use {$OPTI NO_OPT_LDS_STS} to disable this optimisation v3.4.6.0 Remove overoptimisation bug with certain forms of SetBit. v3.4.5.0 Bug fix with SBCI and TST v3.4.4.2 Bug fix to prevent potential infinite loop v3.4.4.1 Bug fix for hand coded assembler statements that do not conform to AVRCo norms. v3.4.4.0 Improvements to TST optimisation v3.4.3.9 Further speed enhancement - now up to 5 times faster than v3.4.2.2 for full optimisation v3.4.3.8 A number of speed enhancements to approximately double speed of optimisation. v3.4.2.2 Bug fix to allow for use of _ACCA before definition v3.4.2.0 Bug Fix in calculating address values. v3.4.0.0 Bug fix for IN/OUT assembler lines. v3.3.0.5 Recompiled in Delphi 2009 for speed. v3.3.0.4 Bug fix in Opti_Quick. Normal optimisation was not affected v3.3.0.3 Remove entries from unused variables warning file if function removed by optimiser. v3.2.12.0 Bug Fix: Boundary problem with loops v3.2.11.0 Bug Fix. Interpretted lines like BRNE xxx: as a label (because of the trailing :). Now checks if there is a space as well, since spaces are not allowed in labels. v3.2.10.0 New flags added to second parameter on calling. -h means hidden - normal screen does not show, and can also be added to the other possible parameters, so -sh means SmartLink with hidden screen and -qh means quick optimise with hidden screen v3.2.9.0 Bug fix. v3.2.8.0 Additional support for 'BREAK' instruction v3.2.7.0 Another similar issue to v3.2.6.0 v3.2.6.0 Bug fix for bug introduced in recent update v3.2.5.0 Bug fix to handle 64 bit constants in asm source Bug fix to remove potential overoptimising stack changes when FRAME is copied to another register. Enhanced optimisation (size and speed) for indirect use of frame variables New optimisation to remove redundant frame operations when using frame as local stack (disabled by {$OPTI NO_CHECK_REDUNDANT_FRAME_LOAD} v3.2.4.0 Bug fix. If routine is called which uses indirect registers and incrementing it is not really possible to know whether a variable is needed or not. On rare occasions this could lead to overoptimisation. v3.2.3.0 Two enhancements: If a call to a non-existant function is made an error is added to the error file and the optimisation is aborted. A new optimisation of loads of addresses, particularly of record members. This can be disabled by inserting {$OPTI NO_OPT_OFFSET_LOADS} anywhere in the source. v3.2.2.8 Minor issue arising from prev changes v3.2.2.7 Bug fix for local variable optimisation, which could fail in some circumstances v3.2.2.5-6 Bug Fix for where CLR xxxx is followed by LDI xxxx, 0 and then by a branch statement. Similarly for SER xxxx and LDI xxxx, $FF and then by a branch statement Also removed weakness where a register points to a register v3.2.2.1-4 Bug fixes for previous enhancements v3.2.2.0 Some improvements to SIM support. Various minor improvements and bug fixes. v3.2.1.20 ADIW accumulation bug fixed v3.2.1.18 Small improvement e.g. in record manipulation Fixed bug when jumping from inside a .PHASE block to outside it. v3.2.1.17 Bug fix v3.2.1.15 A computationally very heavy optimisation that produces very little benefit has been removed. v3.2.1.14 Bug Fix v3.2.1.13 New file created for use with PED listing size improvements and removed functions v3.2.1.12 Fix bug with {$OPTI_QUICK} Add extra parameter which may be -f or -s -f is eqivalent to putting {$OPTI_QUICK} in the source and is restricts optimisation to a single cycle -s is equivalent to putting {$OPTI SMARTLINK_ONLY} in the source. In this case the only optimistion is the removal of unused functions v3.2.1.9-11 Bug Fix v3.2.1.8 New feature added {$OPTI LIST_USER_FUNCTIONS} when lists user function sizes before and after optimisation. v3.2.1.1-7 Bug Fixes v3.2.1.0 Further Improvements in optimisation of local variables. v3.2.0.0 Improvements with loops; improvements in MOVW optimisation. v3.1.1.2 Bug Fix with LSR/ROR combinations where registers are not same v3.1.1.2 Bug fix - some conditional tests could be wrongly removed. v3.1.1.1 Bug Fix. v3.1.1.0 Support for DEBUG_BREAK added. If a DEBUG_BREAK is detected the optimisation that delays the save of a register is disabled so that the inspection of a location gives the expected value. This is aimed to aid debugging of a program when using an ICE. Normal optimisation is restored when the DEBUG_BREAK line is removed. This can be disabled by adding the line {$OPTI IGNORE_BREAK} at any point in the program A few other small improvements also. v3.1.0.1 Improvements added for XMEGA v3.1.0.0 XMEGA support added for LAS LAC LAT XCH v3.0.16.0 Added support for binary numbers (e.g. ldi 10000b, 55h now works as ldi 16, 55h would have done) v3.0.15.0 Bug fix. Volatility of DDRx was incorrect. (Was marked as non-volatile - should be volatile). v3.0.14.1 Add $OPTI options to control volatility handling variable lists can be surrounded by {$OPTI VOLATILE_xxx} {$OPTI_VOLATILE_DFT} blocks to control variable volatility handling {$OPTI VOLATILE_ON} means following varibles are treated as volatile. {$OPTI VOLATILE_OFF} means following variable are treated as non-volatile {$OPTI VOLATILE_DFT} means following variables use default states If using these statements ALWAYS terminate with {$OPTI VOLATILE_DFT}. If you fail to do this a warning will be issued. v3.0.14.0 Make external memory volatile to deal safely with memory mapped devices. v3.0.13.1 Further bug fixes with large frames v3.0.13.0 Bug fix with frame displacements > 255 bytes within loops. v3.0.12.0 Improve optimiser to handle empty files and illegal MOV statements Bug Fix in loop optimisation Improve Loop Optimisation v3.0.11.0 Bug Fix - loop optimisation for large frames v3.0.10.0 Bug Fix - variation of v3.0.6.9 v3.0.9.2 2nd bug fix for loading addresses of registers (second case) - see also v 3.0.9.0. v3.0.9.1 Bug fix - Evaluation of register usage in subroutines can on rare occasions be incorrect v3.0.9.0 Bug fix for loading of addresses of registers v3.0.8.0 Support added for new error files. v3.0.7.0 Bug Fix. Unreachable JMP within loop can cause problems if prev JMP exits loop. v3.0.6.15 Bug Fix where stack is popped from a different register (i.e. corresponding push is not a the stack register). v3.0.6.14 In routines with jump to reboot (or other fixed label) OptimiseCSE could point to a line that is later removed as part of unused function Also improves optimisation slightly. v3.0.6.12 Bug Fix COM following Skip lines incorrectly optimised Regain remaining optimisations removed by previous bug fix. v3.0.6.11 Regain some of optimisations lost by previous bug fixes v3.0.6.10 Bug Fix - Skip followed by assignment can cause over-optimisation v3.0.6.9 Bug fix - occasional misidentification of redundant lines. v3.0.6.8 Bug fix (of bug introduced by previous version) v3.0.6.7 Bug fix - Branch optimisation bug - CSE optimisation bug v3.0.6.6 Bug fix - PUSH/POP issue in interrupt routines v3.0.6.5 Bug Fix - large frames inside a loop. v3.0.6.2 Bug fix where diverse paths can result in different usage of registers v3.0.6.1 Simulator support extended to handle .DEB statements correctly. v3.0.6.0 Tests have shown that allowing umlauts cases a 5-60 times slowing of optimisation so removed. Also removed code island removal as this produces very liitle gain but is expensive on resources. v3.0.5.5 Bug fix - could generate improper LDD function with Z register. v3.0.5.4 Bug fix - fix v3.0.4.5 (see below) did not cover all cases. This is an extension to this fix. v3.0.5.3 Bug Fix. Conditional skip of load could be missed, so causing incorrect optimisation v3.0.5.2 Fix issue with some drivers that save and restore registers but do not use the {$OPTI NO_CHECK_RETURN_REGS} flag If there are any ASM lines in the routine an implied {$OPTI NO_CHECK_RETURN_FLAGS} is applied to the function. v3.0.5.1 Bug fix - Jmp to tight loop caused optimiser to never complete. v3.0.5.0 New directive {$OPTI SMARTLINK_ONLY} added that behaves similarly to the original linker option SMARTLINK. WARNING - this optimisation is normally performed anyway. The effect of this directive is to DISABLE all other optimisations! v3.0.4.6 Resolve Locale issue where umlauts and similar are used in function names v3.0.4.5 Bug Fix when two pointers point to same location.