00100 (*+02() (*$T-*) (*$D+*) (*$W-*) (*$L-*) ()+02*)
00105 PROGRAM COMPARE(F1,F2,INIT(*+02(),OUTPUT()+02*));
00110 CONST SZWORD = (*+12() 2 ()+12*) (*+13() 4 ()+13*);
00112       HOFFSET = (*-02() 4 ()-02*) (*+02() (*+19() 6 ()+19*) (*-19() 8 ()-19*) ()+02*)
00113 (*    HOFFSET IS THE AMOUNT THE HEAP HAS BEEN MOVED UP *)
00120 TYPE ADDRINT = (*-02()INTEGER()-02*)(*+02()LONG()+02*);
00130      LOADFILE = FILE OF ADDRINT;
00140 VAR  F1,F2 : LOADFILE;
00150      INIT : LOADFILE;
00160      GLOBALLENGTH,HEAPSTART,HEAPLENGTH,DUMMY : ADDRINT;
00169 (*-19()
00170 PROCEDURE COPY(LENGTH : ADDRINT);
00180   VAR I,VALUE : INTEGER;
00190       D : RECORD INT,MASK : INTEGER END;
00200       BEGIN
00210       FOR I := 1 TO LENGTH DO
00220         BEGIN
00230         READ(F1,D.INT);
00240         READ(F2,VALUE);
00250         D.MASK := VALUE-D.INT;
00260         IF NOT (D.MASK IN [0,HOFFSET]) THEN  (*VALUE IS PART OF A PACKED RECORD AND TOP BYTE IS NOT USED*)
00270           D.MASK := 0;
00280         IF D.MASK=HOFFSET THEN    (* D.INT IS A POINTER *)
00290           D.INT := D.INT-HEAPSTART;
00300         WRITE(INIT,D.INT,D.MASK)
00310         END
00320       END;
00330 ()-19*)
00350 (*+19()
00360 PROCEDURE COPY(LENGTH : ADDRINT);
00370 VAR
00380     POINTER     : ADDRINT;
00390     LAST1,THIS1,THIS2 : ADDRINT; (*BECAUSE UNINTIALISED HEAP IS -32768*)
00400     DIFF        : INTEGER;
00410     LSW,MSW     : ADDRINT;
00425     COUNT       : ADDRINT;
00000 FUNCTION WORDSREVERSED:BOOLEAN;
00000     TYPE R = RECORD
00000 	    CASE BOOLEAN OF
00000     	TRUE: (X: ADDRINT);
00000     	FALSE: (Y: INTEGER;
00000 	            Z: INTEGER);
00000 	    END;
00000     VAR V: R;
00000     BEGIN
00000     V.X := 1;
00000     WORDSREVERSED := V.Y<>1
00000     END;
00430 BEGIN
00000 IF NOT WORDSREVERSED THEN
00000 BEGIN
00435     COUNT := 1;
00440     WHILE COUNT<=LENGTH DO
00450     BEGIN
00460         READ(F1,THIS1);
00470         READ(F2,THIS2);
00475         COUNT := COUNT+1;
00480         DIFF := ABS(ABS(THIS1)-ABS(THIS2));
00490         IF DIFF IN [2,HOFFSET]  THEN (* LSW OF POINTER *)
00500         BEGIN
00510             LSW := THIS1; (*CONVERT TO 32 BIT NO *)
00520             IF THIS1<0 THEN
00530                 LSW := LSW+65536; (*CONVERT FROM 2'S COMP TO UNSIGNED *)
00540             READ(F1,MSW);
00550             READ(F2,DUMMY);
00555             COUNT := COUNT+1;
00560             POINTER := (MSW*65536)+LSW;
00570             POINTER := POINTER-HEAPSTART; (*MAKE POINTER RELATIVE*)
00580             WRITE(INIT,HOFFSET,POINTER);
00583             IF POINTER>HEAPLENGTH THEN
00585                 WRITELN('WARNING: POINTER OUT OF RANGE',POINTER);
00590         END
00600         ELSE IF DIFF<>0 THEN
00610              BEGIN
00620                  WRITELN('WARNING: UNKNOWN CHANGE IN VALUE',DIFF,' FROM',THIS1,' TO',THIS2);
00630                  WRITE(INIT,0,THIS1)
00640              END
00650              ELSE
00660                  WRITE(INIT,0,THIS1);
00670     END
00680 END
00000 ELSE
00000 BEGIN
00000     COUNT := 0;
00000     READ(F1,THIS1);
00000     READ(F2,THIS2);
00000     COUNT := COUNT+1;
00000     WHILE COUNT<=LENGTH DO
00000     BEGIN
00000         LAST1 := THIS1;
00000         IF COUNT<LENGTH THEN
00000         BEGIN
00000             READ(F1,THIS1);
00000             READ(F2,THIS2);
00000         END;
00000         COUNT := COUNT+1;
00000         IF THIS1=THIS2 THEN
00000             WRITE(INIT,0,LAST1)
00000         ELSE
00000         BEGIN
00000             DIFF := ABS(ABS(THIS1)-ABS(THIS2));
00000             IF DIFF IN [2,HOFFSET] THEN
00000             BEGIN
00000                 LSW := THIS1;
00000                 IF THIS1<0 THEN
00000                     LSW := LSW+65536;
00000                 POINTER := LAST1*65536+LSW-HEAPSTART;
00000                 WRITE(INIT,HOFFSET,POINTER);
00000                 IF POINTER>HEAPLENGTH THEN
00000                     WRITELN('WARNING: POINTER OUT OF RANGE',POINTER);
00000                 IF COUNT<=LENGTH THEN
00000                 BEGIN
00000                     READ(F1,THIS1);
00000                     READ(F2,THIS2);
00000                 END;
00000                 COUNT := COUNT+1;
00000             END
00000             ELSE
00000             BEGIN
00000                 WRITELN('WARNING: UNKNOWN CHANGE IN VALUE',DIFF,' FROM',THIS1,' TO',THIS2);
00000                 WRITE(INIT,0,LAST1)
00000             END
00000         END
00000     END
00000 END;
00675 WRITELN('COPY OF LENGTH',(COUNT-1)*SZWORD); (*IN BYTES*)
00000 END;
00690 ()+19*)
00710 BEGIN(*OF COMPARE*)
00720   RESET(F1); RESET(F2); REWRITE(INIT);
00730   READ(F1,GLOBALLENGTH);WRITE(INIT,GLOBALLENGTH);
00740   READ(F1,HEAPLENGTH);WRITE(INIT,HEAPLENGTH);
00750   READ(F1,HEAPSTART);
00760    READ(F2,DUMMY);READ(F2,DUMMY);READ(F2,DUMMY);
00770   COPY(GLOBALLENGTH DIV SZWORD);
00780   COPY(HEAPLENGTH DIV SZWORD);
00790 END.
