Email from Larry Greene to Steve Ness on 5/04/14: There is a gap in the source listing of ED.PLM. Could you check your binder and see if lines 738 to 748 are missing? --- Email from Steve Ness to Larry Greene and David Laws on 5/04/14: The page you cite does have a gap as you say, but the gap must be in the original, as the scan I made of the page shows a copyright block rubberstamp from lines 736 to 751, including the gap space. Thus, the gap is in the original, not in my scan, too bad. I think the original printout was on fan-folded 14x11 line printer paper, which somebody then cut and pasted into sheets that were duplicated 2-up for the source binder, and they made the error at that time. --- Email from David Laws to Steve Ness and Larry Greene on 5/05/14: Lines 737 to 748 are missing from Steve's ED source hard copy of version 1.3 in my possession. I do have a copy of CPM Version 2.0 from 1978 on loan from Tom Rolander. I found a similar sequence of instructions on page 78 of that document [pdf copy attached]. You will note that line 645 (Declare J address) in version 2.0 corresponds with line 737 in version 1.3. Similarly line 661(Return Match) corresponds with line 749. However the count of lines missing from 1.3 does not match the number of lines showing between the same two instructions in version 2.0. --- Email from Larry Greene to Steve Ness and David Laws on 5/05/14: I did the same thing and was able to compile it and get a byte match to the binary. Here is how I formatted it to cause the line number count to match also: FIND: PROCEDURE(PA,PB) BYTE; DECLARE (PA,PB) BYTE; /* FIND THE STRING IN SCRATCH STARTING AT PA AND ENDING AT PB */ DECLARE J ADDRESS, (K, MATCH) BYTE; J = BACK ; MATCH = FALSE; DO WHILE NOT MATCH AND (MAXM > J); /* START SCAN AT J */ LAST,J = J + 1; K = PA ; /* ATTEMPT STRING MATCH AT K */ DO WHILE SCRATCH(K) = MEMORY(LAST) AND NOT (MATCH := K = PB); K = K + 1; LAST = LAST + 1; END; END; IF MATCH THEN /* MOVE STORAGE */ DO; LAST = LAST - 1; CALL MOVER; END; RETURN MATCH; END FIND; ---