(* This is the corrected version of the sample program illustrating *)
(* TRANSFER() in the Turbo Modula-2 User's Guide (Page 455). The problem *)
(* with the original is that coroutine workspace is not allocated due to *)
(* use of POINTER declarations instead of "real" variables. *)
MODULE TickTock;
FROM SYSTEM IMPORT
ADR, NEWPROCESS, TRANSFER, ADDRESS, PROCESS, WORD; (* additional ADR *)
VAR
tickProcess, tockProcess, main: PROCESS;
tickWork, tockWork: ARRAY[0..99] OF WORD; (* pointers no longer used *)
PROCEDURE tick;
BEGIN
WRITELN('tick');
TRANSFER(tickProcess,tockProcess);
END tick; (* original program had a small error here, also *)
PROCEDURE tock;
BEGIN
WRITELN('tock');
TRANSFER(tockProcess,tickProcess);
END tock;
BEGIN
NEWPROCESS(tick,ADR(tickWork),SIZE(tickWork),tickProcess);
NEWPROCESS(tock,ADR(tockWork),SIZE(tockWork),tockProcess);
TRANSFER(main,tickProcess);
END TickTock.