(* 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.