---------------------------------------------------------------------------- The history of Spo ---------------------------------------------------------------------------- Jan-Feb 1993 : Version 1,00 All the basic stuff, but crude interface. Feb 5, 1993 : Wrote some documentation. Version 1,00 released to Internet via Garbo. Feb 18, 1993 : Version 1,01 introduced. Added detection for units compiled by older versions of TP. These caused a garbled error message. Also added detection for files that are not units. Added check for unit larger than 64K which is not handled by Spo. These caused run time errors. I wasn't even aware of the possibility. [I guess I have been pointing out too many bugs in other products...] Added setting of {$G+} flag when target>=186. Reduced memory requirements slightly. Updated the documentation with a list of errors and warnings with their causes. Added "/A" option to specify the assembler to use; useful for Tasmx.Exe only. Feb 23, 1993 : Added list of optimizations to the documentation. Feb 25, 1993 : Fixed some bugs in the regular expression search engine. These bugs should not have been noticed by users of Spo. Added some string optimizations. Command line parsing improved. Among other things, the switch char (normally '/') returned by Dos is now respected. Feb 26, 1993 : Procedures and segments are now aligned according to processor. Mar 1, 1993 : Fixed bug in analysis; it didn't follow Loop instructions. Changed processor directive from "P386N" to "P386" to allow inlined protected instructions. Fixed overflow bug that sometimes caused strange assembly errors and even memory overwrites. Mar 2, 1993 : Fixed bug that caused spilling of file handles as more and more units were optimized. Error message "The unit does not use itself!" changed to warning. It seems as if a unit is reported as using another if and if only some fixup depends on that unit. Improved the capacity significantly by compacting the data section by a factor of approximately 7. Mar 6, 1993 : Version 1,10 introduced. Mar 7, 1993 : Made changes to allow Spo itself to run in protected mode. Mar 8, 1993 : Changed "Int_0405" to work in protected mode also. Fixed a bug that caused incorrect code when emulated 8087-instructions used segment override. Fixed a bug in the above mentioned compaction of the data segment. Mar 9, 1993 : Efficient Shr/Shl for longints on 86/186/286. Improved ZUnion, ZDifference, ZIntersect, and ZEqual. Improved 186->86 conversion. Allowed "/T" on its own to specify the processor on which Spo is running. Mar 11, 1993 : Broke the 32 bit barrier for the assembly buffer (DPMI version, 386+ only). Put macros for Op32/Addr32/Pushd/Fnsetpm in the start of all assembler files. Wrote units Need_186, Need_286, and Need_386 to check for processor at run time. Mar 12, 1993 : Improved some for-loops guaranteed to execute either at least once or never. Mar 13, 1993 : Added clearing of {$G+} flag when target is 8086 and no errors were detected. Added "/Cx" option to specify target platform. Implemented searching for units for dos protected mode or Windows. Added the system tables for dos protected mode. Had my first game of optimized TvChess. Lost. Increased the starting size of the assembly buffer to 32K for Spo386. Mar 14, 1993 : Found very ugly bug in procedure alignment. Affected all Cpu targets except 486. (I'm glad that didn't make it to the internet!) Corrected the FLn replacement under "/NH". Mar 15, 1993 : Bug in "LongShl 8" found and corrected; misspelling. Jan 5, 1994 : Target is set to 286 for non-dos targets if no higher target is specified. Added some hooks for OS/2 units. Minor optimization: don't set Al after addtion etc. Updated docs. Significantly improved the annotation of call statements with procedure names. Some cache may be benefical when this code is used. Annotation no longer inhibits any optimization since they are now added at a later stage. Improved Need_186 and Need_286 by making them a no-op user non-dos platforms. Tables for Windows & OS/2 entered. These targets enabled. Jan 6, 1994 : Fixed a bug that caused bad results for longint multiplication and division is some rare cases. (It was found because some already faulty code didn't do what it was supposed to!) Jan 11, 1994 : Target defaults to 8086 (Real), 286 (Prot.+Windows), and 386 (OS/2). Target cannot be set lower then default. Attempts are silently ignored. The entry point of procedures are annotated with the name of the function, if that is in the interface.