valexey, вот такой код отрабатывает у меня за 2 секунды
MODULE MyTest;
IMPORT SYSTEM, Log;
CONST WORDSIZE = SIZE(INTEGER);
PROCEDURE Do*;
VAR
ints: POINTER TO ARRAY OF INTEGER;
bytes: POINTER TO ARRAY OF INTEGER;
i: INTEGER;
PROCEDURE Get8(pos: INTEGER): INTEGER;
VAR adr, val: INTEGER;
BEGIN
adr := SYSTEM.ADR(bytes^);
ASSERT(pos < LEN(bytes) * WORDSIZE);
SYSTEM.GET(adr + pos, val);
RETURN val MOD 256;
END Get8;
PROCEDURE Put8(pos, val: INTEGER);
VAR adr, int: INTEGER;
BEGIN
adr := SYSTEM.ADR(bytes^);
ASSERT(pos < LEN(bytes) * WORDSIZE);
ASSERT((val >= 0) & (val <= 255));
SYSTEM.GET(adr + pos, int);
SYSTEM.PUT(adr + pos, SYSTEM.VAL(SET, int) - {0..7} + SYSTEM.VAL(SET, val));
END Put8;
PROCEDURE PackToBytes(VAR src: ARRAY OF INTEGER; adr: INTEGER);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(src) - 1 BY 4 DO
SYSTEM.PUT(adr + i, src[i] +
SYSTEM.LSH(src[i+1], 8) +
SYSTEM.LSH(src[i+2], 16) +
SYSTEM.LSH(src[i+3], 24));
END;
END PackToBytes;
BEGIN
NEW(ints, (640 * 480 * 3));
NEW(bytes, (640 * 480 * 3 DIV WORDSIZE));
(*
Put8(0, 0);
Put8(1, 1);
Put8(2, 255);
Put8(3, 200);
*)
ints[0] := 0;
ints[1] := 1;
ints[2] := 255;
ints[3] := 200;
FOR i := 0 TO 1000 DO
PackToBytes(ints, SYSTEM.ADR(bytes^));
END;
Log.Int(Get8(0)); Log.Ln;
Log.Int(Get8(1)); Log.Ln;
Log.Int(Get8(2)); Log.Ln;
Log.Int(Get8(3)); Log.Ln;
END Do;
BEGIN
END MyTest.Do