-- FIFODriver.mesa -- last edited by Suzuki: July 12, 1981 8:58 PM DIRECTORY FIFO, FIFOConnectorBool, FIFOConnectorCard, FIFOScheduler, ImageDefs, SimIO, WF; FIFODriver: MONITOR IMPORTS DataAv: FIFOConnectorBool, SpaceAv: FIFOConnectorBool, Init: FIFOConnectorBool, ReadReq: FIFOConnectorBool, WriteReq: FIFOConnectorBool, DataOut: FIFOConnectorCard, DataIn: FIFOConnectorCard, FIFO, FIFOScheduler, ImageDefs, SimIO, WF = { p,q,r,s: PROCESS; i: CARDINAL; Reader: PROC = { WF.WF0[" Reader started.*n"]; THROUGH [0..50) DO FIFOScheduler.Delay[10]; UNTIL DataAv.Get[]=TRUE DO FIFOScheduler.StandardDelay[] ENDLOOP; ReadReq.Put[TRUE]; WF.WF1["%u ", DataOut.Get[]]; FIFOScheduler.Delay[5]; ReadReq.Put[FALSE]; ENDLOOP; WF.WF0[" Reader terminated.*n"]; FIFOScheduler.ProcessEnd[]; }; Writer: PROC = { WF.WF0[" Writer started.*n"]; FOR i IN [0..50) DO FIFOScheduler.Delay[10]; UNTIL SpaceAv.Get[]=TRUE DO FIFOScheduler.StandardDelay[] ENDLOOP; DataIn.Place[i]; WriteReq.Put[TRUE]; WF.WF1["%u- ", i]; FIFOScheduler.Delay[5]; WriteReq.Put[FALSE]; ENDLOOP; WF.WF0[" Writer terminated.*n"]; FIFOScheduler.ProcessEnd[]; }; Start: PROC = { ReadReq.Stuff[FALSE]; WriteReq.Stuff[FALSE]; FIFOScheduler.Delay[10]; Init.Put[TRUE]; FIFOScheduler.Delay[5]; Init.Put[FALSE]; FIFOScheduler.ProcessEnd[]; }; SimIO.Start["FIFO.jam"]; r ← FIFOScheduler.Fork[FIFO.Main]; s ← FIFOScheduler.Fork[Start]; p ← FIFOScheduler.Fork[Reader]; q ← FIFOScheduler.Fork[Writer]; [] ← FIFOScheduler.Join[p]; [] ← FIFOScheduler.Join[q]; [] ← FIFOScheduler.Join[s]; SimIO.Stop[]; ImageDefs.StopMesa[]; }.