v1.0: Released 8 March 1997.

v1.1: Released 11 March 1997.
        Added options 'V', 'M', 'P', 'Z'
        Cleaned up the code
        Updated docs and some misc stuff

v1.2: Released 13 March 1997.
        Removed int 3's I forgot to remove before compiling :)
        Updated docs
        Uses integer calc if no FPU available
        Added check for too small TESTFILE.Q32
        Improved timer routine

v1.3: Released 24 March 1997.
        Added test size check (must be <4GB)
        Error level 1 means 'Compare failed'
        80x25 mode isn't restored before comparing when 'V' used
        ('!' is displayed if numbers are not in order in video mem)

v1.4: Released 16 April 1997
        The data is verified before quick sorting it
        TSC supported for more precise timings (most 586+-family CPU's have it)
        Shows info about CPU if CPUID is available
        Little speedup (2%) :) (at least with Cyrix 6x86)
        Shows current privilege level (CPL)
        Shows amount of Memory IO of total execution time and MIPS-value
        Modified docs

v1.5: Released 5 May 1997
        Added support for Pentium Pro CPUs for option 'C' (use 'X')
        Added CPU, FPU and memory benchmarking program, Safbench

v2.0: Released 23 May 1997
        Modified Safbench's memory speed tests, now gives better results
         because of simplifications and more loop unrolling
        Safbench tests 4 MB moves.. ;)
        Timing routine enhanced in Qsort, now grabs the interrupt vector
         and performs timings on it's own: more stabile results and less
         overhead when a timer interrupt occurs (means: better results)
        Added VBE 2.0+ linear framebuffer mode speed test (write and copy),
         it tests every supported mode which has LFB support and also
         displays Hz-rate in that particular mode (option 'V')
        Enhanced Safbench.TXT

v2.01: Released 26 May 1997
        VESA mode info stuff in Safbench corrected, now uses 32bit pointer
         to search the supported video modes (with S3VBE20 everything worked
         OK, but not with UniVbe, because it puts the video modes in different
         segment than current ES :) Sorry!)
        Option 'W' in Qsort32 waits one second before starting the sort
         (Actually this was in v2.0)

v2.10: Released Friday the 13th!!! June 1997
        Since now, S: means changes in Safbench and Q: in Qsort32

     S: Added Pentium II and AMD K6 test results (Thanks, Teppo Oranne!)
         (I still need 'qsort32 1000' and 'safbench m' results for 'em!)
     S: Displays BUS speed (MHz), multiplier, MHz-rate of your CPU and main
         mem read/write speed (option 'B' for Pentiums and 'P' for PPros and
         compatibles) (Thanks, Joni Moilanen, for testing 'B'!)
     S: Move speed tests (seq. and reverse) modified, now it first moves
         from the beginning of the buffer to the middle of the buffer, then
         from the middle of the buffer to the beginning of the buffer. Why?
         Because half of the data would not be read otherwise, only written
         to. And only half of the data written to...
     S: In mem speed tests, data is read/written/moved TWICE before the REAL
         testing begins to flush caches better (or something). This gives
         better seq. read speeds for Cyrix 6x86 CPUs with block size of 16
         kB (yep, caching IS strange sometimes...)
     S: Added option 'F', uses FPU to copy/write data in 64bit chunks.
         Use with Pentiums (or any processor which doesn't support write
         gathering/combining and has (quite) fast FPU).
         Might also improve copy speeds in video test.
     S: Corrected Cyrix 6x86 results (something changed in v2.0 :) )
     S: Corrected Pentium results. Actually, I'd like to receive results
        also for Pentium Pro and Intel 486 processors ('Safbench > res.txt')
     S: You can specify video mode with F:xxxx or V:xxxx, where xxxx is
         a hexadecimal number between 0 and FFFF (for example V:105, F:221).
     S: 'I' shows VESA version, modes and info, PCI version and video mem size
     S: 'S' displays every testable VESA mode
     S: 'W' waits one second after mode set (in previous versions there was
        ALWAYS that delay)
     S: For option 'M', avg. speed is displayed (for some reason, I left
        it out in Safbench v1.2 ;) )
     Q: MHz-rate can be specified with 'T' (usage: T:200, T=150, T=233.333)
        Max three decimals can be specified (T:166.666, T=187.5 etc)
     Q: Uses event 62h to calculate BUS-utilization for option 'X'.
         It's "External Bus Cycles - DRDY Asserted (busy)"
     S: Memory speed test accessing is now 64bit (qword) -aligned
     -: CHKMD5.BAT tests MD5-sums (MD5SUM-program needed)
     -: MAKERES.BAT, MAKERES1.BAT (for Pentiums), MAKERES2.BAT (for PPros)
        These batches make RESULTS.$ file

v2.11: Released 24 June 1997
     S: 'C' checks L2 cache speed and cycle stuffs (use _WITH_ 'B' or 'P'!)

v2.12: Released 4 July 1997
     S: 266.666666 MHz assumed instead of 266.0 MHz for option '5'
         and 33.333333 instead of 33.0 for option '1'
   S+Q: Added new K6 and M1 results (Thanks, Olli Maksimainen!)
   S+Q: Uses Windows' 'Begin critical section' and 'End critical section'
         to get better timings (it prevents task switch from occurring)
         *** UNDER MULTITASKING SYSTEMS TIMING IS STILL INACCURATE! ***
   S+Q: Sets up Application title in Windows95
     S: 'M' now tests also Random accessing
     S: 'R' tests ONLY Random accessing (needs 8200 kB)
     S: Added results for Random accessing and some Video speed values
     -: Added ADSON.COM and ADSOFF.COM (see ADS.TXT)

v2.13: Released 6 July 1997
     S: Version numbering for Safbench follows Qsort32
     S: Modified Mixed test in Random accessing, now it is more complete
         Also, in previous version, the reported result for Mixed test
         was 20% too high
     S: '!' tests 31 different block sizes for Random accessing (default:13)
         Use with 'M' or 'R'
   S+Q: Added more K6 and M1 results


...One month pause in programming because my shitty MG mobo blew up...
..... Damn, overclocked 6x86 120 MHz v2.6 heated it too much :) ......


v2.15: Released 5 October 1997
     S: Added Overclocking test, which verifies that your computer works
         correctly, option 'O'. 'O:60' tests each block size for 60 secs
         (default is 15 seconds), option 'O:900' consumes totally 8h
         for all the 32 tests. 'O:M' tests max mem size forever.
     S: Tests how well Pentium-optimized FPU-code performs on your FPU
         compared to 486-optimized FPU-code (along with the other 8 tests)
         386 and K6 results not YET available, wait a bit...
     S: DOS time/date is restored from real time clock
         (use REALTIME.COM to restore them after running Qsort32 or
         any program which screws up DOS time)
     -: Added disk write/read test, see HDTEST.TXT
   S+Q: No 'Critical section' win-stuffs anymore (so you can use p5mon
         or something while running the progs)
     S: Corrected 486 results

v2.16: Released 9 October 1997
     S: Saves correct nr of lines to OCTest.$$$ etc
     S: Tweaked 386 results
     S: OCTest now displays progress status of part [5] (the main memory
         accessing/manipulation routine) and Speed index for parts 3-9
         compared to Cyrix 6x86-P150+ (it scored 100.000 at blk size 1 kB).
         Type 'Safbench O:M' under Win95 to see how SL0W Win95 can be!
         % completed is updated 18.2 times/s, Speed index at max 18.2
         times/s (the bigger the index number, the faster the CPU).
         The index is not perfectly stable, because the accessed data is very
         random every loop and jumps etc are executed based on the data
         (the index is average of every loop in the current block size).
     S: Keyb leds now blink only when option 'L' is used because keyboard
         is so slow: at max about 150 led state toggles per second
         (LEDBLINK.COM toggles 'em 1000 times, try it out if you care)
     S: OCTest now accesses memory more randomly and it contains more
         complex branches etc

v2.17: Released 13 October 1997
     S: OCTest displays the number of loops, which differ by more than two
         percents of the average Speed index (Unstabiles). Also, 8254 chip
         is initialized better when OCTest is started, because some games
         put it in a unstable state. Don't kill yourself if you get Unstabiles.
     S: 'C' clears Total loops and Unstabile loops
     S: OCTest modified a bit again :o
     S: Displays only two decimals in Memory speed tests ('M'),
         Reverse test removed, since it's ALMOST the same as Sequential
         (use older version of Safbench if you REALLY want to see them)

v2.18: Released 15 October 1997
     S: In OCTest part [4], now only 4 kB of extra data is initialized,
         prev. versions initialized 16 kB extra. (Now L2 cache is not accessed
         at small test sizes)
     S: Displays amount of time Part 5 takes of total time in OCTest
                                              
v2.19: Released 18 October 1997
     S: In OCTest parts 6-9 extra 1 kB is accessed to achieve a little better
         error detection

v2.20: Released 21 October 1997
     S: More complete FPU test in OCTest, including FPU pipeline and other
         stuffs

v2.21: Released 23 October 1997
     S: More complete FPU test in OCTest, now also runs Fsqrt's along the
         CPU, better FPU/CPU intermixing, uses EVERY possible rounding mode
         and precision (24b,53b,64b).
     S: Before starting to test a block size for the very first time,
         data and code cache is initialized by running some parts in advance
         --> more stabile speed results in the beginning
     S: In OCTest, a bar graph is displayed, which has following meaning:
         the farther the '#' character is from the left side of the screen,
         the farther the elapsed loop time is from the average value
         (one character position means ~.1% error, so 'Unstabiles' means
         how many times the '#' has crossed 20th column)
     S: 'C' clears ALL the stats in OCTest (but not errors), 1...0 advances
         1...10 block sizes.
     S: Speed index is now from 4 kB block size

v2.22: Released 25 October 1997
     S: 'I' sets Speed Index to 100.000 in OCTest, after it following block
         size speeds are relative to it. 'D' inits Index and clears stats
         (the same as pressing 'I' and 'C').

v2.23: Released 30 October 1997
     S: Added Pentium II/266 results
     S: Added a couple of weird jumps to OCTest :)
     S: Added RECIP.COM and RECIP.TXT, see RECIP.TXT (for programmers only)

v2.24: Released 2 November 1997
     S: Option 'Q' behaves just like 'O', but doesn't do Quicksorting
         (with 'Q' CPU heats up a little bit more but OCTest isn't so thorough)
   S+Q: Zip file renamed to QSSB-xxx.ZIP, where xxx is version number
         (QSSB comes from QuickSort and SafBench)
     S: 'S' in OCTest saves memory capture; after initializing random data,
         after accessing it in part [5] and after Quicksorting it. The files
         are saved also for the second loop (so you can compare the files
         to see how much of the data was corrupted if you happen to get errors
         due to overclocking etc). 'S' consumes (block size+~16)*6 (*4 if
         using option 'Q') kB disk space. 'F' saves memory capture of the
         total memory allocation (look at the last block size). SO: if you've
         got 30 MB free memory, 'F' needs 120 or 180 MB disk space. NOTE:
         when 'S' is pressed in block sizes 1-4096 kB, only the accessed data
         is saved, for the last block size also the pointers are saved. 'F'
         saves ALL the allocated memory, no matter what the test size happens
         to be.
         DEB-01a.$$$ is the first loop after initializing,
         DEB-02a.$$$ is the first loop after accessing done in part [5],
         DEB-03a.$$$ is the first loop after Quicksorting it.
         DEB-01b.$$$ is the second loop after initializing,
         DEB-02b.$$$ is the second loop after accessing in part [5],
         DEB-03b.$$$ is the second loop after Quicksorting it.
         DEB-01a.$$$ and DEB-01b.$$$ should be identical etc...
     S: 'M' in OCTest toggles memory move routine on/off after part [5],
         it copies the block size under testing 64 bytes ahead. Default is off.
     S: Busted a bug in OCTest: the CRC32 was calculated only for half of
         the data!

v2.25: Released 6 November 1997
   S+Q: NULLCHK.COM displays number of flipped bits in the case of a read
         error, also shows errors at each bit position (0-31)
     S: OCTest heavily modified: now it doesn't store the random pointers
         in memory --- it makes them "on the fly" during part [5]. Now test
         size '4096' MEANS that it uses 4096 kB of memory, not 4096*2 or
         something like that. Some test sizes seem to be faster than in
         previous versions, but it's because there's no need to write
         the pointers to memory. New test sizes added: 14, 5461, 6827, 8192
         and three sizes between 8192 and max available memory.
     S: Speed index is from 8 kB block size in OCTest...

v2.26: Released 7 November 1997
     S: Move test in OCTest checks the data before AND after the move, so
         you'll notice if there happened an error during the move (look
         for "Move errors")
     S: Removed unnecessary initializing when testing max block size,
         now that size is tested just like the others (except when testing
         for the very first time in parts [1] and [2]: all the allocated
         memory is initialized, in other block sizes only 8192+32 kB)
     S: New stuffs in Safbench.TXT

v2.27: Released 10 November 1997
     S: One more test size (between 8192 and max mem)
     S: Misc tuning in OCTest

v2.28: Released 12 November 1997
     S: Again new stuffs in OCTest
     S: 'Q' key in OCTest saves memory captures till the next error, then
        quits, 'W' saves all the allocated memory till an error (then quits).
     S: Option ',xxx' can be used after 'O:xxx' or 'Q:xxx' to specify how
         many seconds to run OCTest. 'O:60,1200' tests each block size for
         one minute and quits after twenty minutes.

v2.29: Released 21 November 1997
     S: Key 'H' in OCTest toggles HLT-instruction usage during part [5],
         see Safbench.TXT [8.] for more information. Run HALTTEST.COM to
         see if your CPU executes HLT as it should; it displays '.' and '-'
         after every HLT. About 18 chars/s is OK rate (it's the timer
         interrupt). Almost any key quits HALTTEST. Under Windows etc
         HLT might not work as expected, so I suggest you running OCTest
         under clear boot. ENABSUSP.COM causes Cyrix 5x86/6x86(/6x86MX?) CPU
         to enter low power suspend mode when HLT instruction is executed,
         DISASUSP.COM won't let it enter suspend mode... If you use Linux,
         I'd recommend running ENABSUSP.COM before Linux.
     S: MHZ.COM displays CPU speed using RDTSC-instruction, CXMHZ.COM displays
         CPU speed using Cyrix 6x86's cycle counter. Might work on other new
         Cyrix/IBM CPUs. They are very accurate also under Winblows etc.

v2.30: Released 6 December 1997
     S: 'P' displays (more) correct numbers than in previous versions
         for PPros and PIIs (couldn't test it earlier). The results for
         'B' and 'P' are still quite meaningless, even though they give you
         the results from Pentium's performance monitoring counters.
     S: Added two progs, CLRMEM.EXE and SAVEMEM.EXE, read MEM.TXT.
   S+Q: Added EDO results (for you to compare with FPM results :) )

v2.31: Released 15 January 1998
     S: You can change the number of moves done in OCTest by pressing
         F1-F9, F10 sets the move count to 1 (default). F1=10 moves,
         F9=90 moves. 'M' turns moves on/off.
   S+Q: Added Pentium MMX results

     Safbench+Qsort32 are now Hotmailware! If you use them, you must
     send a message (no matter what's in it) to "register_qssb@hotmail.com".
     Hotmailware is just like Freeware, but you have to send an email to
     the address above... If your friends do not have email access, send
     a mail for them, too. (That address is like an usage-counter :) )
     I reply to every email (sfarin@ratol.fi), but if you don't see a reply
     in a sensible amount of time, use sfarin@hotmail.com!



       *****************************************************************
       * Please send me results of your Cyrix 6x86MX!                  *
       * K6 results for Pentium FPU vs 486 FPU speed test needed...    *
       * Use MAKERES1.BAT for Pentium/Pentium MMX/6x86MX, MAKERES2.BAT *
       * for Pentium Pro/Pentium II and MAKERES.BAT for other CPUs!    *
       *****************************************************************

       *****************************************************************
       *   Could someone test AGP video cards ('Safbench F'), thanks.  *
       *   And different motherboards with, let's say, Millenium.      *
       *****************************************************************
