home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format 96
/
af096sub.adf
/
memflip.LZX
/
MemFlipTest
/
MemTest.mod
< prev
next >
Wrap
Text File
|
1983-01-28
|
4KB
|
151 lines
|##########|
|#MAGIC #|ELNAGHGG
|#PROJECT #|"MemTest"
|#PATHS #|"StdProject"
|#FLAGS #|xx---x--xxx---x-x---------------
|#USERSW #|--------------------------------
|#USERMASK#|--------------------------------
|#SWITCHES#|x----x----------
|##########|
MODULE MemTest;
FROM System IMPORT LONGSET, SysStringPtr;
VAR
wrong : ARRAY [32] OF RECORD
adr : ANYPTR;
mask : LONGSET;
END;
n, curWrong : CARDINAL := 0;
delay : LONGCARD;
PROCEDURE BusyWait;
BEGIN
WITH LONGINT AS l DO
FOR l := 0 TO delay DO END
END;
END BusyWait;
$$NilChk := FALSE
$$RangeChk := FALSE
$$OverflowChk := FALSE
PROCEDURE TestMemRange (start : ANYPTR; size : LONGCARD);
VAR
checkSum : ARRAY [32] OF LONGCARD;
checkTest : LONGCARD;
blockSize : LONGCARD;
ptr, end, block,
blockEnd : POINTER TO LONGINT;
chks : SHORTCARD;
BEGIN
blockSize := size SHR 6;
blockSize := blockSize SHL 2; | divisible by 4
IF blockSize<4 THEN blockSize:=4 END;
end := start; INC (end, size);
chks := 0;
ptr := start;
blockEnd := start;
WHILE ptr < end DO
INC (blockEnd, blockSize);
IF blockEnd > end THEN blockEnd := end END;
checkSum[chks] := 0;
WITH ptr, blockEnd, checkSum[chks] AS checkSum DO
WHILE ptr < blockEnd DO
INC (checkSum, ptr^);
ASSEMBLE (not.l ptr+^);
END;
END;
INC (chks);
END;
BusyWait;
chks := 0;
ptr := start;
blockEnd := start;
WHILE ptr < end DO
INC (blockEnd, blockSize);
IF blockEnd > end THEN blockEnd := end END;
block := ptr;
checkTest := 0;
WITH ptr, blockEnd, checkTest DO
WHILE ptr < blockEnd DO
ASSEMBLE (not.l ptr^);
INC (checkTest, ptr+^);
END;
END;
IF checkTest#checkSum[chks]
AND_IF blockSize<=4 THEN
wrong[curWrong].adr := block;
wrong[curWrong].mask := CAST (LONGSET, checkTest) / CAST (LONGSET, checkSum[chks]);
INC (curWrong);
ELSE
BusyWait;
TestMemRange (block, LONGINT(blockEnd)-LONGINT(block));
END
END;
INC (chks);
END;
END TestMemRange;
$$NilChk := OLD
$$RangeChk := OLD
$$OverflowChk := OLD
FROM InOut IMPORT WriteGrp;
FROM Dos IMPORT DosArgGrp, PrintFault, IoErr;
FROM Exec IMPORT Disable, Enable, LONGPTR;
FROM Conversions IMPORT HexStringToInt;
FROM Strings IMPORT Str;
CONST
Template = "START(hex)/A,SIZE(hex)/A,DELAY/N";
defaultDelay = ARRAY OF LONGCARD : (1000000);
TYPE
ArgRec = RECORD start, size : SysStringPtr; delay : POINTER TO LONGCARD END;
VAR
start : ANYPTR;
size : LONGCARD;
RD : RDArgsPtr := NIL;
args := ArgRec : ("0"*, "100000", defaultDelay[0]'PTR);
TYPE MaskArray = ARRAY [4] OF SHORTCARD;
BEGIN
RD := ReadArgs (Template, args'PTR, NIL);
IF # THEN
start := HexStringToInt (Str (args.start));
size := HexStringToInt (Str (args.size));
delay := args.delay^;
Disable ();
TestMemRange (start, size);
Enable ();
IF curWrong=0 THEN
WriteString ("Everything seems to be ok."+&10);
ELSE
WriteString ("Following longwords have faulty bits (represented by 1's):"+&10);
FOR n:=0 TO curWrong-1 DO
WriteHex (wrong[n].adr, 8);
WriteString (" bits: ");
WriteCardBin (CAST (MaskArray, wrong[n].mask)[0], 8); WriteChar(".");
WriteCardBin (CAST (MaskArray, wrong[n].mask)[1], 8); WriteChar(".");
WriteCardBin (CAST (MaskArray, wrong[n].mask)[2], 8); WriteChar(".");
WriteCardBin (CAST (MaskArray, wrong[n].mask)[3], 8); WriteLn;
END;
END;
ELSE
FORGET PrintFault (IoErr(), NIL);
END;
CLOSE
IF RD#NIL THEN FreeArgs (RD) END;
END MemTest.