home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 96 / af096sub.adf / memflip.LZX / MemFlipTest / MemTest.mod < prev    next >
Text File  |  1983-01-28  |  4KB  |  151 lines

  1. |##########|
  2. |#MAGIC   #|ELNAGHGG
  3. |#PROJECT #|"MemTest"
  4. |#PATHS   #|"StdProject"
  5. |#FLAGS   #|xx---x--xxx---x-x---------------
  6. |#USERSW  #|--------------------------------
  7. |#USERMASK#|--------------------------------
  8. |#SWITCHES#|x----x----------
  9. |##########|
  10. MODULE MemTest;
  11.  
  12. FROM System      IMPORT LONGSET, SysStringPtr;
  13.  
  14. VAR
  15.   wrong : ARRAY [32] OF RECORD
  16.                           adr  : ANYPTR;
  17.                           mask : LONGSET;
  18.                         END;
  19.   n, curWrong : CARDINAL := 0;
  20.   delay       : LONGCARD;
  21.  
  22. PROCEDURE BusyWait;
  23. BEGIN
  24.   WITH LONGINT AS l DO
  25.     FOR l := 0 TO delay DO END
  26.   END;
  27. END BusyWait;
  28.  
  29. $$NilChk      := FALSE
  30. $$RangeChk    := FALSE
  31. $$OverflowChk := FALSE
  32. PROCEDURE TestMemRange (start : ANYPTR; size : LONGCARD);
  33. VAR
  34.   checkSum  : ARRAY [32] OF LONGCARD;
  35.   checkTest : LONGCARD;
  36.   blockSize : LONGCARD;
  37.   ptr, end, block,
  38.   blockEnd  : POINTER TO LONGINT;
  39.   chks      : SHORTCARD;
  40.  
  41. BEGIN
  42.   blockSize := size SHR 6;
  43.   blockSize := blockSize SHL 2; | divisible by 4
  44.   IF blockSize<4 THEN blockSize:=4 END;
  45.   end := start; INC (end, size);
  46.  
  47.   chks := 0;
  48.   ptr  := start;
  49.   blockEnd := start;
  50.   WHILE ptr < end DO
  51.     INC (blockEnd, blockSize);
  52.     IF blockEnd > end THEN blockEnd := end END;
  53.     checkSum[chks] := 0;
  54.  
  55.     WITH ptr, blockEnd, checkSum[chks] AS checkSum DO
  56.       WHILE ptr < blockEnd DO
  57.         INC (checkSum, ptr^);
  58.         ASSEMBLE (not.l ptr+^);
  59.       END;
  60.     END;
  61.  
  62.     INC (chks);
  63.   END;
  64.  
  65.   BusyWait;
  66.  
  67.   chks := 0;
  68.   ptr  := start;
  69.   blockEnd := start;
  70.   WHILE ptr < end DO
  71.     INC (blockEnd, blockSize);
  72.     IF blockEnd > end THEN blockEnd := end END;
  73.     block := ptr;
  74.     checkTest := 0;
  75.  
  76.     WITH ptr, blockEnd, checkTest DO
  77.       WHILE ptr < blockEnd DO
  78.         ASSEMBLE (not.l ptr^);
  79.         INC (checkTest, ptr+^);
  80.       END;
  81.     END;
  82.  
  83.     IF checkTest#checkSum[chks]
  84.       AND_IF blockSize<=4 THEN
  85.         wrong[curWrong].adr  := block;
  86.         wrong[curWrong].mask := CAST (LONGSET, checkTest) / CAST (LONGSET, checkSum[chks]);
  87.         INC (curWrong);
  88.       ELSE
  89.         BusyWait;
  90.         TestMemRange (block, LONGINT(blockEnd)-LONGINT(block));
  91.       END
  92.     END;
  93.     INC (chks);
  94.   END;
  95.  
  96. END TestMemRange;
  97. $$NilChk      := OLD
  98. $$RangeChk    := OLD
  99. $$OverflowChk := OLD
  100.  
  101. FROM InOut       IMPORT WriteGrp;
  102. FROM Dos         IMPORT DosArgGrp, PrintFault, IoErr;
  103. FROM Exec        IMPORT Disable, Enable, LONGPTR;
  104. FROM Conversions IMPORT HexStringToInt;
  105. FROM Strings     IMPORT Str;
  106.  
  107. CONST
  108.   Template = "START(hex)/A,SIZE(hex)/A,DELAY/N";
  109.   defaultDelay = ARRAY OF LONGCARD : (1000000);
  110.  
  111. TYPE
  112.   ArgRec = RECORD start, size : SysStringPtr; delay : POINTER TO LONGCARD END;
  113.  
  114. VAR
  115.   start : ANYPTR;
  116.   size  : LONGCARD;
  117.   RD    : RDArgsPtr := NIL;
  118.   args  := ArgRec : ("0"*, "100000", defaultDelay[0]'PTR);
  119.  
  120. TYPE MaskArray = ARRAY [4] OF SHORTCARD;
  121. BEGIN
  122.   RD := ReadArgs (Template, args'PTR, NIL);
  123.   IF # THEN
  124.     start := HexStringToInt (Str (args.start));
  125.     size  := HexStringToInt (Str (args.size));
  126.     delay := args.delay^;
  127.  
  128.     Disable ();
  129.     TestMemRange (start, size);
  130.     Enable ();
  131.  
  132.     IF curWrong=0 THEN
  133.       WriteString ("Everything seems to be ok."+&10);
  134.     ELSE
  135.       WriteString ("Following longwords have faulty bits (represented by 1's):"+&10);
  136.       FOR n:=0 TO curWrong-1 DO
  137.         WriteHex (wrong[n].adr, 8);
  138.         WriteString ("  bits: ");
  139.         WriteCardBin (CAST (MaskArray, wrong[n].mask)[0], 8); WriteChar(".");
  140.         WriteCardBin (CAST (MaskArray, wrong[n].mask)[1], 8); WriteChar(".");
  141.         WriteCardBin (CAST (MaskArray, wrong[n].mask)[2], 8); WriteChar(".");
  142.         WriteCardBin (CAST (MaskArray, wrong[n].mask)[3], 8); WriteLn;
  143.       END;
  144.     END;
  145.   ELSE
  146.     FORGET PrintFault (IoErr(), NIL);
  147.   END;
  148. CLOSE
  149.   IF RD#NIL THEN FreeArgs (RD) END;
  150. END MemTest.
  151.