What is ramtest:
 ramtest is a memory test program for DOS. It is freely distributed under the
 GPL. ramtest uses varying random patterns for memory testing and performs
 "up/up", "up/down", "down/up", "down/down" tests. So it also detect unusual
 errors.

Requirements:
 ramtest do not run in virtual mode. It needs the DOS real mode.

Contact: 
 email: stefan.ziegenbalg@mailbox.tu-dresden.de
 www: http://www.simg.de


Usage: 
 ramtest <start> <stop> [report file [outer loop [inner loop [blocksize]]]]
   start        where to start im MB
   stop         where to stop MB (last byte tested is stop*1M-1)
   report file  there errors are reported
   outer loop   number of outer loops (see below)
   inner loop   number of inner loops (see below)
   blocksize    size of block tested in inner loop (see below)

Example:
   ramtest 11MB 128MB null 16 16 4
       -test the memory from 11MB to 128MB in 4MB blocks
       -16 outer loops, 16 inner loops

default values:
   report file  nul
   outer loop   4
   inner loop   2
   blocksize    stop-start

Warning: This program destroys the data in the testet segments.
         Find out how much memory is used before running it!
         Be carfully with smartdrv or other disk cache programs!
         Its save to disable it.

Hint: You should disable the memory caches before use.
      Or set block size to stop-start

How it works:

  (in something like pascal)

 procedure test(a);
  begin
  b:=random2;
  c1:=memory[a] xor b;
  c2:=memory[a] xor b;
  c3:=memory[a] xor b;
  if c1<>c2 or c1<>c3 then
         write('memory error (r/(w)) at', a, '(xor: ', c1, c2,... )
                        // means read error and maybe write error
     else
     if c1<>b then
         write('memory error (w) at', a, '(xor: ', c1, c2, ...);
                        // means write error
  // detection whether (w) / (r/(w)) works only if cache(s) is/are disabled
  end;

 begin
 randomize1(0);                     // 2 independend random
 randomize2(0);                     // number generators
 for i:=1 to outer loop do
  begin
  bt:=start;
  repeat
   et:=bt+blocksize;
   if et>stop then et:=stop;

   for j:=1 to inner loop do               // "up test"
    begin
    for k:=0 to blocksize*1M-1 do
     memory[et*1M+k]:=random1;
    for k:=0 to blocksize*1M-1 do
     test(et*1M+k);
    end;

   for j:=1 to inner loop do               // "down test"
    begin
    for k:=blocksize*1M-1 downto 0 do
     memory[et*1M+k]:=random1;
    for k:=blocksize*1M-1 downto 0 do
     test(et*1M+k);
    end;

   for j:=1 to inner loop do               // "up/down test"
    begin
    for k:=0 to blocksize*1M-1 do
     memory[et*1M+k]:=random1;
    for k:=blocksize*1M-1 downto 0 do
     test(et*1M+k);
    end;

   for j:=1 to inner loop do               // "down/up test"
    begin
    for k:=blocksize*1M-1 downto 0 do
     memory[et*1M+k]:=random1;
    for k:=0 to blocksize*1M-1 do
     test(et*1M+k);
    end;

   bt:=et+1;
   until bt>stop;
  end.

!!!!! Use this programm at the risk of your own !!!!!

spelling mistakes, bugs or ideas: stefan.ziegenbalg@mailbox.tu-dresden.de
www: http://www.simg.de

Thanks to Rogier Wolff who gave me a lot of valuable tips.

