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 COUNTHEAPLENGTH 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.