
Constants:
Braking=1, DoMin=4, DoFull=5, CalCount=9, EndCal=10, Free=0, WaitClear=1, Discovered=2,
Stopped=3, StopClear=4, Stopping=5, GetTrain=6, GetCal=7, Booked=8, Calibrated=9,
CalFwd=10, CalRev=11, Departing=12, Occupied=13, Arriving=14, Expected=15, ArrOcc=13,
Moving=12, Left=0, Right=1, ChosenLeft=2, ChosenRight=3, Undef=4, Fwd=0, Rev=1,
Goods=1, Local=3, Passenger=7, Express=15,

Controls:
GROUP: Tracks (rs, rc)=(L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L18, L19, L20, L21, P1, P2)
GROUP: SPDT (rs, rc1, rc2)=(L2)
GROUP: switch (rcA, rcB)=(L17)
GROUP: Points (TurnA, TurnB)=(TO4, TO5, TI2, TI4, TI6, TI7, TI8, TI11, TI12, TI13, TI14, TI15)
{ rc<section>: Cab relay. 0=preferred cab, 1=secondary cab }
{ rs<section>: Stop relay. 0=running, 1=Stopped }
{ re<section>: Emergency relay. 0=Stopped. 1=Safety zone enabled }
{ Stack: CTIout 32/32 }
DirRelay, TurnTO1, TurnCO1, TurnCO2, spare, spare, spare, spare,
spare, spare, rcL9, rsL9, rcL8, rsL8, rcL7, rsL7,
rcL6, rsL6, spare, rcL5, rsL5, TurnTO3, rcL4, rsL4,
rcL3, rsL3, TurnTI3, TurnTO2, rc1L2, rc2L2, rsL2, TurnTI1,
{ Stack: MergOdds 2/8 }
PwrTI2, PwrTI8, spare, spare, spare, spare, spare, spare,
{ Stack: MergOut 28/32 }
rcL13, rcL14, rcL15, rcL16, rsL13, rsL14, rsL15, rsL16,
rcAL17, rcL10, rcL11, rcL12, rcBL17, rsL10, rsL11, rsL12,
rcL21, rcL20, rcL19, rcL18, rsL21, rsL20, rsL19, rsL18,
spare, spare, rcP1, rcP2, spare, spare, rsP1, rsP2,
{ Stack: B3out 6/32 }
spare, spare, TurnATI6, TurnBTI6, TurnATI7, TurnBTI7, spare, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
{ Stack: B1out 12/16 }
TurnATI8, TurnBTI8, TurnATI11, TurnBTI11, TurnATI12, TurnBTI12, TurnATI13, TurnBTI13,
TurnATI14, TurnBTI14, TurnATI15, TurnBTI15, spare, spare, spare, spare,
{ Stack: B4out 6/8 }
TurnATI4, TurnBTI4, TurnATO4, TurnBTO4, TurnATO5, TurnBTO5, spare, spare,
{ Stack: B5out 2/8 }
TurnATI2, TurnBTI2, spare, spare, spare, spare, spare, spare,

Sensors:
GROUP: Tracks (Cur, Opt, OptO)=(L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, P1, P2)
{ Cur<section>: Current detector }
{ Opt<section>: Optical detector starts braking, marks entry }
{ OptO<section>: Optical detector stops train, marks exit }
{ Stack: CTIin 32/32 }
OptL16*, OptOL16*, spare, spare, spare, spare, spare, spare,
OptL11*, OptOL11*, CurL9#, OptL9~*, CurL8#, spare, OptOL8~*, CurL7#,
OptL7~*, spare, CurL6#, spare, spare, CurL5#, spare, spare,
CurL4#, OptL4~*, OptOL4~*, CurL3#, CurL2#, OptL2*, OptOL2*, OptL17~*,
{ Stack: MergIn 14/16 }
CurL16#~, CurL15#~, CurL14#~, CurL13#~, CurL12#~, CurL11#~, CurL10#~, CurL17#~,
CurL18#~, CurL19#~, CurL20#~, CurL21#~, CurP2#~, CurP1#~, spare, spare,
{ Stack: B3in 10/32 }
OptL12~*, OptOL12~*, OptOL7~*, OptL6~*, OptOL18~*, OptL19~*, OptOL19~*, OptOL20~*,
OptL21~*, OptOL21~*, spare, spare, spare, spare, spare, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
{ Stack: B1in 7/16 }
OptL10~*, OptOL10~*, OptOL9~*, OptL8~*, OptP2~*, OptOP2*, OptOP1~*, spare,
spare, spare, spare, spare, spare, spare, spare, spare,
{ Stack: B4in 8/8 }
OptOL14~*, OptL13~*, OptOL13~*, OptOL6~*, OptL5~*, OptOL5~*, OptL18~*, OptL20~*,
{ Stack: B5in 8/8 }
OptL15~*, OptOL15~*, OptL14~*, spare, spare, OptL3~*, OptOL3~*, OptOL17~*,

SmartCabs:
cab[8], ct1, ct2, ct3, ct4, ct5, ct6,

Qkeys:
Stop, Pause, Turnout, Discover, Mark, Clear,

Variables:
GROUP: Tracks (s, t, p, mxtt, wt, len, tcal, Rand)=(L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, P1, P2)
GROUP: Turnouts (s, np, TReq, TSet, lp, rp, ncn, TBook)=(TO1, TO2, TO3, TO4, TO5)
GROUP: Turnins (s, t, TReq, TSet, psp, lp, rp, TBook)=(TI1, TI2, TI3, TI4, TI6, TI7, TI8, TI11, TI12, TI13, TI14, TI15)
GROUP: Crossover (as, bs, TReq, TSet, TBook)=(CO1, CO2)
GROUP: Odds (s, t, tt)=(D2, X1, X2, J14)
GROUP: Trains (cab, t, len, tdir, sp, osp, ncab, col)=(t[])
GROUP: Speeds (m, f, mm, mf, om, of, omm, omf)=(st[])
GROUP: Throttles (t)=(c[])
GROUP: Calibration (Train, Time, Len, Spd, FS, TT, Red, Inc)=(Cal)
GROUP: TargetSpeeds (express, passenger, local, goods, crawl)=(FS)
GROUP: Networks (s, t, In_, Out_, Pri_, Time_)=(N1, N2)
GROUP: N1in (Tt_, np, Route, ncn)=(N1L12, N1L19, N1L21)
GROUP: N1out (s, t, psp, Route)=(N1_L11)
GROUP: N2in (Tt_, np, Route, ncn)=(N2L2, N2L3, N2L4, N2P1, N2P2, N2L10, N2L15, N2L16)
GROUP: N2out (s, t, psp, Route)=(N2_P2, N2_L2, N2_L9, N2_L14, N2_L15, N2_L16, N2_L17, N2_P1)
STRUCT (s, t, p, wt)=(L2, L3, L4, L5, L6, L7, L8, L9, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, L20, L21, P1, P2, FreeSect)
STRUCT (s, t)=(X2)
STRUCT (s, TReq, TSet)=(TI1, TI2, TI3, TI4, TI6, TI7, TI8, TI11, TI12, TI13, TI14, TI15, TO1, TO2, TO3, TO4, TO5, CO1, CO2)
STRUCT (s)=(D2, X1, J14, CO1a, CO1b, CO2a, CO2b)
STRUCT (s, t)=(N1, N2)
STRUCT (s, t)=(N1_L11)
STRUCT (s, t)=(N2_P2, N2_L2, N2_L9, N2_L14, N2_L15, N2_L16, N2_L17, N2_P1)
CalTrain, CalTime, CalLen, CalSpd, CalFS, CalTT, CalRed, CalInc,
                                               { Variables used by train recalibration }
FSexpress, FSpassenger, FSlocal, FSgoods, FScrawl               { Desired train speeds }
tc[8]                                                        { Train controlled by cab }
cabt[6], ncabt[6]                                     { Cab, and new cab used by train }
BookNo, Avail                                                { Turnout booking globals }
In_N1, Out_N1, Time_N1, Pri_N1                                            { Network N1 }
In_N2, Out_N2, Time_N2, Pri_N2                                            { Network N2 }
TBookTO1                                                              { Net switch TO1 }
TBookCO1                                                              { Net switch CO1 }
TBookCO2                                                              { Net switch CO2 }
RandL15, tcalL15                                                    { Long section L15 }
sX2, ttX2                                                                { Crossing X2 }
tcalL9                                                               { Long section L9 }
pspTI4, lpTI4, rpTI4                                                      { TurnIn TI4 }
npTO3, lpTO3, rpTO3, TBookTO3                                            { TurnOut TO3 }
mxttL4, RandL4                                                       { Long section L4 }
mxttL3, RandL3                                                       { Long section L3 }
TBookTI3                                                              { Net switch TI3 }
TBookTO2                                                              { Net switch TO2 }
TBookTI1                                                              { Net switch TI1 }
pspTI2, lpTI2, rpTI2                                                      { TurnIn TI2 }
npTO4, ncnTO4, lpTO4, rpTO4                                              { TurnOut TO4 }
npTO5, ncnTO5, lpTO5, rpTO5                                              { TurnOut TO5 }
RandL20                                                             { Long section L20 }
RouteN1L12, Tt_N1L12, npN1L12                                        { Net input N1L12 }
RouteN1L19, Tt_N1L19, npN1L19                                        { Net input N1L19 }
RouteN1L21, Tt_N1L21, npN1L21                                        { Net input N1L21 }
RouteN1_L11, pspN1_L11                                             { Net output N1_L11 }
RouteN2P2, Tt_N2P2, npN2P2                                            { Net input N2P2 }
RouteN2L2, Tt_N2L2, npN2L2, ncnN2L2                                   { Net input N2L2 }
RouteN2L3, Tt_N2L3, npN2L3                                            { Net input N2L3 }
RouteN2L4, Tt_N2L4, npN2L4                                            { Net input N2L4 }
RouteN2L10, Tt_N2L10, npN2L10                                        { Net input N2L10 }
RouteN2L15, Tt_N2L15, npN2L15, ncnN2L15                              { Net input N2L15 }
RouteN2L16, Tt_N2L16, npN2L16                                        { Net input N2L16 }
RouteN2P1, Tt_N2P1, npN2P1                                            { Net input N2P1 }
RouteN2_P2, pspN2_P2                                                { Net output N2_P2 }
RouteN2_L2, pspN2_L2                                                { Net output N2_L2 }
RouteN2_L9, pspN2_L9                                                { Net output N2_L9 }
RouteN2_L14, pspN2_L14                                             { Net output N2_L14 }
RouteN2_L15, pspN2_L15                                             { Net output N2_L15 }
RouteN2_L16, pspN2_L16                                             { Net output N2_L16 }
RouteN2_L17, pspN2_L17                                             { Net output N2_L17 }
RouteN2_P1, pspN2_P1                                                { Net output N2_P1 }
spt[6], ospt[6]                                    { current & previous speed of train }
tdirt[6]                                                         { Direction for train }
mst[6], omst[6]                                         { Minimum speed for each train }
mmst[6], ommst[6]                                                { Measured slow speed }
fst[6], ofst[6]                                            { Full speed for each train }
mfst[6], omfst[6]                                                { Measured full speed }
lent[6], tt[6]                                           { Length & type of each train }
colt0, colt[6], coltx                                              { Colours of trains }
initialised, Rand, FreeTrain, TrainTrack, c, d, upmom, downmom        { Misc variables }

Actions:

{ WHEN Stop button pressed DO Stop at next valid location }
{ WHEN Stop released DO Resume }
{ WHEN Pause button pressed DO Brake all trains }
{ WHEN Pause released DO resume }
{ WHEN Turnout=left, paused DO set all turnouts left }
{ WHEN Turnout=right, paused DO set all turnouts right }
{ WHEN Turnout=left, not paused DO random to left }
{ WHEN Turnout=right, not paused DO random to right }
{ WHEN Discover button pressed DO look for new trains }
{ WHEN Mark button pressed DO Clear error message }
WHEN Stop=LEFT DO initialised=4                                                 {WHEN 1}
WHEN Stop=RIGHT DO initialised=2                                                {WHEN 2}
WHEN Pause=LEFT DO initialised=5                                                {WHEN 3}
WHEN Pause=RIGHT DO initialised=2                                               {WHEN 4}
WHEN Turnout=LEFT, initialised=5 DO { Set all turnouts left }                   {WHEN 5}
	TI11.Treq=0, TI12.Treq=0, TI13.Treq=0, TI14.Treq=0, TI15.Treq=0, TO1.Treq=0,
	TO2.Treq=0, CO1.Treq=0, TI1.Treq=0, CO2.Treq=0, TI3.Treq=0, TI6.Treq=0, TI7.Treq=0,
	TI8.Treq=0,
WHEN Turnout=RIGHT, initialised=5 DO { Set all turnouts right }                 {WHEN 6}
	TO3.Treq=1, TO4.Treq=1, TO5.Treq=1, TI2.Treq=1, TI4.Treq=1, TI11.Treq=1, TI12.Treq=1,
	TI13.Treq=1, TI14.Treq=1, TI15.Treq=1, TO1.Treq=1, TO2.Treq=1, CO1.Treq=1, TI1.Treq=1,
	CO2.Treq=1, TI3.Treq=1, TI6.Treq=1, TI7.Treq=1, TI8.Treq=1,
WHEN Turnout=LEFT, initialised=2 DO Rand=65535                                  {WHEN 7}
WHEN Turnout=RIGHT, initialised=2 DO Rand=0                                     {WHEN 8}
WHEN Discover=LEFT DO initialised=1, wait 0.1, initialised=2                    {WHEN 9}
WHEN Mark=LEFT DO $Erase Message(1,3,3)                                         {WHEN 10}

{ WHEN Main initialisation }

WHEN initialised=0                                                              {WHEN 11}
 DO	FSexpress=80, FSpassenger=60, FSlocal=50, FSgoods=40, FScrawl=20
	upmom=7, downmom=4, $Draw Message(6,1,3)="@upmom", $Draw Message(6,2,3)="@downmom",
	Avail=1, BookNo=1                                      { Ready for first turnout move }
	$Color Block(3,9,1)=0, $Color Block(2,11,1)=0, $Color Block(3,15,1)=0,
	$Color Block(6,18,1)=0, $Color Block(7,18,1)=0, $Color Block(13,18,1)=0,
	$Color Block(15,13,1)=0, $Color Block(15,7,1)=0, $Color Block(10,3,1)=0,
	$Color Block(5,3,1)=0, $Color Block(2,10,1)=0, $Color Block(2,3,1)=0,
	$Color Block(12,2,1)=0, $Color Block(16,8,1)=0, $Color Block(16,15,1)=0,
	$Color Block(16,16,1)=0, $Color Block(13,19,1)=0, $Color Block(12,20,1)=0,
	$Color Block(12,19,1)=0, $Color Block(4,19,1)=0, $Color Block(2,15,1)=0,
	$Color Block(3,19,1)=0, $Color Block(6,12,1)=0, $Color Block(7,12,1)=0,
	$Color Block(1,1,1)=0, $Color Block(12,12,1)=0, $Color Block(13,11,1)=0,
	$Color Block(14,10,1)=0, $Color Block(14,7,1)=0, $Color Block(13,10,1)=0,
	$Color Block(13,7,1)=0, $Color Block(12,4,1)=0, $Color Block(11,3,1)=0,
	$Color Block(3,8,1)=0, $Color Block(1,1,1)=0, $Color Block(1,1,1)=0,
	$Color Block(1,1,1)=0, $Color Block(1,1,1)=0, $Color Block(1,1,1)=0,
	$Color Block(4,7,1)=0, $Color Block(1,1,1)=0, $Color Block(3,14,1)=0,
	$Color Block(1,1,1)=0,
	L17.p=4,
	TO1.Tset=Undef, TO1.TReq=Undef, CO1.Tset=Undef, CO1.TReq=Undef,
	CO2.Tset=Undef, CO2.TReq=Undef, TI4.Tset=Undef, TI4.TReq=Undef,
	pspTI4=&FreeSect, lpTI4=&FreeSect, rpTI4=&FreeSect, TO3.Tset=Undef, TO3.TReq=Undef,
	npTO3=&FreeSect, lpTO3=&FreeSect, rpTO3=&FreeSect, TI3.Tset=Undef, TI3.TReq=Undef,
	TO2.Tset=Undef, TO2.TReq=Undef, TI1.Tset=Undef, TI1.TReq=Undef,
	TI2.Tset=Undef, TI2.TReq=Undef, pspTI2=&FreeSect, lpTI2=&FreeSect, rpTI2=&FreeSect,
	TO4.Tset=Undef, TO4.TReq=Undef, npTO4=&FreeSect, lpTO4=&FreeSect, rpTO4=&FreeSect,
	TO5.Tset=Undef, TO5.TReq=Undef, npTO5=&FreeSect, lpTO5=&FreeSect, rpTO5=&FreeSect,
	TI6.Tset=Undef, TI6.TReq=Undef, TI7.Tset=Undef, TI7.TReq=Undef,
	TI8.Tset=Undef, TI8.TReq=Undef, TI11.Tset=Undef, TI11.TReq=Undef,
	TI12.Tset=Undef, TI12.TReq=Undef, TI13.Tset=Undef, TI13.TReq=Undef,
	TI14.Tset=Undef, TI14.TReq=Undef, TI15.Tset=Undef, TI15.TReq=Undef, npN1L12=&FreeSect,
	npN1L19=&FreeSect, npN1L21=&FreeSect, pspN1_L11=&FreeSect, npN2P2=&FreeSect,
	npN2L2=&FreeSect, npN2L3=&FreeSect, npN2L4=&FreeSect, npN2L10=&FreeSect,
	npN2L15=&FreeSect, npN2L16=&FreeSect, npN2P1=&FreeSect, pspN2_P2=&FreeSect,
	pspN2_L2=&FreeSect, pspN2_L9=&FreeSect, pspN2_L14=&FreeSect, pspN2_L15=&FreeSect,
	pspN2_L16=&FreeSect, pspN2_L17=&FreeSect, pspN2_P1=&FreeSect,
	colt0=$RGB_0, colt[1]=$RGB_4080, colt[2]=$RGB_FF, colt[3]=$RGB_80FF,
	colt[4]=$RGB_FFFF, colt[5]=$RGB_FF00, colt[6]=$RGB_FF0000, coltx=$RGB_C0C0C0,
	$Erase Message(8,2,2), $Erase Message(10,2,2), lent[1]=999,
	$Erase Message(8,3,2), $Erase Message(10,3,2), lent[2]=999,
	$Erase Message(8,4,2), $Erase Message(10,4,2), lent[3]=999,
	$Erase Message(8,5,2), $Erase Message(10,5,2), lent[4]=999,
	$Erase Message(8,6,2), $Erase Message(10,6,2), lent[5]=999,
	$Erase Message(8,7,2), $Erase Message(10,7,2), lent[6]=999,
	cab[1]=10, cab[2]=10, cab[3]=10, cab[4]=10, cab[5]=10, cab[6]=10, cab[7]=10,
	cab[8]=10,
	wait 1, initialised=1, wait 0.5
	L17.p=0,
	cab[1]=0, cab[2]=0, cab[3]=0, cab[4]=0, cab[5]=0, cab[6]=0, cab[7]=0, cab[8]=0,
	initialised=2
{ For each section with sensor, allocate a train if current is drawn }


{ Allocate train numbers to newly discovered trains }

{ WHEN initialising, current detected DO Stopped }
{ WHEN initialising, opticals detected DO WaitClear }
{ WHEN Stopped & time to go DO GetTrain }
{ WHEN GetTrain & Train=0 DO Grab FreeTrain }
{ WHEN GetTrain & Train=0 & FreeTrain Grabbed DO set Train }
{ WHEN GetTrain & Train<>0 & Next free DO GetCal }
{ WHEN GetCal & Calibrated & cab<>0 DO Calibrated }
{ WHEN Calibrated & next ready DO Occupied }
{ WHEN Calibrated & timeout DO Release cab, Stopped }

WHEN L16.s=Free, initialised=1, CurL16=TRUE                                     {WHEN 12}
 DO	L16.s=Stopped, L16.wt=$TIME, L16.wt=3+
WHEN L16.s=Free, initialised=1, CurL16=FALSE, OptL16=TRUE                       {WHEN 13}
 OR  initialised=1, L16.s=Free, CurL16=FALSE, OptOL16=TRUE
 DO	L16.s=WaitClear
WHEN L16.s=Stopped, $TIME>=L16.wt, initialised<>4 DO L16.s=GetTrain             {WHEN 14}
WHEN L16.s=GetTrain, L16.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=5        {WHEN 15}
WHEN L16.s=GetTrain, L16.t=0, FreeTrain<>0, TrainTrack=5                        {WHEN 16}
 DO	L16.t=FreeTrain, FreeTrain=0, spt[L16.t]=Occupied, TrainTrack=0
WHEN L16.s=GetTrain, L16.t<>0, *npN2L16.s=Free                                  {WHEN 17}
 DO	L16.s=GetCal, L16.wt=mst[L16.t]
	$Color Track(3,15,1)=colt[L16.t]
WHEN L16.s=GetCal, L16.wt<>0, L16.p<>0                                          {WHEN 18}
 DO	L16.s=Calibrated, L16.wt=$SESSION, L16.wt=10+
WHEN L16.s=Calibrated, L16.t=*npN2L16.t                                         {WHEN 19}
 DO	wait 0.7, L16.s=Occupied, L16.wt=$SESSION, L16.wt=10+
	$Color Block(3,15,1)=colt[L16.t]
WHEN L16.s=Calibrated, $SESSION>L16.wt                                          {WHEN 20}
 DO	spt[L16.t]=Stopped, L16.p=0, L16.s=Stopped, L16.wt=$TIME, L16.wt=5+
WHEN L15.s=Free, initialised=1, CurL15=TRUE                                     {WHEN 21}
 DO	L15.s=Stopped, L15.wt=$TIME, L15.wt=3+
WHEN L15.s=Free, initialised=1, CurL15=FALSE, OptL15=TRUE                       {WHEN 22}
 OR  initialised=1, L15.s=Free, CurL15=FALSE, OptOL15=TRUE
 DO	L15.s=WaitClear
WHEN L15.s=Stopped, $TIME>=L15.wt, initialised<>4 DO L15.s=GetTrain             {WHEN 23}
WHEN L15.s=GetTrain, L15.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=7        {WHEN 24}
WHEN L15.s=GetTrain, L15.t=0, FreeTrain<>0, TrainTrack=7                        {WHEN 25}
 DO	L15.t=FreeTrain, FreeTrain=0, spt[L15.t]=Occupied, TrainTrack=0
WHEN L15.s=GetTrain, L15.t<>0, *npN2L15.s=Free                                  {WHEN 26}
 DO	L15.s=GetCal, L15.wt=mst[L15.t]
	$Color Track(7,18,1)=colt[L15.t]
WHEN L15.s=GetCal, L15.wt<>0, L15.p<>0                                          {WHEN 27}
 DO	L15.s=Calibrated, L15.wt=$SESSION, L15.wt=10+
WHEN L15.s=Calibrated, L15.t=*npN2L15.t                                         {WHEN 28}
 DO	wait 0.7, L15.s=Occupied, L15.wt=$SESSION, L15.wt=10+
	$Color Block(7,18,1)=colt[L15.t]
WHEN L15.s=Calibrated, $SESSION>L15.wt                                          {WHEN 29}
 DO	spt[L15.t]=Stopped, L15.p=0, L15.s=Stopped, L15.wt=$TIME, L15.wt=5+
WHEN L14.s=Free, initialised=1, CurL14=TRUE                                     {WHEN 30}
 DO	L14.s=Stopped, L14.wt=$TIME, L14.wt=3+
WHEN L14.s=Free, initialised=1, CurL14=FALSE, OptL14=TRUE                       {WHEN 31}
 OR  initialised=1, L14.s=Free, CurL14=FALSE, OptOL14=TRUE
 DO	L14.s=WaitClear
WHEN L14.s=Stopped, $TIME>=L14.wt, initialised<>4 DO L14.s=GetTrain             {WHEN 32}
WHEN L14.s=GetTrain, L14.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=8        {WHEN 33}
WHEN L14.s=GetTrain, L14.t=0, FreeTrain<>0, TrainTrack=8                        {WHEN 34}
 DO	L14.t=FreeTrain, FreeTrain=0, spt[L14.t]=Occupied, TrainTrack=0
WHEN L14.s=GetTrain, L14.t<>0, X2.s=Free DO L14.s=GetCal, L14.wt=mst[L14.t]     {WHEN 35}
	$Color Track(13,18,1)=colt[L14.t]
WHEN L14.s=GetCal, L14.wt<>0, L14.p<>0                                          {WHEN 36}
 DO	L14.s=Calibrated, L14.wt=$SESSION, L14.wt=10+
WHEN L14.s=Calibrated, L14.t=X2.t                                               {WHEN 37}
 DO	L14.s=Occupied, L14.wt=$SESSION, L14.wt=10+
	$Color Block(13,18,1)=colt[L14.t]
WHEN L14.s=Calibrated, $SESSION>L14.wt                                          {WHEN 38}
 DO	spt[L14.t]=Stopped, L14.p=0, L14.s=Stopped, L14.wt=$TIME, L14.wt=5+
WHEN L13.s=Free, initialised=1, CurL13=TRUE                                     {WHEN 39}
 DO	L13.s=Stopped, L13.wt=$TIME, L13.wt=3+
WHEN L13.s=Free, initialised=1, CurL13=FALSE, OptL13=TRUE                       {WHEN 40}
 OR  initialised=1, L13.s=Free, CurL13=FALSE, OptOL13=TRUE
 DO	L13.s=WaitClear
WHEN L13.s=Stopped, $TIME>=L13.wt, initialised<>4 DO L13.s=GetTrain             {WHEN 41}
WHEN L13.s=GetTrain, L13.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=10       {WHEN 42}
WHEN L13.s=GetTrain, L13.t=0, FreeTrain<>0, TrainTrack=10                       {WHEN 43}
 DO	L13.t=FreeTrain, FreeTrain=0, spt[L13.t]=Occupied, TrainTrack=0
WHEN L13.s=GetTrain, L13.t<>0, L12.s=Free DO L13.s=GetCal, L13.wt=mst[L13.t]    {WHEN 44}
	$Color Track(15,13,1)=colt[L13.t]
WHEN L13.s=GetCal, L13.wt<>0, L13.p<>0                                          {WHEN 45}
 DO	L13.s=Calibrated, L13.wt=$SESSION, L13.wt=10+
WHEN L13.s=Calibrated, L13.t=L12.t                                              {WHEN 46}
 DO	L13.s=Occupied, L13.wt=$SESSION, L13.wt=10+
	$Color Block(15,13,1)=colt[L13.t]
WHEN L13.s=Calibrated, $SESSION>L13.wt                                          {WHEN 47}
 DO	spt[L13.t]=Stopped, L13.p=0, L13.s=Stopped, L13.wt=$TIME, L13.wt=5+
WHEN L12.s=Free, initialised=1, CurL12=TRUE                                     {WHEN 48}
 DO	L12.s=Stopped, L12.wt=$TIME, L12.wt=3+
WHEN L12.s=Free, initialised=1, CurL12=FALSE, OptL12=TRUE                       {WHEN 49}
 OR  initialised=1, L12.s=Free, CurL12=FALSE, OptOL12=TRUE
 DO	L12.s=WaitClear
WHEN L12.s=Stopped, $TIME>=L12.wt, initialised<>4 DO L12.s=GetTrain             {WHEN 50}
WHEN L12.s=GetTrain, L12.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=11       {WHEN 51}
WHEN L12.s=GetTrain, L12.t=0, FreeTrain<>0, TrainTrack=11                       {WHEN 52}
 DO	L12.t=FreeTrain, FreeTrain=0, spt[L12.t]=Occupied, TrainTrack=0
WHEN L12.s=GetTrain, L12.t<>0, *npN1L12.s=Free                                  {WHEN 53}
 DO	L12.s=GetCal, L12.wt=mst[L12.t]
	$Color Track(15,7,1)=colt[L12.t]
WHEN L12.s=GetCal, L12.wt<>0, L12.p<>0                                          {WHEN 54}
 DO	L12.s=Calibrated, L12.wt=$SESSION, L12.wt=10+
WHEN L12.s=Calibrated, L12.t=*npN1L12.t                                         {WHEN 55}
 DO	wait 0.7, L12.s=Occupied, L12.wt=$SESSION, L12.wt=10+
	$Color Block(15,7,1)=colt[L12.t]
WHEN L12.s=Calibrated, $SESSION>L12.wt                                          {WHEN 56}
 DO	spt[L12.t]=Stopped, L12.p=0, L12.s=Stopped, L12.wt=$TIME, L12.wt=5+
WHEN L11.s=Free, initialised=1, CurL11=TRUE                                     {WHEN 57}
 DO	L11.s=Stopped, L11.wt=$TIME, L11.wt=3+
WHEN L11.s=Free, initialised=1, CurL11=FALSE, OptL11=TRUE                       {WHEN 58}
 OR  initialised=1, L11.s=Free, CurL11=FALSE, OptOL11=TRUE
 DO	L11.s=WaitClear
WHEN L11.s=Stopped, $TIME>=L11.wt, initialised<>4 DO L11.s=GetTrain             {WHEN 59}
WHEN L11.s=GetTrain, L11.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=12       {WHEN 60}
WHEN L11.s=GetTrain, L11.t=0, FreeTrain<>0, TrainTrack=12                       {WHEN 61}
 DO	L11.t=FreeTrain, FreeTrain=0, spt[L11.t]=Occupied, TrainTrack=0
WHEN L11.s=GetTrain, L11.t<>0, L10.s=Free DO L11.s=GetCal, L11.wt=mst[L11.t]    {WHEN 62}
	$Color Track(10,3,1)=colt[L11.t]
WHEN L11.s=GetCal, L11.wt<>0, L11.p<>0                                          {WHEN 63}
 DO	L11.s=Calibrated, L11.wt=$SESSION, L11.wt=10+
WHEN L11.s=Calibrated, L11.t=L10.t                                              {WHEN 64}
 DO	L11.s=Occupied, L11.wt=$SESSION, L11.wt=10+
	$Color Block(10,3,1)=colt[L11.t]
WHEN L11.s=Calibrated, $SESSION>L11.wt                                          {WHEN 65}
 DO	spt[L11.t]=Stopped, L11.p=0, L11.s=Stopped, L11.wt=$TIME, L11.wt=5+
WHEN L10.s=Free, initialised=1, CurL10=TRUE                                     {WHEN 66}
 DO	L10.s=Stopped, L10.wt=$TIME, L10.wt=3+
WHEN L10.s=Free, initialised=1, CurL10=FALSE, OptL10=TRUE                       {WHEN 67}
 OR  initialised=1, L10.s=Free, CurL10=FALSE, OptOL10=TRUE
 DO	L10.s=WaitClear
WHEN L10.s=Stopped, $TIME>=L10.wt, initialised<>4 DO L10.s=GetTrain             {WHEN 68}
WHEN L10.s=GetTrain, L10.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=13       {WHEN 69}
WHEN L10.s=GetTrain, L10.t=0, FreeTrain<>0, TrainTrack=13                       {WHEN 70}
 DO	L10.t=FreeTrain, FreeTrain=0, spt[L10.t]=Occupied, TrainTrack=0
WHEN L10.s=GetTrain, L10.t<>0, *npN2L10.s=Free                                  {WHEN 71}
 DO	L10.s=GetCal, L10.wt=mst[L10.t]
	$Color Track(5,3,1)=colt[L10.t]
WHEN L10.s=GetCal, L10.wt<>0, L10.p<>0                                          {WHEN 72}
 DO	L10.s=Calibrated, L10.wt=$SESSION, L10.wt=10+
WHEN L10.s=Calibrated, L10.t=*npN2L10.t                                         {WHEN 73}
 DO	wait 0.7, L10.s=Occupied, L10.wt=$SESSION, L10.wt=10+
	$Color Block(5,3,1)=colt[L10.t]
WHEN L10.s=Calibrated, $SESSION>L10.wt                                          {WHEN 74}
 DO	spt[L10.t]=Stopped, L10.p=0, L10.s=Stopped, L10.wt=$TIME, L10.wt=5+
WHEN L9.s=Free, initialised=1, CurL9=TRUE                                       {WHEN 75}
 DO	L9.s=Stopped, L9.wt=$TIME, L9.wt=3+
WHEN L9.s=Free, initialised=1, CurL9=FALSE, OptL9=TRUE                          {WHEN 76}
 OR  initialised=1, L9.s=Free, CurL9=FALSE, OptOL9=TRUE
 DO	L9.s=WaitClear
WHEN L9.s=Stopped, $TIME>=L9.wt, initialised<>4 DO L9.s=GetTrain                {WHEN 77}
WHEN L9.s=GetTrain, L9.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=14         {WHEN 78}
WHEN L9.s=GetTrain, L9.t=0, FreeTrain<>0, TrainTrack=14                         {WHEN 79}
 DO	L9.t=FreeTrain, FreeTrain=0, spt[L9.t]=Occupied, TrainTrack=0
WHEN L9.s=GetTrain, L9.t<>0, L8.s=Free DO L9.s=GetCal, L9.wt=mst[L9.t]          {WHEN 80}
	$Color Track(2,10,1)=colt[L9.t]
WHEN L9.s=GetCal, L9.wt<>0, L9.p<>0                                             {WHEN 81}
 DO	L9.s=Calibrated, L9.wt=$SESSION, L9.wt=10+
WHEN L9.s=Calibrated, L9.t=L8.t DO L9.s=Occupied, L9.wt=$SESSION, L9.wt=10+     {WHEN 82}
	$Color Block(2,10,1)=colt[L9.t]
WHEN L9.s=Calibrated, $SESSION>L9.wt                                            {WHEN 83}
 DO	spt[L9.t]=Stopped, L9.p=0, L9.s=Stopped, L9.wt=$TIME, L9.wt=5+
WHEN L8.s=Free, initialised=1, CurL8=TRUE                                       {WHEN 84}
 DO	L8.s=Stopped, L8.wt=$TIME, L8.wt=3+
WHEN L8.s=Free, initialised=1, CurL8=FALSE, OptL8=TRUE                          {WHEN 85}
 OR  initialised=1, L8.s=Free, CurL8=FALSE, OptOL8=TRUE
 DO	L8.s=WaitClear
WHEN L8.s=Stopped, $TIME>=L8.wt, initialised<>4 DO L8.s=GetTrain                {WHEN 86}
WHEN L8.s=GetTrain, L8.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=15         {WHEN 87}
WHEN L8.s=GetTrain, L8.t=0, FreeTrain<>0, TrainTrack=15                         {WHEN 88}
 DO	L8.t=FreeTrain, FreeTrain=0, spt[L8.t]=Occupied, TrainTrack=0
WHEN L8.s=GetTrain, L8.t<>0, L7.s=Free DO L8.s=GetCal, L8.wt=mst[L8.t]          {WHEN 89}
	$Color Track(2,3,1)=colt[L8.t]
WHEN L8.s=GetCal, L8.wt<>0, L8.p<>0                                             {WHEN 90}
 DO	L8.s=Calibrated, L8.wt=$SESSION, L8.wt=10+
WHEN L8.s=Calibrated, L8.t=L7.t DO L8.s=Occupied, L8.wt=$SESSION, L8.wt=10+     {WHEN 91}
	$Color Block(2,3,1)=colt[L8.t]
WHEN L8.s=Calibrated, $SESSION>L8.wt                                            {WHEN 92}
 DO	spt[L8.t]=Stopped, L8.p=0, L8.s=Stopped, L8.wt=$TIME, L8.wt=5+
WHEN L7.s=Free, initialised=1, CurL7=TRUE                                       {WHEN 93}
 DO	L7.s=Stopped, L7.wt=$TIME, L7.wt=3+
WHEN L7.s=Free, initialised=1, CurL7=FALSE, OptL7=TRUE                          {WHEN 94}
 OR  initialised=1, L7.s=Free, CurL7=FALSE, OptOL7=TRUE
 DO	L7.s=WaitClear
WHEN L7.s=Stopped, $TIME>=L7.wt, initialised<>4 DO L7.s=GetTrain                {WHEN 95}
WHEN L7.s=GetTrain, L7.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=16         {WHEN 96}
WHEN L7.s=GetTrain, L7.t=0, FreeTrain<>0, TrainTrack=16                         {WHEN 97}
 DO	L7.t=FreeTrain, FreeTrain=0, spt[L7.t]=Occupied, TrainTrack=0
WHEN L7.s=GetTrain, L7.t<>0, L6.s=Free DO L7.s=GetCal, L7.wt=mst[L7.t]          {WHEN 98}
	$Color Track(12,2,1)=colt[L7.t]
WHEN L7.s=GetCal, L7.wt<>0, L7.p<>0                                             {WHEN 99}
 DO	L7.s=Calibrated, L7.wt=$SESSION, L7.wt=10+
WHEN L7.s=Calibrated, L7.t=L6.t DO L7.s=Occupied, L7.wt=$SESSION, L7.wt=10+     {WHEN 100}
	$Color Block(12,2,1)=colt[L7.t]
WHEN L7.s=Calibrated, $SESSION>L7.wt                                            {WHEN 101}
 DO	spt[L7.t]=Stopped, L7.p=0, L7.s=Stopped, L7.wt=$TIME, L7.wt=5+
WHEN L6.s=Free, initialised=1, CurL6=TRUE                                       {WHEN 102}
 DO	L6.s=Stopped, L6.wt=$TIME, L6.wt=3+
WHEN L6.s=Free, initialised=1, CurL6=FALSE, OptL6=TRUE                          {WHEN 103}
 OR  initialised=1, L6.s=Free, CurL6=FALSE, OptOL6=TRUE
 DO	L6.s=WaitClear
WHEN L6.s=Stopped, $TIME>=L6.wt, initialised<>4 DO L6.s=GetTrain                {WHEN 104}
WHEN L6.s=GetTrain, L6.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=17         {WHEN 105}
WHEN L6.s=GetTrain, L6.t=0, FreeTrain<>0, TrainTrack=17                         {WHEN 106}
 DO	L6.t=FreeTrain, FreeTrain=0, spt[L6.t]=Occupied, TrainTrack=0
WHEN L6.s=GetTrain, L6.t<>0, *lpTI4.s=Free DO L6.s=GetCal, L6.wt=mst[L6.t]      {WHEN 107}
	$Color Track(16,8,1)=colt[L6.t]
WHEN L6.s=GetCal, L6.wt<>0, L6.p<>0                                             {WHEN 108}
 DO	L6.s=Calibrated, L6.wt=$SESSION, L6.wt=10+
WHEN L6.s=Calibrated, L6.t=*lpTI4.t                                             {WHEN 109}
 DO	wait 0.7, L6.s=Occupied, L6.wt=$SESSION, L6.wt=10+
	$Color Block(16,8,1)=colt[L6.t]
WHEN L6.s=Calibrated, $SESSION>L6.wt                                            {WHEN 110}
 DO	spt[L6.t]=Stopped, L6.p=0, L6.s=Stopped, L6.wt=$TIME, L6.wt=5+
WHEN L5.s=Free, initialised=1, CurL5=TRUE                                       {WHEN 111}
 DO	L5.s=Stopped, L5.wt=$TIME, L5.wt=3+
WHEN L5.s=Free, initialised=1, CurL5=FALSE, OptL5=TRUE                          {WHEN 112}
 OR  initialised=1, L5.s=Free, CurL5=FALSE, OptOL5=TRUE
 DO	L5.s=WaitClear
WHEN L5.s=Stopped, $TIME>=L5.wt, initialised<>4 DO L5.s=GetTrain                {WHEN 113}
WHEN L5.s=GetTrain, L5.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=19         {WHEN 114}
WHEN L5.s=GetTrain, L5.t=0, FreeTrain<>0, TrainTrack=19                         {WHEN 115}
 DO	L5.t=FreeTrain, FreeTrain=0, spt[L5.t]=Occupied, TrainTrack=0
WHEN L5.s=GetTrain, L5.t<>0, *npTO3.s=Free DO L5.s=GetCal, L5.wt=mst[L5.t]      {WHEN 116}
	$Color Track(16,16,1)=colt[L5.t]
WHEN L5.s=GetCal, L5.wt<>0, L5.p<>0                                             {WHEN 117}
 DO	L5.s=Calibrated, L5.wt=$SESSION, L5.wt=10+
WHEN L5.s=Calibrated, L5.t=*npTO3.t                                             {WHEN 118}
 DO	wait 0.7, L5.s=Occupied, L5.wt=$SESSION, L5.wt=10+
	$Color Block(16,16,1)=colt[L5.t]
WHEN L5.s=Calibrated, $SESSION>L5.wt                                            {WHEN 119}
 DO	spt[L5.t]=Stopped, L5.p=0, L5.s=Stopped, L5.wt=$TIME, L5.wt=5+
WHEN L4.s=Free, initialised=1, CurL4=TRUE                                       {WHEN 120}
 DO	L4.s=Stopped, L4.wt=$TIME, L4.wt=3+
WHEN L4.s=Free, initialised=1, CurL4=FALSE, OptL4=TRUE                          {WHEN 121}
 OR  initialised=1, L4.s=Free, CurL4=FALSE, OptOL4=TRUE
 DO	L4.s=WaitClear
WHEN L4.s=Stopped, $TIME>=L4.wt, initialised<>4, tt[L4.t]>=mxttL4               {WHEN 122}
 DO	L4.s=GetTrain
WHEN L4.s=GetTrain, L4.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=21         {WHEN 123}
WHEN L4.s=GetTrain, L4.t=0, FreeTrain<>0, TrainTrack=21                         {WHEN 124}
 DO	L4.t=FreeTrain, FreeTrain=0, spt[L4.t]=Occupied, TrainTrack=0
WHEN L4.s=GetTrain, L4.t<>0, *npN2L4.s=Free DO L4.s=GetCal, L4.wt=mst[L4.t]     {WHEN 125}
	$Color Track(12,20,1)=colt[L4.t]
WHEN L4.s=GetCal, L4.wt<>0, L4.p<>0                                             {WHEN 126}
 DO	L4.s=Calibrated, L4.wt=$SESSION, L4.wt=10+
WHEN L4.s=Calibrated, L4.t=*npN2L4.t                                            {WHEN 127}
 DO	wait 0.7, L4.s=Occupied, L4.wt=$SESSION, L4.wt=10+
	$Color Block(12,20,1)=colt[L4.t]
WHEN L4.s=Calibrated, $SESSION>L4.wt                                            {WHEN 128}
 DO	spt[L4.t]=Stopped, L4.p=0, L4.s=Stopped, L4.wt=$TIME, L4.wt=5+
WHEN L3.s=Free, initialised=1, CurL3=TRUE                                       {WHEN 129}
 DO	L3.s=Stopped, L3.wt=$TIME, L3.wt=3+
WHEN L3.s=Free, initialised=1, CurL3=FALSE, OptL3=TRUE                          {WHEN 130}
 OR  initialised=1, L3.s=Free, CurL3=FALSE, OptOL3=TRUE
 DO	L3.s=WaitClear
WHEN L3.s=Stopped, $TIME>=L3.wt, initialised<>4, tt[L3.t]>=mxttL3               {WHEN 131}
 DO	L3.s=GetTrain
WHEN L3.s=GetTrain, L3.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=22         {WHEN 132}
WHEN L3.s=GetTrain, L3.t=0, FreeTrain<>0, TrainTrack=22                         {WHEN 133}
 DO	L3.t=FreeTrain, FreeTrain=0, spt[L3.t]=Occupied, TrainTrack=0
WHEN L3.s=GetTrain, L3.t<>0, *npN2L3.s=Free DO L3.s=GetCal, L3.wt=mst[L3.t]     {WHEN 134}
	$Color Track(12,19,1)=colt[L3.t]
WHEN L3.s=GetCal, L3.wt<>0, L3.p<>0                                             {WHEN 135}
 DO	L3.s=Calibrated, L3.wt=$SESSION, L3.wt=10+
WHEN L3.s=Calibrated, L3.t=*npN2L3.t                                            {WHEN 136}
 DO	wait 0.7, L3.s=Occupied, L3.wt=$SESSION, L3.wt=10+
	$Color Block(12,19,1)=colt[L3.t]
WHEN L3.s=Calibrated, $SESSION>L3.wt                                            {WHEN 137}
 DO	spt[L3.t]=Stopped, L3.p=0, L3.s=Stopped, L3.wt=$TIME, L3.wt=5+
WHEN L2.s=Free, initialised=1, CurL2=TRUE                                       {WHEN 138}
 DO	L2.s=Stopped, L2.wt=$TIME, L2.wt=3+
WHEN L2.s=Free, initialised=1, CurL2=FALSE, OptL2=TRUE                          {WHEN 139}
 OR  initialised=1, L2.s=Free, CurL2=FALSE, OptOL2=TRUE
 DO	L2.s=WaitClear
WHEN L2.s=Stopped, $TIME>=L2.wt, initialised<>4 DO L2.s=GetTrain                {WHEN 140}
WHEN L2.s=GetTrain, L2.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=25         {WHEN 141}
WHEN L2.s=GetTrain, L2.t=0, FreeTrain<>0, TrainTrack=25                         {WHEN 142}
 DO	L2.t=FreeTrain, FreeTrain=0, spt[L2.t]=Occupied, TrainTrack=0
WHEN L2.s=GetTrain, L2.t<>0, *npN2L2.s=Free DO L2.s=GetCal, L2.wt=mst[L2.t]     {WHEN 143}
	$Color Track(3,19,1)=colt[L2.t]
WHEN L2.s=GetCal, L2.wt<>0, L2.p<>0                                             {WHEN 144}
 DO	L2.s=Calibrated, L2.wt=$SESSION, L2.wt=10+
WHEN L2.s=Calibrated, L2.t=*npN2L2.t                                            {WHEN 145}
 DO	wait 0.7, L2.s=Occupied, L2.wt=$SESSION, L2.wt=10+
	$Color Block(3,19,1)=colt[L2.t]
WHEN L2.s=Calibrated, $SESSION>L2.wt                                            {WHEN 146}
 DO	spt[L2.t]=Stopped, L2.p=0, L2.s=Stopped, L2.wt=$TIME, L2.wt=5+
WHEN L17.s=Free, initialised=1, CurL17=TRUE                                     {WHEN 147}
 DO	L17.s=Stopped, L17.wt=$TIME, L17.wt=3+
WHEN L17.s=Free, initialised=1, CurL17=FALSE, OptL17=TRUE                       {WHEN 148}
 OR  initialised=1, L17.s=Free, CurL17=FALSE, OptOL17=TRUE
 DO	L17.s=WaitClear
WHEN L17.s=Stopped, $TIME>=L17.wt, initialised<>4 DO L17.s=GetTrain             {WHEN 149}
WHEN L17.s=GetTrain, L17.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=27       {WHEN 150}
WHEN L17.s=GetTrain, L17.t=0, FreeTrain<>0, TrainTrack=27                       {WHEN 151}
 DO	L17.t=FreeTrain, FreeTrain=0, spt[L17.t]=Occupied, TrainTrack=0
WHEN L17.s=GetTrain, L17.t<>0, *lpTI2.s=Free DO L17.s=GetCal, L17.wt=mst[L17.t] {WHEN 152}
	$Color Track(7,12,1)=colt[L17.t]
WHEN L17.s=GetCal, L17.wt<>0, L17.p<>0                                          {WHEN 153}
 DO	L17.s=Calibrated, L17.wt=$SESSION, L17.wt=10+
WHEN L17.s=Calibrated, L17.t=*lpTI2.t                                           {WHEN 154}
 DO	wait 0.7, L17.s=Occupied, L17.wt=$SESSION, L17.wt=10+
	$Color Block(7,12,1)=colt[L17.t]
WHEN L17.s=Calibrated, $SESSION>L17.wt                                          {WHEN 155}
 DO	spt[L17.t]=Stopped, L17.p=0, L17.s=Stopped, L17.wt=$TIME, L17.wt=5+
WHEN L18.s=Free, initialised=1, CurL18=TRUE                                     {WHEN 156}
 DO	L18.s=Stopped, L18.wt=$TIME, L18.wt=3+
WHEN L18.s=Free, initialised=1, CurL18=FALSE, OptL18=TRUE                       {WHEN 157}
 OR  initialised=1, L18.s=Free, CurL18=FALSE, OptOL18=TRUE
 DO	L18.s=WaitClear
WHEN L18.s=Stopped, $TIME>=L18.wt, initialised<>4 DO L18.s=GetTrain             {WHEN 158}
WHEN L18.s=GetTrain, L18.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=31       {WHEN 159}
WHEN L18.s=GetTrain, L18.t=0, FreeTrain<>0, TrainTrack=31                       {WHEN 160}
 DO	L18.t=FreeTrain, FreeTrain=0, spt[L18.t]=Occupied, TrainTrack=0
WHEN L18.s=GetTrain, L18.t<>0, L19.s=Free DO L18.s=GetCal, L18.wt=mst[L18.t]    {WHEN 161}
	$Color Track(14,10,1)=colt[L18.t]
WHEN L18.s=GetCal, L18.wt<>0, L18.p<>0                                          {WHEN 162}
 DO	L18.s=Calibrated, L18.wt=$SESSION, L18.wt=10+
WHEN L18.s=Calibrated, L18.t=L19.t                                              {WHEN 163}
 DO	L18.s=Occupied, L18.wt=$SESSION, L18.wt=10+
	$Color Block(14,10,1)=colt[L18.t]
WHEN L18.s=Calibrated, $SESSION>L18.wt                                          {WHEN 164}
 DO	spt[L18.t]=Stopped, L18.p=0, L18.s=Stopped, L18.wt=$TIME, L18.wt=5+
WHEN L19.s=Free, initialised=1, CurL19=TRUE                                     {WHEN 165}
 DO	L19.s=Stopped, L19.wt=$TIME, L19.wt=3+
WHEN L19.s=Free, initialised=1, CurL19=FALSE, OptL19=TRUE                       {WHEN 166}
 OR  initialised=1, L19.s=Free, CurL19=FALSE, OptOL19=TRUE
 DO	L19.s=WaitClear
WHEN L19.s=Stopped, $TIME>=L19.wt, initialised<>4 DO L19.s=GetTrain             {WHEN 167}
WHEN L19.s=GetTrain, L19.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=32       {WHEN 168}
WHEN L19.s=GetTrain, L19.t=0, FreeTrain<>0, TrainTrack=32                       {WHEN 169}
 DO	L19.t=FreeTrain, FreeTrain=0, spt[L19.t]=Occupied, TrainTrack=0
WHEN L19.s=GetTrain, L19.t<>0, *npN1L19.s=Free                                  {WHEN 170}
 DO	L19.s=GetCal, L19.wt=mst[L19.t]
	$Color Track(14,7,1)=colt[L19.t]
WHEN L19.s=GetCal, L19.wt<>0, L19.p<>0                                          {WHEN 171}
 DO	L19.s=Calibrated, L19.wt=$SESSION, L19.wt=10+
WHEN L19.s=Calibrated, L19.t=*npN1L19.t                                         {WHEN 172}
 DO	wait 0.7, L19.s=Occupied, L19.wt=$SESSION, L19.wt=10+
	$Color Block(14,7,1)=colt[L19.t]
WHEN L19.s=Calibrated, $SESSION>L19.wt                                          {WHEN 173}
 DO	spt[L19.t]=Stopped, L19.p=0, L19.s=Stopped, L19.wt=$TIME, L19.wt=5+
WHEN L20.s=Free, initialised=1, CurL20=TRUE                                     {WHEN 174}
 DO	L20.s=Stopped, L20.wt=$TIME, L20.wt=3+
WHEN L20.s=Free, initialised=1, CurL20=FALSE, OptL20=TRUE                       {WHEN 175}
 OR  initialised=1, L20.s=Free, CurL20=FALSE, OptOL20=TRUE
 DO	L20.s=WaitClear
WHEN L20.s=Stopped, $TIME>=L20.wt, initialised<>4 DO L20.s=GetTrain             {WHEN 176}
WHEN L20.s=GetTrain, L20.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=33       {WHEN 177}
WHEN L20.s=GetTrain, L20.t=0, FreeTrain<>0, TrainTrack=33                       {WHEN 178}
 DO	L20.t=FreeTrain, FreeTrain=0, spt[L20.t]=Occupied, TrainTrack=0
WHEN L20.s=GetTrain, L20.t<>0, L21.s=Free DO L20.s=GetCal, L20.wt=mst[L20.t]    {WHEN 179}
	$Color Track(13,10,1)=colt[L20.t]
WHEN L20.s=GetCal, L20.wt<>0, L20.p<>0                                          {WHEN 180}
 DO	L20.s=Calibrated, L20.wt=$SESSION, L20.wt=10+
WHEN L20.s=Calibrated, L20.t=L21.t                                              {WHEN 181}
 DO	L20.s=Occupied, L20.wt=$SESSION, L20.wt=10+
	$Color Block(13,10,1)=colt[L20.t]
WHEN L20.s=Calibrated, $SESSION>L20.wt                                          {WHEN 182}
 DO	spt[L20.t]=Stopped, L20.p=0, L20.s=Stopped, L20.wt=$TIME, L20.wt=5+
WHEN L21.s=Free, initialised=1, CurL21=TRUE                                     {WHEN 183}
 DO	L21.s=Stopped, L21.wt=$TIME, L21.wt=3+
WHEN L21.s=Free, initialised=1, CurL21=FALSE, OptL21=TRUE                       {WHEN 184}
 OR  initialised=1, L21.s=Free, CurL21=FALSE, OptOL21=TRUE
 DO	L21.s=WaitClear
WHEN L21.s=Stopped, $TIME>=L21.wt, initialised<>4 DO L21.s=GetTrain             {WHEN 185}
WHEN L21.s=GetTrain, L21.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=35       {WHEN 186}
WHEN L21.s=GetTrain, L21.t=0, FreeTrain<>0, TrainTrack=35                       {WHEN 187}
 DO	L21.t=FreeTrain, FreeTrain=0, spt[L21.t]=Occupied, TrainTrack=0
WHEN L21.s=GetTrain, L21.t<>0, *npN1L21.s=Free                                  {WHEN 188}
 DO	L21.s=GetCal, L21.wt=mst[L21.t]
	$Color Track(13,7,1)=colt[L21.t]
WHEN L21.s=GetCal, L21.wt<>0, L21.p<>0                                          {WHEN 189}
 DO	L21.s=Calibrated, L21.wt=$SESSION, L21.wt=10+
WHEN L21.s=Calibrated, L21.t=*npN1L21.t                                         {WHEN 190}
 DO	wait 0.7, L21.s=Occupied, L21.wt=$SESSION, L21.wt=10+
	$Color Block(13,7,1)=colt[L21.t]
WHEN L21.s=Calibrated, $SESSION>L21.wt                                          {WHEN 191}
 DO	spt[L21.t]=Stopped, L21.p=0, L21.s=Stopped, L21.wt=$TIME, L21.wt=5+
WHEN P2.s=Free, initialised=1, CurP2=TRUE                                       {WHEN 192}
 DO	P2.s=Stopped, P2.wt=$TIME, P2.wt=3+
WHEN P2.s=Free, initialised=1, CurP2=FALSE, OptP2=TRUE                          {WHEN 193}
 OR  initialised=1, P2.s=Free, CurP2=FALSE, OptOP2=TRUE
 DO	P2.s=WaitClear
WHEN P2.s=Stopped, $TIME>=P2.wt, initialised<>4 DO P2.s=GetTrain                {WHEN 194}
WHEN P2.s=GetTrain, P2.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=44         {WHEN 195}
WHEN P2.s=GetTrain, P2.t=0, FreeTrain<>0, TrainTrack=44                         {WHEN 196}
 DO	P2.t=FreeTrain, FreeTrain=0, spt[P2.t]=Occupied, TrainTrack=0
WHEN P2.s=GetTrain, P2.t<>0, *npN2P2.s=Free DO P2.s=GetCal, P2.wt=mst[P2.t]     {WHEN 197}
	$Color Track(4,7,1)=colt[P2.t]
WHEN P2.s=GetCal, P2.wt<>0, P2.p<>0                                             {WHEN 198}
 DO	P2.s=Calibrated, P2.wt=$SESSION, P2.wt=10+
WHEN P2.s=Calibrated, P2.t=*npN2P2.t                                            {WHEN 199}
 DO	wait 0.7, P2.s=Occupied, P2.wt=$SESSION, P2.wt=10+
	$Color Block(4,7,1)=colt[P2.t]
WHEN P2.s=Calibrated, $SESSION>P2.wt                                            {WHEN 200}
 DO	spt[P2.t]=Stopped, P2.p=0, P2.s=Stopped, P2.wt=$TIME, P2.wt=5+
WHEN initialised=1 DO P1.s=Stopped, P1.wt=$TIME, P1.wt=99999+                   {WHEN 201}
WHEN P1.s=Stopped, $TIME>=P1.wt, initialised<>4 DO P1.s=GetTrain                {WHEN 202}
WHEN P1.s=GetTrain, P1.t=0, FreeTrain<>0, TrainTrack=0 DO TrainTrack=45         {WHEN 203}
WHEN P1.s=GetTrain, P1.t=0, FreeTrain<>0, TrainTrack=45                         {WHEN 204}
 DO	P1.t=FreeTrain, FreeTrain=0, spt[P1.t]=Occupied, TrainTrack=0
WHEN P1.s=GetTrain, P1.t<>0, *npN2P1.s=Free DO P1.s=GetCal, P1.wt=mst[P1.t]     {WHEN 205}
	$Color Track(1,1,1)=colt[P1.t]
WHEN P1.s=GetCal, P1.wt<>0, P1.p<>0                                             {WHEN 206}
 DO	P1.s=Calibrated, P1.wt=$SESSION, P1.wt=10+
WHEN P1.s=Calibrated, P1.t=*npN2P1.t                                            {WHEN 207}
 DO	wait 0.7, P1.s=Occupied, P1.wt=$SESSION, P1.wt=10+
	$Color Block(1,1,1)=colt[P1.t]
WHEN P1.s=Calibrated, $SESSION>P1.wt                                            {WHEN 208}
 DO	spt[P1.t]=Stopped, P1.p=0, P1.s=Stopped, P1.wt=$TIME, P1.wt=5+

{ Per-train display management code }
{ WHEN Goods button pressed DO Type=goods }
{ WHEN Local button pressed DO Type=local }
{ WHEN Passenger button pressed DO Type=passenger }
{ WHEN Express button pressed DO Type=express }
{ WHEN Train is free DO Clear board }
{ WHEN Train is occupied DO Set colour on board }
{ WHEN Min speed down pressed DO reduce min speed }
{ WHEN Min speed up pressed DO increase min speed }
{ WHEN Min speed changes DO Update screen }
{ WHEN Measured min speed changes DO Update screen }
{ WHEN Full speed down pressed DO reduce full speed }
{ WHEN Full speed up pressed DO increase full speed }
{ WHEN Full speed changes DO Update screen }
{ WHEN Measured full speed changes DO Update screen }

WHEN $Left_Mouse=(4,2,2)                                                        {WHEN 209}
 DO	tt[1]=Goods, $Erase Message(4,2,2), $Draw Message(4,2,2)=" Goods"
WHEN $Left_Mouse=(5,2,2)                                                        {WHEN 210}
 DO	tt[1]=Local, $Erase Message(4,2,2), $Draw Message(4,2,2)=" Local"
WHEN $Left_Mouse=(6,2,2)                                                        {WHEN 211}
 DO	tt[1]=Passenger, $Erase Message(4,2,2), $Draw Message(4,2,2)=" Passenger"
WHEN $Left_Mouse=(7,2,2)                                                        {WHEN 212}
 DO	tt[1]=Express, $Erase Message(4,2,2), $Draw Message(4,2,2)=" Express"
WHEN initialised=2, spt[1]=Free                                                 {WHEN 213}
 DO	$Color Track(2, 2, 2)=coltx, $Color Track(3, 2, 2)=coltx, $Erase Message(4, 2, 2)
WHEN spt[1]<>Free DO $Color Track(2, 2, 2)=0, $Color Track(3, 2, 2)=colt[1]     {WHEN 214}
WHILE $Left_Mouse=(8,2,2), mst[1]>1 DO mst[1]=2-                                {WHEN 215}
WHILE $Right_Mouse=(8,2,2), mst[1]<fst[1] DO mst[1]=2+                          {WHEN 216}
WHILE mst[1]<>omst[1]                                                            {WHEN 217}
 DO	$Erase Message(8,2,2), omst[1]=mst[1], $Draw Message(8,2,2)="@omst[1]"
WHILE mmst[1]<>ommst[1]                                                          {WHEN 218}
 DO	$Erase Message(9,2,2), ommst[1]=mmst[1], $Draw Message(9,2,2)="@ommst[1]"
WHILE $Left_Mouse=(10,2,2), fst[1]>mst[1] DO fst[1]=2-                          {WHEN 219}
WHILE $Right_Mouse=(10,2,2), fst[1]<99 DO fst[1]=2+                             {WHEN 220}
WHILE fst[1]<>ofst[1]                                                            {WHEN 221}
 DO	$Erase Message(10,2,2), ofst[1]=fst[1], $Draw Message(10,2,2)="@ofst[1]"
WHILE mfst[1]<>omfst[1]                                                          {WHEN 222}
 DO	$Erase Message(11,2,2), omfst[1]=mfst[1], $Draw Message(11,2,2)="@omfst[1]"
WHEN $Left_Mouse=(4,3,2)                                                        {WHEN 223}
 DO	tt[2]=Goods, $Erase Message(4,3,2), $Draw Message(4,3,2)=" Goods"
WHEN $Left_Mouse=(5,3,2)                                                        {WHEN 224}
 DO	tt[2]=Local, $Erase Message(4,3,2), $Draw Message(4,3,2)=" Local"
WHEN $Left_Mouse=(6,3,2)                                                        {WHEN 225}
 DO	tt[2]=Passenger, $Erase Message(4,3,2), $Draw Message(4,3,2)=" Passenger"
WHEN $Left_Mouse=(7,3,2)                                                        {WHEN 226}
 DO	tt[2]=Express, $Erase Message(4,3,2), $Draw Message(4,3,2)=" Express"
WHEN initialised=2, spt[2]=Free                                                 {WHEN 227}
 DO	$Color Track(2, 3, 2)=coltx, $Color Track(3, 3, 2)=coltx, $Erase Message(4, 3, 2)
WHEN spt[2]<>Free DO $Color Track(2, 3, 2)=0, $Color Track(3, 3, 2)=colt[2]     {WHEN 228}
WHILE $Left_Mouse=(8,3,2), mst[2]>1 DO mst[2]=2-                                {WHEN 229}
WHILE $Right_Mouse=(8,3,2), mst[2]<fst[2] DO mst[2]=2+                          {WHEN 230}
WHILE mst[2]<>omst[2]                                                            {WHEN 231}
 DO	$Erase Message(8,3,2), omst[2]=mst[2], $Draw Message(8,3,2)="@omst[2]"
WHILE mmst[2]<>ommst[2]                                                          {WHEN 232}
 DO	$Erase Message(9,3,2), ommst[2]=mmst[2], $Draw Message(9,3,2)="@ommst[2]"
WHILE $Left_Mouse=(10,3,2), fst[2]>mst[2] DO fst[2]=2-                          {WHEN 233}
WHILE $Right_Mouse=(10,3,2), fst[2]<99 DO fst[2]=2+                             {WHEN 234}
WHILE fst[2]<>ofst[2]                                                            {WHEN 235}
 DO	$Erase Message(10,3,2), ofst[2]=fst[2], $Draw Message(10,3,2)="@ofst[2]"
WHILE mfst[2]<>omfst[2]                                                          {WHEN 236}
 DO	$Erase Message(11,3,2), omfst[2]=mfst[2], $Draw Message(11,3,2)="@omfst[2]"
WHEN $Left_Mouse=(4,4,2)                                                        {WHEN 237}
 DO	tt[3]=Goods, $Erase Message(4,4,2), $Draw Message(4,4,2)=" Goods"
WHEN $Left_Mouse=(5,4,2)                                                        {WHEN 238}
 DO	tt[3]=Local, $Erase Message(4,4,2), $Draw Message(4,4,2)=" Local"
WHEN $Left_Mouse=(6,4,2)                                                        {WHEN 239}
 DO	tt[3]=Passenger, $Erase Message(4,4,2), $Draw Message(4,4,2)=" Passenger"
WHEN $Left_Mouse=(7,4,2)                                                        {WHEN 240}
 DO	tt[3]=Express, $Erase Message(4,4,2), $Draw Message(4,4,2)=" Express"
WHEN initialised=2, spt[3]=Free                                                 {WHEN 241}
 DO	$Color Track(2, 4, 2)=coltx, $Color Track(3, 4, 2)=coltx, $Erase Message(4, 4, 2)
WHEN spt[3]<>Free DO $Color Track(2, 4, 2)=0, $Color Track(3, 4, 2)=colt[3]     {WHEN 242}
WHILE $Left_Mouse=(8,4,2), mst[3]>1 DO mst[3]=2-                                {WHEN 243}
WHILE $Right_Mouse=(8,4,2), mst[3]<fst[3] DO mst[3]=2+                          {WHEN 244}
WHILE mst[3]<>omst[3]                                                            {WHEN 245}
 DO	$Erase Message(8,4,2), omst[3]=mst[3], $Draw Message(8,4,2)="@omst[3]"
WHILE mmst[3]<>ommst[3]                                                          {WHEN 246}
 DO	$Erase Message(9,4,2), ommst[3]=mmst[3], $Draw Message(9,4,2)="@ommst[3]"
WHILE $Left_Mouse=(10,4,2), fst[3]>mst[3] DO fst[3]=2-                          {WHEN 247}
WHILE $Right_Mouse=(10,4,2), fst[3]<99 DO fst[3]=2+                             {WHEN 248}
WHILE fst[3]<>ofst[3]                                                            {WHEN 249}
 DO	$Erase Message(10,4,2), ofst[3]=fst[3], $Draw Message(10,4,2)="@ofst[3]"
WHILE mfst[3]<>omfst[3]                                                          {WHEN 250}
 DO	$Erase Message(11,4,2), omfst[3]=mfst[3], $Draw Message(11,4,2)="@omfst[3]"
WHEN $Left_Mouse=(4,5,2)                                                        {WHEN 251}
 DO	tt[4]=Goods, $Erase Message(4,5,2), $Draw Message(4,5,2)=" Goods"
WHEN $Left_Mouse=(5,5,2)                                                        {WHEN 252}
 DO	tt[4]=Local, $Erase Message(4,5,2), $Draw Message(4,5,2)=" Local"
WHEN $Left_Mouse=(6,5,2)                                                        {WHEN 253}
 DO	tt[4]=Passenger, $Erase Message(4,5,2), $Draw Message(4,5,2)=" Passenger"
WHEN $Left_Mouse=(7,5,2)                                                        {WHEN 254}
 DO	tt[4]=Express, $Erase Message(4,5,2), $Draw Message(4,5,2)=" Express"
WHEN initialised=2, spt[4]=Free                                                 {WHEN 255}
 DO	$Color Track(2, 5, 2)=coltx, $Color Track(3, 5, 2)=coltx, $Erase Message(4, 5, 2)
WHEN spt[4]<>Free DO $Color Track(2, 5, 2)=0, $Color Track(3, 5, 2)=colt[4]     {WHEN 256}
WHILE $Left_Mouse=(8,5,2), mst[4]>1 DO mst[4]=2-                                {WHEN 257}
WHILE $Right_Mouse=(8,5,2), mst[4]<fst[4] DO mst[4]=2+                          {WHEN 258}
WHILE mst[4]<>omst[4]                                                            {WHEN 259}
 DO	$Erase Message(8,5,2), omst[4]=mst[4], $Draw Message(8,5,2)="@omst[4]"
WHILE mmst[4]<>ommst[4]                                                          {WHEN 260}
 DO	$Erase Message(9,5,2), ommst[4]=mmst[4], $Draw Message(9,5,2)="@ommst[4]"
WHILE $Left_Mouse=(10,5,2), fst[4]>mst[4] DO fst[4]=2-                          {WHEN 261}
WHILE $Right_Mouse=(10,5,2), fst[4]<99 DO fst[4]=2+                             {WHEN 262}
WHILE fst[4]<>ofst[4]                                                            {WHEN 263}
 DO	$Erase Message(10,5,2), ofst[4]=fst[4], $Draw Message(10,5,2)="@ofst[4]"
WHILE mfst[4]<>omfst[4]                                                          {WHEN 264}
 DO	$Erase Message(11,5,2), omfst[4]=mfst[4], $Draw Message(11,5,2)="@omfst[4]"
WHEN $Left_Mouse=(4,6,2)                                                        {WHEN 265}
 DO	tt[5]=Goods, $Erase Message(4,6,2), $Draw Message(4,6,2)=" Goods"
WHEN $Left_Mouse=(5,6,2)                                                        {WHEN 266}
 DO	tt[5]=Local, $Erase Message(4,6,2), $Draw Message(4,6,2)=" Local"
WHEN $Left_Mouse=(6,6,2)                                                        {WHEN 267}
 DO	tt[5]=Passenger, $Erase Message(4,6,2), $Draw Message(4,6,2)=" Passenger"
WHEN $Left_Mouse=(7,6,2)                                                        {WHEN 268}
 DO	tt[5]=Express, $Erase Message(4,6,2), $Draw Message(4,6,2)=" Express"
WHEN initialised=2, spt[5]=Free                                                 {WHEN 269}
 DO	$Color Track(2, 6, 2)=coltx, $Color Track(3, 6, 2)=coltx, $Erase Message(4, 6, 2)
WHEN spt[5]<>Free DO $Color Track(2, 6, 2)=0, $Color Track(3, 6, 2)=colt[5]     {WHEN 270}
WHILE $Left_Mouse=(8,6,2), mst[5]>1 DO mst[5]=2-                                {WHEN 271}
WHILE $Right_Mouse=(8,6,2), mst[5]<fst[5] DO mst[5]=2+                          {WHEN 272}
WHILE mst[5]<>omst[5]                                                            {WHEN 273}
 DO	$Erase Message(8,6,2), omst[5]=mst[5], $Draw Message(8,6,2)="@omst[5]"
WHILE mmst[5]<>ommst[5]                                                          {WHEN 274}
 DO	$Erase Message(9,6,2), ommst[5]=mmst[5], $Draw Message(9,6,2)="@ommst[5]"
WHILE $Left_Mouse=(10,6,2), fst[5]>mst[5] DO fst[5]=2-                          {WHEN 275}
WHILE $Right_Mouse=(10,6,2), fst[5]<99 DO fst[5]=2+                             {WHEN 276}
WHILE fst[5]<>ofst[5]                                                            {WHEN 277}
 DO	$Erase Message(10,6,2), ofst[5]=fst[5], $Draw Message(10,6,2)="@ofst[5]"
WHILE mfst[5]<>omfst[5]                                                          {WHEN 278}
 DO	$Erase Message(11,6,2), omfst[5]=mfst[5], $Draw Message(11,6,2)="@omfst[5]"
WHEN $Left_Mouse=(4,7,2)                                                        {WHEN 279}
 DO	tt[6]=Goods, $Erase Message(4,7,2), $Draw Message(4,7,2)=" Goods"
WHEN $Left_Mouse=(5,7,2)                                                        {WHEN 280}
 DO	tt[6]=Local, $Erase Message(4,7,2), $Draw Message(4,7,2)=" Local"
WHEN $Left_Mouse=(6,7,2)                                                        {WHEN 281}
 DO	tt[6]=Passenger, $Erase Message(4,7,2), $Draw Message(4,7,2)=" Passenger"
WHEN $Left_Mouse=(7,7,2)                                                        {WHEN 282}
 DO	tt[6]=Express, $Erase Message(4,7,2), $Draw Message(4,7,2)=" Express"
WHEN initialised=2, spt[6]=Free                                                 {WHEN 283}
 DO	$Color Track(2, 7, 2)=coltx, $Color Track(3, 7, 2)=coltx, $Erase Message(4, 7, 2)
WHEN spt[6]<>Free DO $Color Track(2, 7, 2)=0, $Color Track(3, 7, 2)=colt[6]     {WHEN 284}
WHILE $Left_Mouse=(8,7,2), mst[6]>1 DO mst[6]=2-                                {WHEN 285}
WHILE $Right_Mouse=(8,7,2), mst[6]<fst[6] DO mst[6]=2+                          {WHEN 286}
WHILE mst[6]<>omst[6]                                                            {WHEN 287}
 DO	$Erase Message(8,7,2), omst[6]=mst[6], $Draw Message(8,7,2)="@omst[6]"
WHILE mmst[6]<>ommst[6]                                                          {WHEN 288}
 DO	$Erase Message(9,7,2), ommst[6]=mmst[6], $Draw Message(9,7,2)="@ommst[6]"
WHILE $Left_Mouse=(10,7,2), fst[6]>mst[6] DO fst[6]=2-                          {WHEN 289}
WHILE $Right_Mouse=(10,7,2), fst[6]<99 DO fst[6]=2+                             {WHEN 290}
WHILE fst[6]<>ofst[6]                                                            {WHEN 291}
 DO	$Erase Message(10,7,2), ofst[6]=fst[6], $Draw Message(10,7,2)="@ofst[6]"
WHILE mfst[6]<>omfst[6]                                                          {WHEN 292}
 DO	$Erase Message(11,7,2), omfst[6]=mfst[6], $Draw Message(11,7,2)="@omfst[6]"
{ WHEN Up momentum down pressed DO reduce & display }
{ WHEN Up momentum up pressed DO increase & display }
{ WHEN Down momentum down pressed DO reduce & display }
{ WHEN Down momentum up pressed DO increase & display }
WHILE $Left_Mouse=(6,1,3), upmom>0                                               {WHEN 293}
 DO	$Erase Message(6,1,3), upmom=-, $Draw Message(6,1,3)="@upmom"
WHILE $Right_Mouse=(6,1,3), upmom<8                                              {WHEN 294}
 DO	$Erase Message(6,1,3), upmom=+, $Draw Message(6,1,3)="@upmom"
WHILE $Left_Mouse=(6,2,3), downmom>0                                             {WHEN 295}
 DO	$Erase Message(6,2,3), downmom=-, $Draw Message(6,2,3)="@downmom"
WHILE $Right_Mouse=(6,2,3), downmom<8                                            {WHEN 296}
 DO	$Erase Message(6,2,3), downmom=+, $Draw Message(6,2,3)="@downmom"

{ WHEN train is free DO advertise self }

WHEN spt[1]=Free, FreeTrain=0 DO FreeTrain=1                                    {WHEN 297}
WHEN spt[1]<>Free, spt[2]=Free, FreeTrain=0 DO FreeTrain=2                      {WHEN 298}
WHEN spt[1]<>Free, spt[2]<>0, spt[3]=Free, FreeTrain=0 DO FreeTrain=3           {WHEN 299}
WHEN spt[1]<>Free, spt[2]<>0, spt[3]<>0, spt[4]=Free, FreeTrain=0               {WHEN 300}
 DO	FreeTrain=4
WHEN spt[1]<>Free, spt[2]<>0, spt[3]<>0, spt[4]<>0, spt[5]=Free, FreeTrain=0    {WHEN 301}
 DO	FreeTrain=5
WHEN spt[1]<>Free, spt[2]<>0, spt[3]<>0, spt[4]<>0, spt[5]<>0, spt[6]=Free, FreeTrain=0
 DO	FreeTrain=6                                                             {WHEN 302}

{ Per-train operational code }

{ WHEN TrainDir=Fwd DO cab forward }
{ WHEN TrainDir=Rev DO cab reverse }
{ WHEN Cab=Free or stopped DO speed 0, forward, brake off }
{ WHEN Cab=Brake & not changing OR Pause DO Brake_ON }
{ WHEN Cab=Brake & changing DO Brake_ON both cabs }
{ WHEN Cab=MinSpeed & not changing DO Speed=mst, brake off, downmom }
{ WHEN Cab=MinSpeed & changing DO Speed=mst, brake off, downmom on old cab, new=mst }
{ WHEN Cab=FullSpeed & not changing DO Speed=fst, brake off, upmom }
{ WHEN Cab=FullSpeed from stopped DO Speed=mst...fst, brake off, upmom }
{ WHEN cab switch time DO copy settings and switchover }
{ WHEN Cab=CalCount, timeout expired DO increase speed, reset timeout }
{ WHEN Cab=EndCal DO set mst=speed, fst=mst+5, Brake }

WHEN tdirt[1]=Fwd, cabt[1]<>0 DO c=cabt[1], cab[c]=(FORWARD), ct1=(FORWARD)     {WHEN 303}
WHEN tdirt[1]=Rev, cabt[1]<>0 DO c=cabt[1], cab[c]=(REVERSE), ct1=(REVERSE)     {WHEN 304}
WHEN spt[1]=Free, ncabt[1]=0, cabt[1]<>0                                        {WHEN 305}
 OR  spt[1]=Stopped, ncabt[1]=0, cabt[1]<>0
 DO	c=cabt[1], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct1=cab[c], tdirt[1]=Fwd, ncabt[1]=0
	tc[c]=0, cabt[1]=0, ospt[1]=spt[1]
WHEN spt[1]=Braking, spt[1]<>ospt[1], cabt[1]<>0, ncabt[1]=0 OR initialised=5   {WHEN 306}
 DO	c=cabt[1], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[1]=spt[1], ct1=cab[c]
WHEN spt[1]=Braking, spt[1]<>ospt[1], cabt[1]<>0, ncabt[1]<>0                   {WHEN 307}
 DO	c=cabt[1], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct1=cab[c],
	d=ncabt[1], cab[d]=cab[c], ospt[1]=spt[1]
WHEN spt[1]=DoMin, spt[1]<>ospt[1], cabt[1]<>0, ncabt[1]=0                      {WHEN 308}
 DO	c=cabt[1], cab[c]=mst[1](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[1]=spt[1]
	ct1=cab[c]
WHEN spt[1]=DoMin, spt[1]<>ospt[1], cabt[1]<>0, ncabt[1]<>0, initialised=2      {WHEN 309}
 DO	c=cabt[1], d=&cab[c], *d=mst[1],d=3+,*d=downmom, d=ncabt[1], cab[d]=cab[c],
	ospt[1]=spt[1], ct1=cab[c]
WHEN spt[1]=DoFull, ospt[1]>=DoMin, ospt[1]<=DoFull, cabt[1]<>0, ncabt[1]=0, initialised=2{WHEN 310}
 DO	c=cabt[1], cab[c]=fst[1](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[1]=spt[1]
	ct1=cab[c], spt[1]=Booked
WHEN spt[1]=DoFull, ospt[1]<>DoMin, ospt[1]<>DoFull, cabt[1]<>0, ncabt[1]=0, initialised=2
 DO	c=cabt[1], cab[c]=mst[1](BRAKE_OFF, MOMENTUM_1),                        {WHEN 311}
	ct1=cab[c], wait 1
	c=cabt[1], d=&cab[c], *d=fst[1], d=3+,*d=upmom
	ospt[1]=spt[1], ct1=cab[c], spt[1]=Booked
WHEN ncabt[1]<>0 DO c=cabt[1], d=ncabt[1], cab[d]=cab[c],                       {WHEN 312}
	wait 0.2, d=ncabt[1], tc[d]=1, wait 0.2
	c=cabt[1], tc[c]=99, cabt[1]=ncabt[1], ncabt[1]=0
WHILE spt[1]=CalCount, cabt[1]<>99                                               {WHEN 313}
 DO	c=cabt[1], cab[c]=2+(BRAKE_OFF), ct1=cab[c], wait 1
WHEN spt[1]=EndCal                                                              {WHEN 314}
 DO	c=cabt[1], mst[1]=cab[c], fst[1]=mst[1], fst[1]=10+, spt[1]=Braking
WHEN tdirt[2]=Fwd, cabt[2]<>0 DO c=cabt[2], cab[c]=(FORWARD), ct2=(FORWARD)     {WHEN 315}
WHEN tdirt[2]=Rev, cabt[2]<>0 DO c=cabt[2], cab[c]=(REVERSE), ct2=(REVERSE)     {WHEN 316}
WHEN spt[2]=Free, ncabt[2]=0, cabt[2]<>0                                        {WHEN 317}
 OR  spt[2]=Stopped, ncabt[2]=0, cabt[2]<>0
 DO	c=cabt[2], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct2=cab[c], tdirt[2]=Fwd, ncabt[2]=0
	tc[c]=0, cabt[2]=0, ospt[2]=spt[2]
WHEN spt[2]=Braking, spt[2]<>ospt[2], cabt[2]<>0, ncabt[2]=0 OR initialised=5   {WHEN 318}
 DO	c=cabt[2], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[2]=spt[2], ct2=cab[c]
WHEN spt[2]=Braking, spt[2]<>ospt[2], cabt[2]<>0, ncabt[2]<>0                   {WHEN 319}
 DO	c=cabt[2], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct2=cab[c],
	d=ncabt[2], cab[d]=cab[c], ospt[2]=spt[2]
WHEN spt[2]=DoMin, spt[2]<>ospt[2], cabt[2]<>0, ncabt[2]=0                      {WHEN 320}
 DO	c=cabt[2], cab[c]=mst[2](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[2]=spt[2]
	ct2=cab[c]
WHEN spt[2]=DoMin, spt[2]<>ospt[2], cabt[2]<>0, ncabt[2]<>0, initialised=2      {WHEN 321}
 DO	c=cabt[2], d=&cab[c], *d=mst[2],d=3+,*d=downmom, d=ncabt[2], cab[d]=cab[c],
	ospt[2]=spt[2], ct2=cab[c]
WHEN spt[2]=DoFull, ospt[2]>=DoMin, ospt[2]<=DoFull, cabt[2]<>0, ncabt[2]=0, initialised=2{WHEN 322}
 DO	c=cabt[2], cab[c]=fst[2](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[2]=spt[2]
	ct2=cab[c], spt[2]=Booked
WHEN spt[2]=DoFull, ospt[2]<>DoMin, ospt[2]<>DoFull, cabt[2]<>0, ncabt[2]=0, initialised=2
 DO	c=cabt[2], cab[c]=mst[2](BRAKE_OFF, MOMENTUM_1),                        {WHEN 323}
	ct2=cab[c], wait 1
	c=cabt[2], d=&cab[c], *d=fst[2], d=3+,*d=upmom
	ospt[2]=spt[2], ct2=cab[c], spt[2]=Booked
WHEN ncabt[2]<>0 DO c=cabt[2], d=ncabt[2], cab[d]=cab[c],                       {WHEN 324}
	wait 0.2, d=ncabt[2], tc[d]=2, wait 0.2
	c=cabt[2], tc[c]=99, cabt[2]=ncabt[2], ncabt[2]=0
WHILE spt[2]=CalCount, cabt[2]<>99                                               {WHEN 325}
 DO	c=cabt[2], cab[c]=2+(BRAKE_OFF), ct2=cab[c], wait 1
WHEN spt[2]=EndCal                                                              {WHEN 326}
 DO	c=cabt[2], mst[2]=cab[c], fst[2]=mst[2], fst[2]=10+, spt[2]=Braking
WHEN tdirt[3]=Fwd, cabt[3]<>0 DO c=cabt[3], cab[c]=(FORWARD), ct3=(FORWARD)     {WHEN 327}
WHEN tdirt[3]=Rev, cabt[3]<>0 DO c=cabt[3], cab[c]=(REVERSE), ct3=(REVERSE)     {WHEN 328}
WHEN spt[3]=Free, ncabt[3]=0, cabt[3]<>0                                        {WHEN 329}
 OR  spt[3]=Stopped, ncabt[3]=0, cabt[3]<>0
 DO	c=cabt[3], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct3=cab[c], tdirt[3]=Fwd, ncabt[3]=0
	tc[c]=0, cabt[3]=0, ospt[3]=spt[3]
WHEN spt[3]=Braking, spt[3]<>ospt[3], cabt[3]<>0, ncabt[3]=0 OR initialised=5   {WHEN 330}
 DO	c=cabt[3], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[3]=spt[3], ct3=cab[c]
WHEN spt[3]=Braking, spt[3]<>ospt[3], cabt[3]<>0, ncabt[3]<>0                   {WHEN 331}
 DO	c=cabt[3], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct3=cab[c],
	d=ncabt[3], cab[d]=cab[c], ospt[3]=spt[3]
WHEN spt[3]=DoMin, spt[3]<>ospt[3], cabt[3]<>0, ncabt[3]=0                      {WHEN 332}
 DO	c=cabt[3], cab[c]=mst[3](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[3]=spt[3]
	ct3=cab[c]
WHEN spt[3]=DoMin, spt[3]<>ospt[3], cabt[3]<>0, ncabt[3]<>0, initialised=2      {WHEN 333}
 DO	c=cabt[3], d=&cab[c], *d=mst[3],d=3+,*d=downmom, d=ncabt[3], cab[d]=cab[c],
	ospt[3]=spt[3], ct3=cab[c]
WHEN spt[3]=DoFull, ospt[3]>=DoMin, ospt[3]<=DoFull, cabt[3]<>0, ncabt[3]=0, initialised=2{WHEN 334}
 DO	c=cabt[3], cab[c]=fst[3](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[3]=spt[3]
	ct3=cab[c], spt[3]=Booked
WHEN spt[3]=DoFull, ospt[3]<>DoMin, ospt[3]<>DoFull, cabt[3]<>0, ncabt[3]=0, initialised=2
 DO	c=cabt[3], cab[c]=mst[3](BRAKE_OFF, MOMENTUM_1),                        {WHEN 335}
	ct3=cab[c], wait 1
	c=cabt[3], d=&cab[c], *d=fst[3], d=3+,*d=upmom
	ospt[3]=spt[3], ct3=cab[c], spt[3]=Booked
WHEN ncabt[3]<>0 DO c=cabt[3], d=ncabt[3], cab[d]=cab[c],                       {WHEN 336}
	wait 0.2, d=ncabt[3], tc[d]=3, wait 0.2
	c=cabt[3], tc[c]=99, cabt[3]=ncabt[3], ncabt[3]=0
WHILE spt[3]=CalCount, cabt[3]<>99                                               {WHEN 337}
 DO	c=cabt[3], cab[c]=2+(BRAKE_OFF), ct3=cab[c], wait 1
WHEN spt[3]=EndCal                                                              {WHEN 338}
 DO	c=cabt[3], mst[3]=cab[c], fst[3]=mst[3], fst[3]=10+, spt[3]=Braking
WHEN tdirt[4]=Fwd, cabt[4]<>0 DO c=cabt[4], cab[c]=(FORWARD), ct4=(FORWARD)     {WHEN 339}
WHEN tdirt[4]=Rev, cabt[4]<>0 DO c=cabt[4], cab[c]=(REVERSE), ct4=(REVERSE)     {WHEN 340}
WHEN spt[4]=Free, ncabt[4]=0, cabt[4]<>0                                        {WHEN 341}
 OR  spt[4]=Stopped, ncabt[4]=0, cabt[4]<>0
 DO	c=cabt[4], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct4=cab[c], tdirt[4]=Fwd, ncabt[4]=0
	tc[c]=0, cabt[4]=0, ospt[4]=spt[4]
WHEN spt[4]=Braking, spt[4]<>ospt[4], cabt[4]<>0, ncabt[4]=0 OR initialised=5   {WHEN 342}
 DO	c=cabt[4], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[4]=spt[4], ct4=cab[c]
WHEN spt[4]=Braking, spt[4]<>ospt[4], cabt[4]<>0, ncabt[4]<>0                   {WHEN 343}
 DO	c=cabt[4], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct4=cab[c],
	d=ncabt[4], cab[d]=cab[c], ospt[4]=spt[4]
WHEN spt[4]=DoMin, spt[4]<>ospt[4], cabt[4]<>0, ncabt[4]=0                      {WHEN 344}
 DO	c=cabt[4], cab[c]=mst[4](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[4]=spt[4]
	ct4=cab[c]
WHEN spt[4]=DoMin, spt[4]<>ospt[4], cabt[4]<>0, ncabt[4]<>0, initialised=2      {WHEN 345}
 DO	c=cabt[4], d=&cab[c], *d=mst[4],d=3+,*d=downmom, d=ncabt[4], cab[d]=cab[c],
	ospt[4]=spt[4], ct4=cab[c]
WHEN spt[4]=DoFull, ospt[4]>=DoMin, ospt[4]<=DoFull, cabt[4]<>0, ncabt[4]=0, initialised=2{WHEN 346}
 DO	c=cabt[4], cab[c]=fst[4](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[4]=spt[4]
	ct4=cab[c], spt[4]=Booked
WHEN spt[4]=DoFull, ospt[4]<>DoMin, ospt[4]<>DoFull, cabt[4]<>0, ncabt[4]=0, initialised=2
 DO	c=cabt[4], cab[c]=mst[4](BRAKE_OFF, MOMENTUM_1),                        {WHEN 347}
	ct4=cab[c], wait 1
	c=cabt[4], d=&cab[c], *d=fst[4], d=3+,*d=upmom
	ospt[4]=spt[4], ct4=cab[c], spt[4]=Booked
WHEN ncabt[4]<>0 DO c=cabt[4], d=ncabt[4], cab[d]=cab[c],                       {WHEN 348}
	wait 0.2, d=ncabt[4], tc[d]=4, wait 0.2
	c=cabt[4], tc[c]=99, cabt[4]=ncabt[4], ncabt[4]=0
WHILE spt[4]=CalCount, cabt[4]<>99                                               {WHEN 349}
 DO	c=cabt[4], cab[c]=2+(BRAKE_OFF), ct4=cab[c], wait 1
WHEN spt[4]=EndCal                                                              {WHEN 350}
 DO	c=cabt[4], mst[4]=cab[c], fst[4]=mst[4], fst[4]=10+, spt[4]=Braking
WHEN tdirt[5]=Fwd, cabt[5]<>0 DO c=cabt[5], cab[c]=(FORWARD), ct5=(FORWARD)     {WHEN 351}
WHEN tdirt[5]=Rev, cabt[5]<>0 DO c=cabt[5], cab[c]=(REVERSE), ct5=(REVERSE)     {WHEN 352}
WHEN spt[5]=Free, ncabt[5]=0, cabt[5]<>0                                        {WHEN 353}
 OR  spt[5]=Stopped, ncabt[5]=0, cabt[5]<>0
 DO	c=cabt[5], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct5=cab[c], tdirt[5]=Fwd, ncabt[5]=0
	tc[c]=0, cabt[5]=0, ospt[5]=spt[5]
WHEN spt[5]=Braking, spt[5]<>ospt[5], cabt[5]<>0, ncabt[5]=0 OR initialised=5   {WHEN 354}
 DO	c=cabt[5], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[5]=spt[5], ct5=cab[c]
WHEN spt[5]=Braking, spt[5]<>ospt[5], cabt[5]<>0, ncabt[5]<>0                   {WHEN 355}
 DO	c=cabt[5], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct5=cab[c],
	d=ncabt[5], cab[d]=cab[c], ospt[5]=spt[5]
WHEN spt[5]=DoMin, spt[5]<>ospt[5], cabt[5]<>0, ncabt[5]=0                      {WHEN 356}
 DO	c=cabt[5], cab[c]=mst[5](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[5]=spt[5]
	ct5=cab[c]
WHEN spt[5]=DoMin, spt[5]<>ospt[5], cabt[5]<>0, ncabt[5]<>0, initialised=2      {WHEN 357}
 DO	c=cabt[5], d=&cab[c], *d=mst[5],d=3+,*d=downmom, d=ncabt[5], cab[d]=cab[c],
	ospt[5]=spt[5], ct5=cab[c]
WHEN spt[5]=DoFull, ospt[5]>=DoMin, ospt[5]<=DoFull, cabt[5]<>0, ncabt[5]=0, initialised=2{WHEN 358}
 DO	c=cabt[5], cab[c]=fst[5](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[5]=spt[5]
	ct5=cab[c], spt[5]=Booked
WHEN spt[5]=DoFull, ospt[5]<>DoMin, ospt[5]<>DoFull, cabt[5]<>0, ncabt[5]=0, initialised=2
 DO	c=cabt[5], cab[c]=mst[5](BRAKE_OFF, MOMENTUM_1),                        {WHEN 359}
	ct5=cab[c], wait 1
	c=cabt[5], d=&cab[c], *d=fst[5], d=3+,*d=upmom
	ospt[5]=spt[5], ct5=cab[c], spt[5]=Booked
WHEN ncabt[5]<>0 DO c=cabt[5], d=ncabt[5], cab[d]=cab[c],                       {WHEN 360}
	wait 0.2, d=ncabt[5], tc[d]=5, wait 0.2
	c=cabt[5], tc[c]=99, cabt[5]=ncabt[5], ncabt[5]=0
WHILE spt[5]=CalCount, cabt[5]<>99                                               {WHEN 361}
 DO	c=cabt[5], cab[c]=2+(BRAKE_OFF), ct5=cab[c], wait 1
WHEN spt[5]=EndCal                                                              {WHEN 362}
 DO	c=cabt[5], mst[5]=cab[c], fst[5]=mst[5], fst[5]=10+, spt[5]=Braking
WHEN tdirt[6]=Fwd, cabt[6]<>0 DO c=cabt[6], cab[c]=(FORWARD), ct6=(FORWARD)     {WHEN 363}
WHEN tdirt[6]=Rev, cabt[6]<>0 DO c=cabt[6], cab[c]=(REVERSE), ct6=(REVERSE)     {WHEN 364}
WHEN spt[6]=Free, ncabt[6]=0, cabt[6]<>0                                        {WHEN 365}
 OR  spt[6]=Stopped, ncabt[6]=0, cabt[6]<>0
 DO	c=cabt[6], cab[c]=0(BRAKE_OFF, MOMENTUM_0)
	ct6=cab[c], tdirt[6]=Fwd, ncabt[6]=0
	tc[c]=0, cabt[6]=0, ospt[6]=spt[6]
WHEN spt[6]=Braking, spt[6]<>ospt[6], cabt[6]<>0, ncabt[6]=0 OR initialised=5   {WHEN 366}
 DO	c=cabt[6], cab[c]=0(BRAKE_ON, MOMENTUM_1),
	ospt[6]=spt[6], ct6=cab[c]
WHEN spt[6]=Braking, spt[6]<>ospt[6], cabt[6]<>0, ncabt[6]<>0                   {WHEN 367}
 DO	c=cabt[6], cab[c]=0(BRAKE_ON, MOMENTUM_1), ct6=cab[c],
	d=ncabt[6], cab[d]=cab[c], ospt[6]=spt[6]
WHEN spt[6]=DoMin, spt[6]<>ospt[6], cabt[6]<>0, ncabt[6]=0                      {WHEN 368}
 DO	c=cabt[6], cab[c]=mst[6](BRAKE_OFF), d=&cab[c],d=3+,*d=downmom, ospt[6]=spt[6]
	ct6=cab[c]
WHEN spt[6]=DoMin, spt[6]<>ospt[6], cabt[6]<>0, ncabt[6]<>0, initialised=2      {WHEN 369}
 DO	c=cabt[6], d=&cab[c], *d=mst[6],d=3+,*d=downmom, d=ncabt[6], cab[d]=cab[c],
	ospt[6]=spt[6], ct6=cab[c]
WHEN spt[6]=DoFull, ospt[6]>=DoMin, ospt[6]<=DoFull, cabt[6]<>0, ncabt[6]=0, initialised=2{WHEN 370}
 DO	c=cabt[6], cab[c]=fst[6](BRAKE_OFF), d=&cab[c],d=3+,*d=upmom, ospt[6]=spt[6]
	ct6=cab[c], spt[6]=Booked
WHEN spt[6]=DoFull, ospt[6]<>DoMin, ospt[6]<>DoFull, cabt[6]<>0, ncabt[6]=0, initialised=2
 DO	c=cabt[6], cab[c]=mst[6](BRAKE_OFF, MOMENTUM_1),                        {WHEN 371}
	ct6=cab[c], wait 1
	c=cabt[6], d=&cab[c], *d=fst[6], d=3+,*d=upmom
	ospt[6]=spt[6], ct6=cab[c], spt[6]=Booked
WHEN ncabt[6]<>0 DO c=cabt[6], d=ncabt[6], cab[d]=cab[c],                       {WHEN 372}
	wait 0.2, d=ncabt[6], tc[d]=6, wait 0.2
	c=cabt[6], tc[c]=99, cabt[6]=ncabt[6], ncabt[6]=0
WHILE spt[6]=CalCount, cabt[6]<>99                                               {WHEN 373}
 DO	c=cabt[6], cab[c]=2+(BRAKE_OFF), ct6=cab[c], wait 1
WHEN spt[6]=EndCal                                                              {WHEN 374}
 DO	c=cabt[6], mst[6]=cab[c], fst[6]=mst[6], fst[6]=10+, spt[6]=Braking

{ Cab handling code }

{ WHEN cab released DO wait and mark free }

WHEN tc[1]=99 DO cab[1]=0 (MOMENTUM_0), wait 0.3, tc[1]=0                       {WHEN 375}
WHEN tc[2]=99 DO cab[2]=0 (MOMENTUM_0), wait 0.3, tc[2]=0                       {WHEN 376}
WHEN tc[3]=99 DO cab[3]=0 (MOMENTUM_0), wait 0.3, tc[3]=0                       {WHEN 377}
WHEN tc[4]=99 DO cab[4]=0 (MOMENTUM_0), wait 0.3, tc[4]=0                       {WHEN 378}
WHEN tc[5]=99 DO cab[5]=0 (MOMENTUM_0), wait 0.3, tc[5]=0                       {WHEN 379}
WHEN tc[6]=99 DO cab[6]=0 (MOMENTUM_0), wait 0.3, tc[6]=0                       {WHEN 380}
WHEN tc[7]=99 DO cab[7]=0 (MOMENTUM_0), wait 0.3, tc[7]=0                       {WHEN 381}
WHEN tc[8]=99 DO cab[8]=0 (MOMENTUM_0), wait 0.3, tc[8]=0                       {WHEN 382}

{ Train recalibration code - 1 copy shared for all trains on all sections }

{ WHEN CalTrain DO Calculate speed }
{ WHEN Full Speed calculated DO Update speed for train display }
{ WHEN Min Speed calculated DO Update speed for train display }
{ WHEN Express going too fast DO Calculate reduction }
{ WHEN Express going too slow DO Calculate increase }
{ WHEN Passenger going too fast DO Calculate reduction }
{ WHEN Passenger going too slow DO Calculate increase }
{ WHEN Local going too fast DO Calculate reduction }
{ WHEN Local going too slow DO Calculate increase }
{ WHEN Goods going too fast DO Calculate reduction }
{ WHEN Goods going too slow DO Calculate increase }
{ WHEN Slow train going too fast DO Calculate reduction }
{ WHEN Slow train going too slow DO Calculate increase }
{ WHEN Full speed increase needed DO Calculate and implement change }
{ WHEN Full speed reduction needed DO Calculate and implement change }
{ WHEN Min speed increase needed DO Calculate and implement change }
{ WHEN Min speed reduction needed DO Calculate and implement change }
{ WHEN Speed calculated, no change needed DO Clear variables }

WHEN CalTrain<>0, CalTime<>0, CalLen<>0                                         {WHEN 383}
 DO	CalSpd=CalLen, CalSpd=100*, CalSpd=CalTime/
	CalFS=ospt[CalTrain], CalTT=tt[CalTrain]
WHEN CalTrain<>0, CalSpd<>0, CalFS=DoFull DO mfst[CalTrain]=CalSpd              {WHEN 384}
WHEN CalTrain<>0, CalSpd<>0, CalFS=DoMin DO mmst[CalTrain]=CalSpd               {WHEN 385}
WHEN CalTT=Express, CalFS=DoFull, CalSpd>FSexpress                              {WHEN 386}
 DO	CalRed=CalSpd, CalRed=FSexpress-, CalRed=100*, CalRed=CalSpd/
WHEN CalTT=Express, CalFS=DoFull, CalSpd<FSexpress                              {WHEN 387}
 DO	CalInc=FSexpress, CalInc=CalSpd-, CalInc=100*, CalInc=CalSpd/
WHEN CalTT=Passenger, CalFS=DoFull, CalSpd>FSpassenger                          {WHEN 388}
 DO	CalRed=CalSpd, CalRed=FSpassenger-, CalRed=100*, CalRed=CalSpd/
WHEN CalTT=Passenger, CalFS=DoFull, CalSpd<FSpassenger                          {WHEN 389}
 DO	CalInc=FSpassenger, CalInc=CalSpd-, CalInc=100*, CalInc=CalSpd/
WHEN CalTT=Local, CalFS=DoFull, CalSpd>FSlocal                                  {WHEN 390}
 DO	CalRed=CalSpd, CalRed=FSlocal-, CalRed=100*, CalRed=CalSpd/
WHEN CalTT=Local, CalFS=DoFull, CalSpd<FSlocal                                  {WHEN 391}
 DO	CalInc=FSlocal, CalInc=CalSpd-, CalInc=100*, CalInc=CalSpd/
WHEN CalTT=Goods, CalFS=DoFull, CalSpd>FSgoods                                  {WHEN 392}
 DO	CalRed=CalSpd, CalRed=FSgoods-, CalRed=100*, CalRed=CalSpd/
WHEN CalTT=Goods, CalFS=DoFull, CalSpd<FSgoods                                  {WHEN 393}
 DO	CalInc=FSgoods, CalInc=CalSpd-, CalInc=100*, CalInc=CalSpd/
WHEN CalFS=DoMin, CalSpd>FScrawl                                                {WHEN 394}
 DO	CalRed=CalSpd, CalRed=FScrawl-, CalRed=100*, CalRed=CalSpd/
WHEN CalFS=DoMin, CalSpd<FScrawl                                                {WHEN 395}
 DO	CalInc=FScrawl, CalInc=CalSpd-, CalInc=100*, CalInc=CalSpd/
WHEN CalInc<>0, CalTrain<>0, CalFS=DoFull                                       {WHEN 396}
 DO	CalInc=Max 25, $Draw Message(1,4,3)="Increase speed train @CalTrain by @CalInc%"
	c=mst[CalTrain], c=fst[CalTrain]-, c=CalInc%, c=Max 20, fst[CalTrain]=c-, CalInc=0
WHEN CalRed<>0, CalTrain<>0, CalFS=DoFull                                       {WHEN 397}
 DO	CalRed=Max 25, $Draw Message(1,4,3)="Reduce speed train @CalTrain by @CalRed%"
	c=mst[CalTrain], c=fst[CalTrain]-, c=CalRed%, c=Max 20, fst[CalTrain]=c+, CalRed=0
WHEN CalInc<>0, CalTrain<>0, CalFS=DoMin                                        {WHEN 398}
 DO	$Erase Message(1,4,3), $Draw Message(1,4,3)="Increase speed train @CalTrain by @CalInc%"
WHEN CalRed<>0, CalTrain<>0, CalFS=DoMin                                        {WHEN 399}
 DO	$Erase Message(1,4,3), $Draw Message(1,4,3)="Reduce speed train @CalTrain by @CalRed%"
WHEN CalTrain<>0, CalSpd<>0                                                     {WHEN 400}
 DO	wait 0.1, CalTrain=0, CalTT=0, CalSpd=0, CalTime=0, CalLen=0

{ Initial starting from stopped state }

{ WHEN GetCal & NOT cal & OptO DO CalRev }
{ WHEN GetCal & NOT cal & NOT OptO DO CalFwd }
{ WHEN CalFwd & OptO OR CalRev & !OptO DO Cab=EndCal, GetCal }

WHEN L16.s=GetCal, L16.wt=0, L16.p<>0, OptOL16=TRUE                             {WHEN 401}
 DO	L16.s=CalRev, tdirt[L16.t]=Rev, spt[L16.t]=CalCount
WHEN L16.s=GetCal, L16.wt=0, L16.p<>0, OptOL16=FALSE                            {WHEN 402}
 DO	L16.s=CalFwd, tdirt[L16.t]=Fwd, spt[L16.t]=CalCount
WHEN L16.s=CalFwd, OptOL16=TRUE OR L16.s=CalRev, OptOL16=FALSE                  {WHEN 403}
 DO	L16.s=GetCal, spt[L16.t]=EndCal, L16.wt=1, tdirt[L16.t]=Fwd
WHEN L15.s=GetCal, L15.wt=0, L15.p<>0, OptOL15=TRUE                             {WHEN 404}
 DO	L15.s=CalRev, tdirt[L15.t]=Rev, spt[L15.t]=CalCount
WHEN L15.s=GetCal, L15.wt=0, L15.p<>0, OptOL15=FALSE                            {WHEN 405}
 DO	L15.s=CalFwd, tdirt[L15.t]=Fwd, spt[L15.t]=CalCount
WHEN L15.s=CalFwd, OptOL15=TRUE OR L15.s=CalRev, OptOL15=FALSE                  {WHEN 406}
 DO	L15.s=GetCal, spt[L15.t]=EndCal, L15.wt=1, tdirt[L15.t]=Fwd
WHEN L14.s=GetCal, L14.wt=0, L14.p<>0, OptOL14=TRUE                             {WHEN 407}
 DO	L14.s=CalRev, tdirt[L14.t]=Rev, spt[L14.t]=CalCount
WHEN L14.s=GetCal, L14.wt=0, L14.p<>0, OptOL14=FALSE                            {WHEN 408}
 DO	L14.s=CalFwd, tdirt[L14.t]=Fwd, spt[L14.t]=CalCount
WHEN L14.s=CalFwd, OptOL14=TRUE OR L14.s=CalRev, OptOL14=FALSE                  {WHEN 409}
 DO	L14.s=GetCal, spt[L14.t]=EndCal, L14.wt=1, tdirt[L14.t]=Fwd
WHEN L13.s=GetCal, L13.wt=0, L13.p<>0, OptOL13=TRUE                             {WHEN 410}
 DO	L13.s=CalRev, tdirt[L13.t]=Rev, spt[L13.t]=CalCount
WHEN L13.s=GetCal, L13.wt=0, L13.p<>0, OptOL13=FALSE                            {WHEN 411}
 DO	L13.s=CalFwd, tdirt[L13.t]=Fwd, spt[L13.t]=CalCount
WHEN L13.s=CalFwd, OptOL13=TRUE OR L13.s=CalRev, OptOL13=FALSE                  {WHEN 412}
 DO	L13.s=GetCal, spt[L13.t]=EndCal, L13.wt=1, tdirt[L13.t]=Fwd
WHEN L12.s=GetCal, L12.wt=0, L12.p<>0, OptOL12=TRUE                             {WHEN 413}
 DO	L12.s=CalRev, tdirt[L12.t]=Rev, spt[L12.t]=CalCount
WHEN L12.s=GetCal, L12.wt=0, L12.p<>0, OptOL12=FALSE                            {WHEN 414}
 DO	L12.s=CalFwd, tdirt[L12.t]=Fwd, spt[L12.t]=CalCount
WHEN L12.s=CalFwd, OptOL12=TRUE OR L12.s=CalRev, OptOL12=FALSE                  {WHEN 415}
 DO	L12.s=GetCal, spt[L12.t]=EndCal, L12.wt=1, tdirt[L12.t]=Fwd
WHEN L11.s=GetCal, L11.wt=0, L11.p<>0, OptOL11=TRUE                             {WHEN 416}
 DO	L11.s=CalRev, tdirt[L11.t]=Rev, spt[L11.t]=CalCount
WHEN L11.s=GetCal, L11.wt=0, L11.p<>0, OptOL11=FALSE                            {WHEN 417}
 DO	L11.s=CalFwd, tdirt[L11.t]=Fwd, spt[L11.t]=CalCount
WHEN L11.s=CalFwd, OptOL11=TRUE OR L11.s=CalRev, OptOL11=FALSE                  {WHEN 418}
 DO	L11.s=GetCal, spt[L11.t]=EndCal, L11.wt=1, tdirt[L11.t]=Fwd
WHEN L10.s=GetCal, L10.wt=0, L10.p<>0, OptOL10=TRUE                             {WHEN 419}
 DO	L10.s=CalRev, tdirt[L10.t]=Rev, spt[L10.t]=CalCount
WHEN L10.s=GetCal, L10.wt=0, L10.p<>0, OptOL10=FALSE                            {WHEN 420}
 DO	L10.s=CalFwd, tdirt[L10.t]=Fwd, spt[L10.t]=CalCount
WHEN L10.s=CalFwd, OptOL10=TRUE OR L10.s=CalRev, OptOL10=FALSE                  {WHEN 421}
 DO	L10.s=GetCal, spt[L10.t]=EndCal, L10.wt=1, tdirt[L10.t]=Fwd
WHEN L9.s=GetCal, L9.wt=0, L9.p<>0, OptOL9=TRUE                                 {WHEN 422}
 DO	L9.s=CalRev, tdirt[L9.t]=Rev, spt[L9.t]=CalCount
WHEN L9.s=GetCal, L9.wt=0, L9.p<>0, OptOL9=FALSE                                {WHEN 423}
 DO	L9.s=CalFwd, tdirt[L9.t]=Fwd, spt[L9.t]=CalCount
WHEN L9.s=CalFwd, OptOL9=TRUE OR L9.s=CalRev, OptOL9=FALSE                      {WHEN 424}
 DO	L9.s=GetCal, spt[L9.t]=EndCal, L9.wt=1, tdirt[L9.t]=Fwd
WHEN L8.s=GetCal, L8.wt=0, L8.p<>0, OptOL8=TRUE                                 {WHEN 425}
 DO	L8.s=CalRev, tdirt[L8.t]=Rev, spt[L8.t]=CalCount
WHEN L8.s=GetCal, L8.wt=0, L8.p<>0, OptOL8=FALSE                                {WHEN 426}
 DO	L8.s=CalFwd, tdirt[L8.t]=Fwd, spt[L8.t]=CalCount
WHEN L8.s=CalFwd, OptOL8=TRUE OR L8.s=CalRev, OptOL8=FALSE                      {WHEN 427}
 DO	L8.s=GetCal, spt[L8.t]=EndCal, L8.wt=1, tdirt[L8.t]=Fwd
WHEN L7.s=GetCal, L7.wt=0, L7.p<>0, OptOL7=TRUE                                 {WHEN 428}
 DO	L7.s=CalRev, tdirt[L7.t]=Rev, spt[L7.t]=CalCount
WHEN L7.s=GetCal, L7.wt=0, L7.p<>0, OptOL7=FALSE                                {WHEN 429}
 DO	L7.s=CalFwd, tdirt[L7.t]=Fwd, spt[L7.t]=CalCount
WHEN L7.s=CalFwd, OptOL7=TRUE OR L7.s=CalRev, OptOL7=FALSE                      {WHEN 430}
 DO	L7.s=GetCal, spt[L7.t]=EndCal, L7.wt=1, tdirt[L7.t]=Fwd
WHEN L6.s=GetCal, L6.wt=0, L6.p<>0, OptOL6=TRUE                                 {WHEN 431}
 DO	L6.s=CalRev, tdirt[L6.t]=Rev, spt[L6.t]=CalCount
WHEN L6.s=GetCal, L6.wt=0, L6.p<>0, OptOL6=FALSE                                {WHEN 432}
 DO	L6.s=CalFwd, tdirt[L6.t]=Fwd, spt[L6.t]=CalCount
WHEN L6.s=CalFwd, OptOL6=TRUE OR L6.s=CalRev, OptOL6=FALSE                      {WHEN 433}
 DO	L6.s=GetCal, spt[L6.t]=EndCal, L6.wt=1, tdirt[L6.t]=Fwd
WHEN L5.s=GetCal, L5.wt=0, L5.p<>0, OptOL5=TRUE                                 {WHEN 434}
 DO	L5.s=CalRev, tdirt[L5.t]=Rev, spt[L5.t]=CalCount
WHEN L5.s=GetCal, L5.wt=0, L5.p<>0, OptOL5=FALSE                                {WHEN 435}
 DO	L5.s=CalFwd, tdirt[L5.t]=Fwd, spt[L5.t]=CalCount
WHEN L5.s=CalFwd, OptOL5=TRUE OR L5.s=CalRev, OptOL5=FALSE                      {WHEN 436}
 DO	L5.s=GetCal, spt[L5.t]=EndCal, L5.wt=1, tdirt[L5.t]=Fwd
WHEN L4.s=GetCal, L4.wt=0, L4.p<>0, OptOL4=TRUE                                 {WHEN 437}
 DO	L4.s=CalRev, tdirt[L4.t]=Rev, spt[L4.t]=CalCount
WHEN L4.s=GetCal, L4.wt=0, L4.p<>0, OptOL4=FALSE                                {WHEN 438}
 DO	L4.s=CalFwd, tdirt[L4.t]=Fwd, spt[L4.t]=CalCount
WHEN L4.s=CalFwd, OptOL4=TRUE OR L4.s=CalRev, OptOL4=FALSE                      {WHEN 439}
 DO	L4.s=GetCal, spt[L4.t]=EndCal, L4.wt=1, tdirt[L4.t]=Fwd
WHEN L3.s=GetCal, L3.wt=0, L3.p<>0, OptOL3=TRUE                                 {WHEN 440}
 DO	L3.s=CalRev, tdirt[L3.t]=Rev, spt[L3.t]=CalCount
WHEN L3.s=GetCal, L3.wt=0, L3.p<>0, OptOL3=FALSE                                {WHEN 441}
 DO	L3.s=CalFwd, tdirt[L3.t]=Fwd, spt[L3.t]=CalCount
WHEN L3.s=CalFwd, OptOL3=TRUE OR L3.s=CalRev, OptOL3=FALSE                      {WHEN 442}
 DO	L3.s=GetCal, spt[L3.t]=EndCal, L3.wt=1, tdirt[L3.t]=Fwd
WHEN L2.s=GetCal, L2.wt=0, L2.p<>0, OptOL2=TRUE                                 {WHEN 443}
 DO	L2.s=CalRev, tdirt[L2.t]=Rev, spt[L2.t]=CalCount
WHEN L2.s=GetCal, L2.wt=0, L2.p<>0, OptOL2=FALSE                                {WHEN 444}
 DO	L2.s=CalFwd, tdirt[L2.t]=Fwd, spt[L2.t]=CalCount
WHEN L2.s=CalFwd, OptOL2=TRUE OR L2.s=CalRev, OptOL2=FALSE                      {WHEN 445}
 DO	L2.s=GetCal, spt[L2.t]=EndCal, L2.wt=1, tdirt[L2.t]=Fwd
WHEN L17.s=GetCal, L17.wt=0, L17.p<>0, OptOL17=TRUE                             {WHEN 446}
 DO	L17.s=CalRev, tdirt[L17.t]=Rev, spt[L17.t]=CalCount
WHEN L17.s=GetCal, L17.wt=0, L17.p<>0, OptOL17=FALSE                            {WHEN 447}
 DO	L17.s=CalFwd, tdirt[L17.t]=Fwd, spt[L17.t]=CalCount
WHEN L17.s=CalFwd, OptOL17=TRUE OR L17.s=CalRev, OptOL17=FALSE                  {WHEN 448}
 DO	L17.s=GetCal, spt[L17.t]=EndCal, L17.wt=1, tdirt[L17.t]=Fwd
WHEN L18.s=GetCal, L18.wt=0, L18.p<>0, OptOL18=TRUE                             {WHEN 449}
 DO	L18.s=CalRev, tdirt[L18.t]=Rev, spt[L18.t]=CalCount
WHEN L18.s=GetCal, L18.wt=0, L18.p<>0, OptOL18=FALSE                            {WHEN 450}
 DO	L18.s=CalFwd, tdirt[L18.t]=Fwd, spt[L18.t]=CalCount
WHEN L18.s=CalFwd, OptOL18=TRUE OR L18.s=CalRev, OptOL18=FALSE                  {WHEN 451}
 DO	L18.s=GetCal, spt[L18.t]=EndCal, L18.wt=1, tdirt[L18.t]=Fwd
WHEN L19.s=GetCal, L19.wt=0, L19.p<>0, OptOL19=TRUE                             {WHEN 452}
 DO	L19.s=CalRev, tdirt[L19.t]=Rev, spt[L19.t]=CalCount
WHEN L19.s=GetCal, L19.wt=0, L19.p<>0, OptOL19=FALSE                            {WHEN 453}
 DO	L19.s=CalFwd, tdirt[L19.t]=Fwd, spt[L19.t]=CalCount
WHEN L19.s=CalFwd, OptOL19=TRUE OR L19.s=CalRev, OptOL19=FALSE                  {WHEN 454}
 DO	L19.s=GetCal, spt[L19.t]=EndCal, L19.wt=1, tdirt[L19.t]=Fwd
WHEN L20.s=GetCal, L20.wt=0, L20.p<>0, OptOL20=TRUE                             {WHEN 455}
 DO	L20.s=CalRev, tdirt[L20.t]=Rev, spt[L20.t]=CalCount
WHEN L20.s=GetCal, L20.wt=0, L20.p<>0, OptOL20=FALSE                            {WHEN 456}
 DO	L20.s=CalFwd, tdirt[L20.t]=Fwd, spt[L20.t]=CalCount
WHEN L20.s=CalFwd, OptOL20=TRUE OR L20.s=CalRev, OptOL20=FALSE                  {WHEN 457}
 DO	L20.s=GetCal, spt[L20.t]=EndCal, L20.wt=1, tdirt[L20.t]=Fwd
WHEN L21.s=GetCal, L21.wt=0, L21.p<>0, OptOL21=TRUE                             {WHEN 458}
 DO	L21.s=CalRev, tdirt[L21.t]=Rev, spt[L21.t]=CalCount
WHEN L21.s=GetCal, L21.wt=0, L21.p<>0, OptOL21=FALSE                            {WHEN 459}
 DO	L21.s=CalFwd, tdirt[L21.t]=Fwd, spt[L21.t]=CalCount
WHEN L21.s=CalFwd, OptOL21=TRUE OR L21.s=CalRev, OptOL21=FALSE                  {WHEN 460}
 DO	L21.s=GetCal, spt[L21.t]=EndCal, L21.wt=1, tdirt[L21.t]=Fwd
WHEN P2.s=GetCal, P2.wt=0, P2.p<>0, OptOP2=TRUE                                 {WHEN 461}
 DO	P2.s=CalRev, tdirt[P2.t]=Fwd, spt[P2.t]=CalCount
WHEN P2.s=GetCal, P2.wt=0, P2.p<>0, OptOP2=FALSE                                {WHEN 462}
 DO	P2.s=CalFwd, tdirt[P2.t]=Rev, spt[P2.t]=CalCount
WHEN P2.s=CalFwd, OptOP2=TRUE OR P2.s=CalRev, OptOP2=FALSE                      {WHEN 463}
 DO	P2.s=GetCal, spt[P2.t]=EndCal, P2.wt=1, tdirt[P2.t]=Fwd
WHEN P1.s=GetCal, P1.wt=0, P1.p<>0, OptOP1=TRUE                                 {WHEN 464}
 DO	P1.s=CalRev, tdirt[P1.t]=Fwd, spt[P1.t]=CalCount
WHEN P1.s=GetCal, P1.wt=0, P1.p<>0, OptOP1=FALSE                                {WHEN 465}
 DO	P1.s=CalFwd, tdirt[P1.t]=Rev, spt[P1.t]=CalCount
WHEN P1.s=CalFwd, OptOP1=TRUE OR P1.s=CalRev, OptOP1=FALSE                      {WHEN 466}
 DO	P1.s=GetCal, spt[P1.t]=EndCal, P1.wt=1, tdirt[P1.t]=Fwd

{ Cab allocation, power routing code for powered sections }

{ WHEN GetCal & no power & first free DO grab first }
{ WHEN no power & first grabbed DO power from first }
{ WHEN GetCal & no power & second free DO grab second }
{ WHEN no power & second grabbed DO power from second }
{ WHEN GetCal & no power & third free DO grab third }
{ WHEN no power & third grabbed DO power from third }

WHEN L16.s=GetCal, L16.t<>0, L16.p=0, tc[2]<>L16.t, tc[1]=0 DO tc[1]=L16.t      {WHEN 467}
WHEN L16.s=GetCal, L16.p=0, tc[1]=L16.t                                         {WHEN 468}
 DO	L16.p=1, cabt[L16.t]=1, spt[L16.t]=Braking
WHEN L16.s=GetCal, L16.t<>0, L16.p=0, tc[1]<>0, tc[1]<>L16.t, tc[2]=0           {WHEN 469}
 DO	tc[2]=L16.t
WHEN L16.s=GetCal, L16.p=0, tc[2]=L16.t                                         {WHEN 470}
 DO	L16.p=2, cabt[L16.t]=2, spt[L16.t]=Braking
WHEN L15.s=GetCal, L15.t<>0, L15.p=0, ncnN2L15<>6, ncnN2L15<>2, tc[1]=0         {WHEN 471}
 DO	tc[1]=L15.t
WHEN L15.s=GetCal, L15.p=0, tc[1]=L15.t                                         {WHEN 472}
 DO	L15.p=1, cabt[L15.t]=1, spt[L15.t]=Braking
WHEN L15.s=GetCal, L15.t<>0, L15.p=0, ncnN2L15=6, tc[6]=0 DO tc[6]=L15.t        {WHEN 473}
WHEN L15.s=GetCal, L15.p=0, tc[6]=L15.t                                         {WHEN 474}
 DO	L15.p=6, cabt[L15.t]=6, spt[L15.t]=Braking
WHEN L15.s=GetCal, L15.t<>0, L15.p=0, ncnN2L15=2, tc[2]=0 DO tc[2]=L15.t        {WHEN 475}
WHEN L15.s=GetCal, L15.p=0, tc[2]=L15.t                                         {WHEN 476}
 DO	L15.p=2, cabt[L15.t]=2, spt[L15.t]=Braking
WHEN L14.s=GetCal, L14.t<>0, L14.p=0, tc[1]<>L14.t, tc[2]=0 DO tc[2]=L14.t      {WHEN 477}
WHEN L14.s=GetCal, L14.p=0, tc[2]=L14.t                                         {WHEN 478}
 DO	L14.p=2, cabt[L14.t]=2, spt[L14.t]=Braking
WHEN L14.s=GetCal, L14.t<>0, L14.p=0, tc[2]<>0, tc[2]<>L14.t, tc[1]=0           {WHEN 479}
 DO	tc[1]=L14.t
WHEN L14.s=GetCal, L14.p=0, tc[1]=L14.t                                         {WHEN 480}
 DO	L14.p=1, cabt[L14.t]=1, spt[L14.t]=Braking
WHEN L13.s=GetCal, L13.t<>0, L13.p=0, tc[1]<>L13.t, tc[2]=0 DO tc[2]=L13.t      {WHEN 481}
WHEN L13.s=GetCal, L13.p=0, tc[2]=L13.t                                         {WHEN 482}
 DO	L13.p=2, cabt[L13.t]=2, spt[L13.t]=Braking
WHEN L13.s=GetCal, L13.t<>0, L13.p=0, tc[2]<>0, tc[2]<>L13.t, tc[1]=0           {WHEN 483}
 DO	tc[1]=L13.t
WHEN L13.s=GetCal, L13.p=0, tc[1]=L13.t                                         {WHEN 484}
 DO	L13.p=1, cabt[L13.t]=1, spt[L13.t]=Braking
WHEN L12.s=GetCal, L12.t<>0, L12.p=0, tc[3]<>L12.t, tc[2]=0 DO tc[2]=L12.t      {WHEN 485}
WHEN L12.s=GetCal, L12.p=0, tc[2]=L12.t                                         {WHEN 486}
 DO	L12.p=2, cabt[L12.t]=2, spt[L12.t]=Braking
WHEN L12.s=GetCal, L12.t<>0, L12.p=0, tc[2]<>0, tc[2]<>L12.t, tc[3]=0           {WHEN 487}
 DO	tc[3]=L12.t
WHEN L12.s=GetCal, L12.p=0, tc[3]=L12.t                                         {WHEN 488}
 DO	L12.p=3, cabt[L12.t]=3, spt[L12.t]=Braking
WHEN L11.s=GetCal, L11.t<>0, L11.p=0, tc[3]<>L11.t, tc[2]<>L11.t, tc[4]=0       {WHEN 489}
 DO	tc[4]=L11.t
WHEN L11.s=GetCal, L11.p=0, tc[4]=L11.t                                         {WHEN 490}
 DO	L11.p=4, cabt[L11.t]=4, spt[L11.t]=Braking
WHEN L11.s=GetCal, L11.t<>0, L11.p=0, tc[4]<>0, tc[4]<>L11.t, tc[2]<>L11.t, tc[3]=0
 DO	tc[3]=L11.t                                                             {WHEN 491}
WHEN L11.s=GetCal, L11.p=0, tc[3]=L11.t                                         {WHEN 492}
 DO	L11.p=3, cabt[L11.t]=3, spt[L11.t]=Braking
WHEN L11.s=GetCal, L11.t<>0, L11.p=0, tc[4]<>0, tc[4]<>L11.t, tc[3]<>0, tc[3]<>L11.t, tc[2]=0
 DO	tc[2]=L11.t                                                             {WHEN 493}
WHEN L11.s=GetCal, L11.p=0, tc[2]=L11.t                                         {WHEN 494}
 DO	L11.p=2, cabt[L11.t]=2, spt[L11.t]=Braking
WHEN L10.s=GetCal, L10.t<>0, L10.p=0, tc[4]=0 DO tc[4]=L10.t                    {WHEN 495}
WHEN L10.s=GetCal, L10.p=0, tc[4]=L10.t                                         {WHEN 496}
 DO	L10.p=4, cabt[L10.t]=4, spt[L10.t]=Braking
WHEN L9.s=GetCal, L9.t<>0, L9.p=0, tc[5]<>L9.t, tc[6]=0 DO tc[6]=L9.t           {WHEN 497}
WHEN L9.s=GetCal, L9.p=0, tc[6]=L9.t DO L9.p=6, cabt[L9.t]=6, spt[L9.t]=Braking {WHEN 498}
WHEN L9.s=GetCal, L9.t<>0, L9.p=0, tc[6]<>0, tc[6]<>L9.t, tc[5]=0 DO tc[5]=L9.t {WHEN 499}
WHEN L9.s=GetCal, L9.p=0, tc[5]=L9.t DO L9.p=5, cabt[L9.t]=5, spt[L9.t]=Braking {WHEN 500}
WHEN L8.s=GetCal, L8.t<>0, L8.p=0, tc[6]=0 DO tc[6]=L8.t                        {WHEN 501}
WHEN L8.s=GetCal, L8.p=0, tc[6]=L8.t DO L8.p=6, cabt[L8.t]=6, spt[L8.t]=Braking {WHEN 502}
WHEN L7.s=GetCal, L7.t<>0, L7.p=0, tc[6]<>L7.t, tc[7]=0 DO tc[7]=L7.t           {WHEN 503}
WHEN L7.s=GetCal, L7.p=0, tc[7]=L7.t DO L7.p=7, cabt[L7.t]=7, spt[L7.t]=Braking {WHEN 504}
WHEN L7.s=GetCal, L7.t<>0, L7.p=0, tc[7]<>0, tc[7]<>L7.t, tc[6]=0 DO tc[6]=L7.t {WHEN 505}
WHEN L7.s=GetCal, L7.p=0, tc[6]=L7.t DO L7.p=6, cabt[L7.t]=6, spt[L7.t]=Braking {WHEN 506}
WHEN L6.s=GetCal, L6.t<>0, L6.p=0, tc[7]=0 DO tc[7]=L6.t                        {WHEN 507}
WHEN L6.s=GetCal, L6.p=0, tc[7]=L6.t DO L6.p=7, cabt[L6.t]=7, spt[L6.t]=Braking {WHEN 508}
WHEN L5.s=GetCal, L5.t<>0, L5.p=0, tc[7]<>L5.t, tc[5]=0                         {WHEN 509}
 OR  L5.s=GetCal, L5.t<>0, L5.p=99, tc[7]<>L5.t, tc[5]=0
 DO	tc[5]=L5.t
WHEN L5.s=GetCal, L5.p=0, tc[5]=L5.t OR L5.s=GetCal, L5.p=99, tc[5]=L5.t        {WHEN 510}
 DO	L5.p=5, cabt[L5.t]=5, spt[L5.t]=Braking
WHEN L5.s=GetCal, L5.t<>0, L5.p=0, tc[5]<>0, tc[5]<>L5.t, tc[7]=0               {WHEN 511}
 OR  L5.s=GetCal, L5.t<>0, L5.p=99, tc[5]<>0, tc[5]<>L5.t, tc[7]=0
 DO	tc[7]=L5.t
WHEN L5.s=GetCal, L5.p=0, tc[7]=L5.t OR L5.s=GetCal, L5.p=99, tc[7]=L5.t        {WHEN 512}
 DO	L5.p=7, cabt[L5.t]=7, spt[L5.t]=Braking
WHEN L4.s=GetCal, L4.t<>0, L4.p=0, tc[5]=0 DO tc[5]=L4.t                        {WHEN 513}
WHEN L4.s=GetCal, L4.p=0, tc[5]=L4.t DO L4.p=5, cabt[L4.t]=5, spt[L4.t]=Braking {WHEN 514}
WHEN L3.s=GetCal, L3.t<>0, L3.p=0, tc[5]=0 DO tc[5]=L3.t                        {WHEN 515}
WHEN L3.s=GetCal, L3.p=0, tc[5]=L3.t DO L3.p=5, cabt[L3.t]=5, spt[L3.t]=Braking {WHEN 516}
WHEN L2.s=GetCal, L2.t<>0, L2.p=0, ncnN2L2<>5, ncnN2L2<>4, tc[6]=0              {WHEN 517}
 DO	tc[6]=L2.t
WHEN L2.s=GetCal, L2.p=0, tc[6]=L2.t DO L2.p=6, cabt[L2.t]=6, spt[L2.t]=Braking {WHEN 518}
WHEN L2.s=GetCal, L2.t<>0, L2.p=0, ncnN2L2=5, tc[5]=0 DO tc[5]=L2.t             {WHEN 519}
WHEN L2.s=GetCal, L2.p=0, tc[5]=L2.t DO L2.p=5, cabt[L2.t]=5, spt[L2.t]=Braking {WHEN 520}
WHEN L2.s=GetCal, L2.t<>0, L2.p=0, ncnN2L2=4, tc[4]=0 DO tc[4]=L2.t             {WHEN 521}
WHEN L2.s=GetCal, L2.p=0, tc[4]=L2.t DO L2.p=4, cabt[L2.t]=4, spt[L2.t]=Braking {WHEN 522}
WHEN L17.s=GetCal, L17.t<>0, L17.p=0, ncnTO4<>5, tc[4]=0 DO tc[4]=L17.t         {WHEN 523}
WHEN L17.s=GetCal, L17.p=0, tc[4]=L17.t                                         {WHEN 524}
 DO	L17.p=4, cabt[L17.t]=4, spt[L17.t]=Braking
WHEN L17.s=GetCal, L17.t<>0, L17.p=0, ncnTO4=5, tc[5]=0 DO tc[5]=L17.t          {WHEN 525}
WHEN L17.s=GetCal, L17.p=0, tc[5]=L17.t                                         {WHEN 526}
 DO	L17.p=5, cabt[L17.t]=5, spt[L17.t]=Braking
WHEN L18.s=GetCal, L18.t<>0, L18.p=0, tc[4]<>L18.t, tc[3]=0                     {WHEN 527}
 OR  L18.s=GetCal, L18.t<>0, L18.p=99, tc[4]<>L18.t, tc[3]=0
 DO	tc[3]=L18.t
WHEN L18.s=GetCal, L18.p=0, tc[3]=L18.t OR L18.s=GetCal, L18.p=99, tc[3]=L18.t  {WHEN 528}
 DO	L18.p=3, cabt[L18.t]=3, spt[L18.t]=Braking
WHEN L18.s=GetCal, L18.t<>0, L18.p=0, tc[3]<>0, tc[3]<>L18.t, tc[4]=0           {WHEN 529}
 OR  L18.s=GetCal, L18.t<>0, L18.p=99, tc[3]<>0, tc[3]<>L18.t, tc[4]=0
 DO	tc[4]=L18.t
WHEN L18.s=GetCal, L18.p=0, tc[4]=L18.t OR L18.s=GetCal, L18.p=99, tc[4]=L18.t  {WHEN 530}
 DO	L18.p=4, cabt[L18.t]=4, spt[L18.t]=Braking
WHEN L19.s=GetCal, L19.t<>0, L19.p=0, tc[4]<>L19.t, tc[3]=0 DO tc[3]=L19.t      {WHEN 531}
WHEN L19.s=GetCal, L19.p=0, tc[3]=L19.t                                         {WHEN 532}
 DO	L19.p=3, cabt[L19.t]=3, spt[L19.t]=Braking
WHEN L19.s=GetCal, L19.t<>0, L19.p=0, tc[3]<>0, tc[3]<>L19.t, tc[4]=0           {WHEN 533}
 DO	tc[4]=L19.t
WHEN L19.s=GetCal, L19.p=0, tc[4]=L19.t                                         {WHEN 534}
 DO	L19.p=4, cabt[L19.t]=4, spt[L19.t]=Braking
WHEN L20.s=GetCal, L20.t<>0, L20.p=0, tc[4]<>L20.t, tc[2]=0                     {WHEN 535}
 OR  L20.s=GetCal, L20.t<>0, L20.p=99, tc[4]<>L20.t, tc[2]=0
 DO	tc[2]=L20.t
WHEN L20.s=GetCal, L20.p=0, tc[2]=L20.t OR L20.s=GetCal, L20.p=99, tc[2]=L20.t  {WHEN 536}
 DO	L20.p=2, cabt[L20.t]=2, spt[L20.t]=Braking
WHEN L20.s=GetCal, L20.t<>0, L20.p=0, tc[2]<>0, tc[2]<>L20.t, tc[4]=0           {WHEN 537}
 OR  L20.s=GetCal, L20.t<>0, L20.p=99, tc[2]<>0, tc[2]<>L20.t, tc[4]=0
 DO	tc[4]=L20.t
WHEN L20.s=GetCal, L20.p=0, tc[4]=L20.t OR L20.s=GetCal, L20.p=99, tc[4]=L20.t  {WHEN 538}
 DO	L20.p=4, cabt[L20.t]=4, spt[L20.t]=Braking
WHEN L21.s=GetCal, L21.t<>0, L21.p=0, tc[4]<>L21.t, tc[2]=0 DO tc[2]=L21.t      {WHEN 539}
WHEN L21.s=GetCal, L21.p=0, tc[2]=L21.t                                         {WHEN 540}
 DO	L21.p=2, cabt[L21.t]=2, spt[L21.t]=Braking
WHEN L21.s=GetCal, L21.t<>0, L21.p=0, tc[2]<>0, tc[2]<>L21.t, tc[4]=0           {WHEN 541}
 DO	tc[4]=L21.t
WHEN L21.s=GetCal, L21.p=0, tc[4]=L21.t                                         {WHEN 542}
 DO	L21.p=4, cabt[L21.t]=4, spt[L21.t]=Braking
WHEN P2.s=GetCal, P2.t<>0, P2.p=0, tc[4]=0 DO tc[4]=P2.t                        {WHEN 543}
WHEN P2.s=GetCal, P2.p=0, tc[4]=P2.t DO P2.p=4, cabt[P2.t]=4, spt[P2.t]=Braking {WHEN 544}
WHEN P1.s=GetCal, P1.t<>0, P1.p=0, tc[5]<>P1.t, tc[8]<>P1.t, tc[4]=0            {WHEN 545}
 DO	tc[4]=P1.t
WHEN P1.s=GetCal, P1.p=0, tc[4]=P1.t DO P1.p=4, cabt[P1.t]=4, spt[P1.t]=Braking {WHEN 546}
WHEN P1.s=GetCal, P1.t<>0, P1.p=0, tc[4]<>0, tc[4]<>P1.t, tc[8]<>P1.t, tc[5]=0  {WHEN 547}
 DO	tc[5]=P1.t
WHEN P1.s=GetCal, P1.p=0, tc[5]=P1.t DO P1.p=5, cabt[P1.t]=5, spt[P1.t]=Braking {WHEN 548}
WHEN P1.s=GetCal, P1.t<>0, P1.p=0, tc[4]<>0, tc[4]<>P1.t, tc[5]<>0, tc[5]<>P1.t, tc[8]=0
 DO	tc[8]=P1.t                                                              {WHEN 549}
WHEN P1.s=GetCal, P1.p=0, tc[8]=P1.t DO P1.p=8, cabt[P1.t]=8, spt[P1.t]=Braking {WHEN 550}

{ Handle power switching relays }

{ WHEN Power=first DO Power relay = 0/1 }
{ WHEN Power=second DO Power relay = 1/1 }
{ WHEN Power=third DO Power relay = 1/0 }
{ WHEN Power=none DO Power relays = off }

WHEN L16.p=1 DO rcL16=0, rsL16=1                                                {WHEN 551}
WHEN L16.p=4 DO rcL16=1, rsL16=1                                                {WHEN 552}
WHEN L16.p=2 DO rcL16=1, rsL16=0                                                {WHEN 553}
WHEN L16.p=0 DO rcL16=0, rsL16=0                                                {WHEN 554}
WHEN L15.p=1 DO rcL15=0, rsL15=1                                                {WHEN 555}
WHEN L15.p=6 DO rcL15=1, rsL15=1                                                {WHEN 556}
WHEN L15.p=2 DO rcL15=1, rsL15=0                                                {WHEN 557}
WHEN L15.p=0 DO rcL15=0, rsL15=0                                                {WHEN 558}
WHEN L14.p=2 DO rcL14=0, rsL14=1                                                {WHEN 559}
WHEN L14.p=1 DO rcL14=1, rsL14=1                                                {WHEN 560}
WHEN L14.p=0 DO rcL14=0, rsL14=0                                                {WHEN 561}
WHEN L13.p=2 DO rcL13=0, rsL13=1                                                {WHEN 562}
WHEN L13.p=1 DO rcL13=1, rsL13=1                                                {WHEN 563}
WHEN L13.p=0 DO rcL13=0, rsL13=0                                                {WHEN 564}
WHEN L12.p=2 DO rcL12=0, rsL12=1                                                {WHEN 565}
WHEN L12.p=1 DO rcL12=1, rsL12=1                                                {WHEN 566}
WHEN L12.p=3 DO rcL12=1, rsL12=0                                                {WHEN 567}
WHEN L12.p=0 DO rcL12=0, rsL12=0                                                {WHEN 568}
WHEN L11.p=4 DO rcL11=0, rsL11=1                                                {WHEN 569}
WHEN L11.p=3 DO rcL11=1, rsL11=1                                                {WHEN 570}
WHEN L11.p=2 DO rcL11=1, rsL11=0                                                {WHEN 571}
WHEN L11.p=0 DO rcL11=0, rsL11=0                                                {WHEN 572}
WHEN L10.p=4 DO rcL10=0, rsL10=1                                                {WHEN 573}
WHEN L10.p=3 DO rcL10=1, rsL10=1                                                {WHEN 574}
WHEN L10.p=2 DO rcL10=1, rsL10=0                                                {WHEN 575}
WHEN L10.p=0 DO rcL10=0, rsL10=0                                                {WHEN 576}
WHEN L9.p=6 DO rcL9=0, rsL9=1                                                   {WHEN 577}
WHEN L9.p=5 DO rcL9=1, rsL9=1                                                   {WHEN 578}
WHEN L9.p=0 DO rcL9=0, rsL9=0                                                   {WHEN 579}
WHEN L8.p=6 DO rcL8=0, rsL8=1                                                   {WHEN 580}
WHEN L8.p=5 DO rcL8=1, rsL8=1                                                   {WHEN 581}
WHEN L8.p=0 DO rcL8=0, rsL8=0                                                   {WHEN 582}
WHEN L7.p=7 DO rcL7=0, rsL7=1                                                   {WHEN 583}
WHEN L7.p=6 DO rcL7=1, rsL7=1                                                   {WHEN 584}
WHEN L7.p=0 DO rcL7=0, rsL7=0                                                   {WHEN 585}
WHEN L6.p=7 DO rcL6=0, rsL6=1                                                   {WHEN 586}
WHEN L6.p=6 DO rcL6=1, rsL6=1                                                   {WHEN 587}
WHEN L6.p=0 DO rcL6=0, rsL6=0                                                   {WHEN 588}
WHEN L5.p=5 DO rcL5=0, rsL5=1                                                   {WHEN 589}
WHEN L5.p=7 DO rcL5=1, rsL5=1                                                   {WHEN 590}
WHEN L5.p=0 DO rcL5=0, rsL5=0                                                   {WHEN 591}
WHEN L4.p=5 DO rcL4=0, rsL4=1                                                   {WHEN 592}
WHEN L4.p=7 DO rcL4=1, rsL4=1                                                   {WHEN 593}
WHEN L4.p=0 DO rcL4=0, rsL4=0                                                   {WHEN 594}
WHEN L3.p=5 DO rcL3=0, rsL3=1                                                   {WHEN 595}
WHEN L3.p=7 DO rcL3=1, rsL3=1                                                   {WHEN 596}
WHEN L3.p=0 DO rcL3=0, rsL3=0                                                   {WHEN 597}
WHEN L2.p=6 DO rc1L2=0, rc2L2=0, rsL2=1                                         {WHEN 598}
WHEN L2.p=5 DO rc1L2=1, rc2L2=0, rsL2=1                                         {WHEN 599}
WHEN L2.p=4 DO rc1L2=0, rc2L2=1, rsL2=1                                         {WHEN 600}
WHEN L2.p=0 DO rc1L2=0, rc2L2=0, rsL2=0                                         {WHEN 601}
WHEN L17.p=4 DO rcAL17=0, rcBL17=1                                              {WHEN 602}
WHEN L17.p=5 DO rcAL17=1, rcBL17=0                                              {WHEN 603}
WHEN L17.p=0 DO rcAL17=0, rcBL17=0                                              {WHEN 604}
WHEN L18.p=3 DO rcL18=0, rsL18=1                                                {WHEN 605}
WHEN L18.p=4 DO rcL18=1, rsL18=1                                                {WHEN 606}
WHEN L18.p=0 DO rcL18=0, rsL18=0                                                {WHEN 607}
WHEN L19.p=3 DO rcL19=0, rsL19=1                                                {WHEN 608}
WHEN L19.p=4 DO rcL19=1, rsL19=1                                                {WHEN 609}
WHEN L19.p=0 DO rcL19=0, rsL19=0                                                {WHEN 610}
WHEN L20.p=2 DO rcL20=0, rsL20=1                                                {WHEN 611}
WHEN L20.p=4 DO rcL20=1, rsL20=1                                                {WHEN 612}
WHEN L20.p=0 DO rcL20=0, rsL20=0                                                {WHEN 613}
WHEN L21.p=2 DO rcL21=0, rsL21=1                                                {WHEN 614}
WHEN L21.p=4 DO rcL21=1, rsL21=1                                                {WHEN 615}
WHEN L21.p=0 DO rcL21=0, rsL21=0                                                {WHEN 616}
WHEN P2.p=4 DO rcP2=0, rsP2=1                                                   {WHEN 617}
WHEN P2.p=5 DO rcP2=1, rsP2=1                                                   {WHEN 618}
WHEN P2.p=8 DO rcP2=1, rsP2=0                                                   {WHEN 619}
WHEN P2.p=0 DO rcP2=0, rsP2=0                                                   {WHEN 620}
WHEN P1.p=4 DO rcP1=0, rsP1=1                                                   {WHEN 621}
WHEN P1.p=5 DO rcP1=1, rsP1=1                                                   {WHEN 622}
WHEN P1.p=8 DO rcP1=1, rsP1=0                                                   {WHEN 623}
WHEN P1.p=0 DO rcP1=0, rsP1=0                                                   {WHEN 624}

{ Beginning of main code }

{ Track sections: When free, previous occupied then become booked }

{ WHEN Free & prev>Booked & controller OK DO booked, t = prev.t }
{ WHEN Booked & prev Stopped DO WaitClear }
{ WHEN Free & Opt DO Error }
{ WHEN Departing & next<>booked & next<ArrOcc & next<>Stopping DO Error }
{ WHEN >=Booked & cab not valid DO Error }
{ WHEN > GetTrain & Train=0 DO Error }
{ WHEN Calibrating and OptO DO Recalibrate train }
{ WHEN Departing & next Occ|Dep OR Free & Guided power on DO WaitClear }
{ WHEN WaitClear & all sensors clear DO Free }

WHEN L16.s=Free, *pspN2_L16.s>Booked, *pspN2_L16.p<>0                           {WHEN 625}
 DO	L16.s=Booked, L16.t=*pspN2_L16.t, L16.p=*pspN2_L16.p
WHEN L16.s=Booked, *pspN2_L16.s<=Stopping                                       {WHEN 626}
 OR  L16.s=Arriving, *pspN2_L16.s<=Stopping
 DO	L16.s=WaitClear, L16.t=0, L16.p=0, $Color Block(5,18,1)=colt0
WHEN L16.s=Free, initialised=2, OptL16=TRUE                                     {WHEN 627}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L16"
	L16.s=WaitClear
WHEN L16.s=Departing, *npN2L16.s<>Booked, *npN2L16.s<Moving, *npN2L16.s<>Stopping, *npN2L16.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L16"         {WHEN 628}
WHEN L16.s>=Booked, L16.s<>GetCal, L16.p<>1, L16.p<>4, L16.p<>2                 {WHEN 629}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L16"
WHEN L16.s>GetTrain, L16.t=0                                                    {WHEN 630}
 DO	$Draw Message(1,3,3)="Train number 0 on section L16"
WHEN L16.s=Departing, *npN2L16.s>=Departing, *npN2L16.s<=Occupied               {WHEN 631}
 OR  L16.s=Departing, *npN2L16.s=StopClear
 DO	L16.s=WaitClear
WHEN L16.s=WaitClear, OptL16=FALSE, OptOL16=FALSE, CurL16=FALSE                 {WHEN 632}
 DO	L16.s=Free, L16.t=0, L16.p=0
	$Color Block(5,18,1)=colt0
WHEN L15.s=Free, *pspN2_L15.s>Booked, *pspN2_L15.p<>0                           {WHEN 633}
 DO	L15.s=Booked, L15.t=*pspN2_L15.t, L15.p=*pspN2_L15.p
WHEN L15.s=Booked, *pspN2_L15.s<=Stopping                                       {WHEN 634}
 OR  L15.s=Arriving, *pspN2_L15.s<=Stopping
 DO	L15.s=WaitClear, L15.t=0, L15.p=0, $Color Block(12,18,1)=colt0
WHEN L15.s=Free, initialised=2, OptL15=TRUE                                     {WHEN 635}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L15"
	L15.s=WaitClear
WHEN L15.s=Departing, *npN2L15.s<>Booked, *npN2L15.s<Moving, *npN2L15.s<>Stopping, *npN2L15.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L15"         {WHEN 636}
WHEN L15.s>=Booked, L15.s<>GetCal, L15.p<>1, L15.p<>6, L15.p<>2                 {WHEN 637}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L15"
WHEN L15.s>GetTrain, L15.t=0                                                    {WHEN 638}
 DO	$Draw Message(1,3,3)="Train number 0 on section L15"
WHEN tcalL15<>0, OptOL15=TRUE, CalTrain=0                                       {WHEN 639}
 DO	CalTrain=L15.t, CalTime=$SESSION, CalTime=tcalL15-, CalLen=31, tcalL15=0
WHEN L15.s=Departing, *npN2L15.s>=Departing, *npN2L15.s<=Occupied               {WHEN 640}
 OR  L15.s=Departing, *npN2L15.s=StopClear
 OR  L15.s=Free, ncnN2L15<>0
 DO	L15.s=WaitClear, L15.p=ncnN2L15
WHEN L15.s=WaitClear, OptL15=FALSE, OptOL15=FALSE, CurL15=FALSE, ncnN2L15=0     {WHEN 641}
 DO	L15.s=Free, L15.t=0, L15.p=0, tcalL15=0
	$Color Block(12,18,1)=colt0
WHEN L14.s=Free, *pspN2_L14.s>Booked, *pspN2_L14.p<>0                           {WHEN 642}
 DO	L14.s=Booked, L14.t=*pspN2_L14.t, L14.p=*pspN2_L14.p
WHEN L14.s=Booked, *pspN2_L14.s<=Stopping                                       {WHEN 643}
 OR  L14.s=Arriving, *pspN2_L14.s<=Stopping
 DO	L14.s=WaitClear, L14.t=0, L14.p=0, $Color Block(15,15,1)=colt0
WHEN L14.s=Free, initialised=2, OptL14=TRUE                                     {WHEN 644}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L14"
	L14.s=WaitClear
WHEN L14.s=Departing, X2.s<>Booked, X2.s<Moving, X2.s<>Stopping, X2.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L14"         {WHEN 645}
WHEN L14.s>=Booked, L14.s<>GetCal, L14.p<>2, L14.p<>1                           {WHEN 646}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L14"
WHEN L14.s>GetTrain, L14.t=0                                                    {WHEN 647}
 DO	$Draw Message(1,3,3)="Train number 0 on section L14"
WHEN L14.s=Departing, X2.s>=Departing, X2.s<=Occupied                           {WHEN 648}
 OR  L14.s=Departing, X2.s=StopClear
 DO	L14.s=WaitClear
WHEN L14.s=WaitClear, OptL14=FALSE, OptOL14=FALSE, CurL14=FALSE                 {WHEN 649}
 DO	L14.s=Free, L14.t=0, L14.p=0
	$Color Block(15,15,1)=colt0
WHEN L13.s=Free, L14.s>Booked, L14.p<>0                                         {WHEN 650}
 DO	L13.s=Booked, L13.t=L14.t, L13.p=L14.p
WHEN L13.s=Booked, L14.s<=Stopping OR L13.s=Arriving, L14.s<=Stopping           {WHEN 651}
 DO	L13.s=WaitClear, L13.t=0, L13.p=0, $Color Block(15,8,1)=colt0
WHEN L13.s=Free, initialised=2, OptL13=TRUE                                     {WHEN 652}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L13"
	L13.s=WaitClear
WHEN L13.s=Departing, L12.s<>Booked, L12.s<Moving, L12.s<>Stopping, L12.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L13"         {WHEN 653}
WHEN L13.s>=Booked, L13.s<>GetCal, L13.p<>2, L13.p<>1                           {WHEN 654}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L13"
WHEN L13.s>GetTrain, L13.t=0                                                    {WHEN 655}
 DO	$Draw Message(1,3,3)="Train number 0 on section L13"
WHEN L13.s=Departing, L12.s>=Departing, L12.s<=Occupied                         {WHEN 656}
 OR  L13.s=Departing, L12.s=StopClear
 DO	L13.s=WaitClear
WHEN L13.s=WaitClear, OptL13=FALSE, OptOL13=FALSE, CurL13=FALSE                 {WHEN 657}
 DO	L13.s=Free, L13.t=0, L13.p=0
	$Color Block(15,8,1)=colt0
WHEN L12.s=Free, L13.s>Booked, L13.p<>0                                         {WHEN 658}
 DO	L12.s=Booked, L12.t=L13.t, L12.p=L13.p
WHEN L12.s=Booked, L13.s<=Stopping OR L12.s=Arriving, L13.s<=Stopping           {WHEN 659}
 DO	L12.s=WaitClear, L12.t=0, L12.p=0, $Color Block(12,3,1)=colt0
WHEN L12.s=Free, initialised=2, OptL12=TRUE                                     {WHEN 660}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L12"
	L12.s=WaitClear
WHEN L12.s=Departing, *npN1L12.s<>Booked, *npN1L12.s<Moving, *npN1L12.s<>Stopping, *npN1L12.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L12"         {WHEN 661}
WHEN L12.s>=Booked, L12.s<>GetCal, L12.p<>2, L12.p<>1, L12.p<>3                 {WHEN 662}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L12"
WHEN L12.s>GetTrain, L12.t=0                                                    {WHEN 663}
 DO	$Draw Message(1,3,3)="Train number 0 on section L12"
WHEN L12.s=Departing, *npN1L12.s>=Departing, *npN1L12.s<=Occupied               {WHEN 664}
 OR  L12.s=Departing, *npN1L12.s=StopClear
 DO	L12.s=WaitClear
WHEN L12.s=WaitClear, OptL12=FALSE, OptOL12=FALSE, CurL12=FALSE                 {WHEN 665}
 DO	L12.s=Free, L12.t=0, L12.p=0
	$Color Block(12,3,1)=colt0
WHEN L11.s=Free, *pspN1_L11.s>Booked, *pspN1_L11.p<>0                           {WHEN 666}
 DO	L11.s=Booked, L11.t=*pspN1_L11.t, L11.p=*pspN1_L11.p
WHEN L11.s=Booked, *pspN1_L11.s<=Stopping                                       {WHEN 667}
 OR  L11.s=Arriving, *pspN1_L11.s<=Stopping
 DO	L11.s=WaitClear, L11.t=0, L11.p=0, $Color Block(6,3,1)=colt0
WHEN L11.s=Free, initialised=2, OptL11=TRUE                                     {WHEN 668}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L11"
	L11.s=WaitClear
WHEN L11.s=Departing, L10.s<>Booked, L10.s<Moving, L10.s<>Stopping, L10.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L11"         {WHEN 669}
WHEN L11.s>=Booked, L11.s<>GetCal, L11.p<>4, L11.p<>3, L11.p<>2                 {WHEN 670}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L11"
WHEN L11.s>GetTrain, L11.t=0                                                    {WHEN 671}
 DO	$Draw Message(1,3,3)="Train number 0 on section L11"
WHEN L11.s=Departing, L10.s>=Departing, L10.s<=Occupied                         {WHEN 672}
 OR  L11.s=Departing, L10.s=StopClear
 DO	L11.s=WaitClear
WHEN L11.s=WaitClear, OptL11=FALSE, OptOL11=FALSE, CurL11=FALSE                 {WHEN 673}
 DO	L11.s=Free, L11.t=0, L11.p=0
	$Color Block(6,3,1)=colt0
WHEN L10.s=Free, L11.s>Booked, L11.p<>0                                         {WHEN 674}
 DO	L10.s=Booked, L10.t=L11.t, L10.p=L11.p
WHEN L10.s=Booked, L11.s<=Stopping OR L10.s=Arriving, L11.s<=Stopping           {WHEN 675}
 DO	L10.s=WaitClear, L10.t=0, L10.p=0, $Color Block(3,7,1)=colt0
WHEN L10.s=Free, initialised=2, OptL10=TRUE                                     {WHEN 676}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L10"
	L10.s=WaitClear
WHEN L10.s=Departing, *npN2L10.s<>Booked, *npN2L10.s<Moving, *npN2L10.s<>Stopping, *npN2L10.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L10"         {WHEN 677}
WHEN L10.s>=Booked, L10.s<>GetCal, L10.p<>4, L10.p<>3, L10.p<>2                 {WHEN 678}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L10"
WHEN L10.s>GetTrain, L10.t=0                                                    {WHEN 679}
 DO	$Draw Message(1,3,3)="Train number 0 on section L10"
WHEN L10.s=Departing, *npN2L10.s>=Departing, *npN2L10.s<=Occupied               {WHEN 680}
 OR  L10.s=Departing, *npN2L10.s=StopClear
 DO	L10.s=WaitClear
WHEN L10.s=WaitClear, OptL10=FALSE, OptOL10=FALSE, CurL10=FALSE                 {WHEN 681}
 DO	L10.s=Free, L10.t=0, L10.p=0
	$Color Block(3,7,1)=colt0
WHEN L9.s=Free, *pspN2_L9.s>Booked, *pspN2_L9.p<>0                              {WHEN 682}
 DO	L9.s=Booked, L9.t=*pspN2_L9.t, L9.p=*pspN2_L9.p
WHEN L9.s=Booked, *pspN2_L9.s<=Stopping OR L9.s=Arriving, *pspN2_L9.s<=Stopping {WHEN 683}
 DO	L9.s=WaitClear, L9.t=0, L9.p=0, $Color Block(2,4,1)=colt0
WHEN L9.s=Free, initialised=2, OptL9=TRUE                                       {WHEN 684}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L9"
	L9.s=WaitClear
WHEN L9.s=Departing, L8.s<>Booked, L8.s<Moving, L8.s<>Stopping, L8.s<>StopClear {WHEN 685}
 DO	$Draw Message(1,3,3)="Next not ready for departing section L9"
WHEN L9.s>=Booked, L9.s<>GetCal, L9.p<>6, L9.p<>5                               {WHEN 686}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L9"
WHEN L9.s>GetTrain, L9.t=0                                                      {WHEN 687}
 DO	$Draw Message(1,3,3)="Train number 0 on section L9"
WHEN tcalL9<>0, OptOL9=TRUE, CalTrain=0                                         {WHEN 688}
 DO	CalTrain=L9.t, CalTime=$SESSION, CalTime=tcalL9-, CalLen=50, tcalL9=0
WHEN L9.s=Departing, L8.s>=Departing, L8.s<=Occupied                            {WHEN 689}
 OR  L9.s=Departing, L8.s=StopClear
 DO	L9.s=WaitClear
WHEN L9.s=WaitClear, OptL9=FALSE, OptOL9=FALSE, CurL9=FALSE                     {WHEN 690}
 DO	L9.s=Free, L9.t=0, L9.p=0, tcalL9=0
	$Color Block(2,4,1)=colt0
WHEN L8.s=Free, L9.s>Booked, L9.p<>0                                            {WHEN 691}
 DO	L8.s=Booked, L8.t=L9.t, L8.p=L9.p
WHEN L8.s=Booked, L9.s<=Stopping OR L8.s=Arriving, L9.s<=Stopping               {WHEN 692}
 DO	L8.s=WaitClear, L8.t=0, L8.p=0, $Color Block(11,2,1)=colt0
WHEN L8.s=Free, initialised=2, OptL8=TRUE                                       {WHEN 693}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L8"
	L8.s=WaitClear
WHEN L8.s=Departing, L7.s<>Booked, L7.s<Moving, L7.s<>Stopping, L7.s<>StopClear {WHEN 694}
 DO	$Draw Message(1,3,3)="Next not ready for departing section L8"
WHEN L8.s>=Booked, L8.s<>GetCal, L8.p<>6, L8.p<>5                               {WHEN 695}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L8"
WHEN L8.s>GetTrain, L8.t=0                                                      {WHEN 696}
 DO	$Draw Message(1,3,3)="Train number 0 on section L8"
WHEN L8.s=Departing, L7.s>=Departing, L7.s<=Occupied                            {WHEN 697}
 OR  L8.s=Departing, L7.s=StopClear
 DO	L8.s=WaitClear
WHEN L8.s=WaitClear, OptL8=FALSE, OptOL8=FALSE, CurL8=FALSE                     {WHEN 698}
 DO	L8.s=Free, L8.t=0, L8.p=0
	$Color Block(11,2,1)=colt0
WHEN L7.s=Free, L8.s>Booked, L8.p<>0                                            {WHEN 699}
 DO	L7.s=Booked, L7.t=L8.t, L7.p=L8.p
WHEN L7.s=Booked, L8.s<=Stopping OR L7.s=Arriving, L8.s<=Stopping               {WHEN 700}
 DO	L7.s=WaitClear, L7.t=0, L7.p=0, $Color Block(16,7,1)=colt0
WHEN L7.s=Free, initialised=2, OptL7=TRUE                                       {WHEN 701}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L7"
	L7.s=WaitClear
WHEN L7.s=Departing, L6.s<>Booked, L6.s<Moving, L6.s<>Stopping, L6.s<>StopClear {WHEN 702}
 DO	$Draw Message(1,3,3)="Next not ready for departing section L7"
WHEN L7.s>=Booked, L7.s<>GetCal, L7.p<>7, L7.p<>6                               {WHEN 703}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L7"
WHEN L7.s>GetTrain, L7.t=0                                                      {WHEN 704}
 DO	$Draw Message(1,3,3)="Train number 0 on section L7"
WHEN L7.s=Departing, L6.s>=Departing, L6.s<=Occupied                            {WHEN 705}
 OR  L7.s=Departing, L6.s=StopClear
 DO	L7.s=WaitClear
WHEN L7.s=WaitClear, OptL7=FALSE, OptOL7=FALSE, CurL7=FALSE                     {WHEN 706}
 DO	L7.s=Free, L7.t=0, L7.p=0
	$Color Block(16,7,1)=colt0
WHEN L6.s=Free, L7.s>Booked, L7.p<>0                                            {WHEN 707}
 DO	L6.s=Booked, L6.t=L7.t, L6.p=L7.p
WHEN L6.s=Booked, L7.s<=Stopping OR L6.s=Arriving, L7.s<=Stopping               {WHEN 708}
 DO	L6.s=WaitClear, L6.t=0, L6.p=0, $Color Block(16,14,1)=colt0
WHEN L6.s=Free, initialised=2, OptL6=TRUE                                       {WHEN 709}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L6"
	L6.s=WaitClear
WHEN L6.s=Departing, *lpTI4.s<>Booked, *lpTI4.s<Moving, *lpTI4.s<>Stopping, *lpTI4.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L6"          {WHEN 710}
WHEN L6.s>=Booked, L6.s<>GetCal, L6.p<>7, L6.p<>6                               {WHEN 711}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L6"
WHEN L6.s>GetTrain, L6.t=0                                                      {WHEN 712}
 DO	$Draw Message(1,3,3)="Train number 0 on section L6"
WHEN L6.s=Departing, *lpTI4.s>=Departing, *lpTI4.s<=Occupied                    {WHEN 713}
 OR  L6.s=Departing, *lpTI4.s=StopClear
 DO	L6.s=WaitClear
WHEN L6.s=WaitClear, OptL6=FALSE, OptOL6=FALSE, CurL6=FALSE                     {WHEN 714}
 DO	L6.s=Free, L6.t=0, L6.p=0
	$Color Block(16,14,1)=colt0
WHEN L5.s=Free, *pspTI4.s>Booked, *pspTI4.p<>0                                  {WHEN 715}
 DO	L5.s=Booked, L5.t=*pspTI4.t, L5.p=*pspTI4.p
WHEN L5.s=Booked, *pspTI4.s<=Stopping OR L5.s=Arriving, *pspTI4.s<=Stopping     {WHEN 716}
 DO	L5.s=WaitClear, L5.t=0, L5.p=0, $Color Block(14,19,1)=colt0
WHEN L5.s=Free, initialised=2, OptL5=TRUE                                       {WHEN 717}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L5"
	L5.s=WaitClear
WHEN L5.s=Departing, *npTO3.s<>Booked, *npTO3.s<Moving, *npTO3.s<>Stopping, *npTO3.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L5"          {WHEN 718}
WHEN L5.s>=Booked, L5.s<>GetCal, L5.p<>5, L5.p<>7                               {WHEN 719}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L5"
WHEN L5.s>GetTrain, L5.t=0                                                      {WHEN 720}
 DO	$Draw Message(1,3,3)="Train number 0 on section L5"
WHEN L5.s=Departing, *npTO3.s>=Departing, *npTO3.s<=Occupied                    {WHEN 721}
 OR  L5.s=Departing, *npTO3.s=StopClear
 DO	L5.s=WaitClear
WHEN L5.s=WaitClear, OptL5=FALSE, OptOL5=FALSE, CurL5=FALSE                     {WHEN 722}
 DO	L5.s=Free, L5.t=0, L5.p=0
	$Color Block(14,19,1)=colt0
WHEN L4.s=Free, *lpTO3.s>Booked, L5.p<>0                                        {WHEN 723}
 DO	L4.s=Booked, L4.t=*lpTO3.t, L4.p=L5.p, mxttL4=0
WHEN L4.s=Booked, *lpTO3.s<=Stopping OR L4.s=Arriving, *lpTO3.s<=Stopping       {WHEN 724}
 DO	L4.s=WaitClear, L4.t=0, L4.p=0, $Color Block(5,20,1)=colt0
WHEN L4.s=Free, initialised=2, OptL4=TRUE                                       {WHEN 725}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L4"
	L4.s=WaitClear
WHEN L4.s=Departing, *npN2L4.s<>Booked, *npN2L4.s<Moving, *npN2L4.s<>Stopping, *npN2L4.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L4"          {WHEN 726}
WHEN L4.s>=Booked, L4.s<>GetCal, L4.p<>5, L4.p<>7                               {WHEN 727}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L4"
WHEN L4.s>GetTrain, L4.t=0                                                      {WHEN 728}
 DO	$Draw Message(1,3,3)="Train number 0 on section L4"
WHEN L4.s=Departing, *npN2L4.s>=Departing, *npN2L4.s<=Occupied                  {WHEN 729}
 OR  L4.s=Departing, *npN2L4.s=StopClear
 DO	L4.s=WaitClear
WHEN L4.s=WaitClear, OptL4=FALSE, OptOL4=FALSE, CurL4=FALSE                     {WHEN 730}
 DO	L4.s=Free, L4.t=0, L4.p=0
	$Color Block(5,20,1)=colt0
WHEN L3.s=Free, *rpTO3.s>Booked, L5.p<>0                                        {WHEN 731}
 DO	L3.s=Booked, L3.t=*rpTO3.t, L3.p=L5.p, mxttL3=0
WHEN L3.s=Booked, *rpTO3.s<=Stopping OR L3.s=Arriving, *rpTO3.s<=Stopping       {WHEN 732}
 DO	L3.s=WaitClear, L3.t=0, L3.p=0, $Color Block(6,19,1)=colt0
WHEN L3.s=Free, initialised=2, OptL3=TRUE                                       {WHEN 733}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L3"
	L3.s=WaitClear
WHEN L3.s=Departing, *npN2L3.s<>Booked, *npN2L3.s<Moving, *npN2L3.s<>Stopping, *npN2L3.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L3"          {WHEN 734}
WHEN L3.s>=Booked, L3.s<>GetCal, L3.p<>5, L3.p<>7                               {WHEN 735}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L3"
WHEN L3.s>GetTrain, L3.t=0                                                      {WHEN 736}
 DO	$Draw Message(1,3,3)="Train number 0 on section L3"
WHEN L3.s=Departing, *npN2L3.s>=Departing, *npN2L3.s<=Occupied                  {WHEN 737}
 OR  L3.s=Departing, *npN2L3.s=StopClear
 DO	L3.s=WaitClear
WHEN L3.s=WaitClear, OptL3=FALSE, OptOL3=FALSE, CurL3=FALSE                     {WHEN 738}
 DO	L3.s=Free, L3.t=0, L3.p=0
	$Color Block(6,19,1)=colt0
WHEN L2.s=Free, *pspN2_L2.s>Booked, *pspN2_L2.p<>0                              {WHEN 739}
 DO	L2.s=Booked, L2.t=*pspN2_L2.t, L2.p=*pspN2_L2.p
WHEN L2.s=Booked, *pspN2_L2.s<=Stopping OR L2.s=Arriving, *pspN2_L2.s<=Stopping {WHEN 740}
 DO	L2.s=WaitClear, L2.t=0, L2.p=0, $Color Block(2,16,1)=colt0
WHEN L2.s=Free, initialised=2, OptL2=TRUE                                       {WHEN 741}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L2"
	L2.s=WaitClear
WHEN L2.s=Departing, *npN2L2.s<>Booked, *npN2L2.s<Moving, *npN2L2.s<>Stopping, *npN2L2.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L2"          {WHEN 742}
WHEN L2.s>=Booked, L2.s<>GetCal, L2.p<>6, L2.p<>5, L2.p<>4                      {WHEN 743}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L2"
WHEN L2.s>GetTrain, L2.t=0                                                      {WHEN 744}
 DO	$Draw Message(1,3,3)="Train number 0 on section L2"
WHEN L2.s=Departing, *npN2L2.s>=Departing, *npN2L2.s<=Occupied                  {WHEN 745}
 OR  L2.s=Departing, *npN2L2.s=StopClear
 OR  L2.s=Free, ncnN2L2<>0
 DO	L2.s=WaitClear, L2.p=ncnN2L2
WHEN L2.s=WaitClear, OptL2=FALSE, OptOL2=FALSE, CurL2=FALSE, ncnN2L2=0          {WHEN 746}
 DO	L2.s=Free, L2.t=0, L2.p=0
	$Color Block(2,16,1)=colt0
WHEN L17.s=Free, *pspN2_L17.s>Booked, *pspN2_L17.p<>0                           {WHEN 747}
 DO	L17.s=Booked, L17.t=*pspN2_L17.t, L17.p=*pspN2_L17.p
WHEN L17.s=Booked, *pspN2_L17.s<=Stopping                                       {WHEN 748}
 OR  L17.s=Arriving, *pspN2_L17.s<=Stopping
 DO	L17.s=WaitClear, L17.t=0, L17.p=0, $Color Block(11,12,1)=colt0
WHEN L17.s=Free, initialised=2, OptL17=TRUE                                     {WHEN 749}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L17"
	L17.s=WaitClear
WHEN L17.s=Departing, *lpTI2.s<>Booked, *lpTI2.s<Moving, *lpTI2.s<>Stopping, *lpTI2.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L17"         {WHEN 750}
WHEN L17.s>=Booked, L17.s<>GetCal, L17.p<>4, L17.p<>5                           {WHEN 751}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L17"
WHEN L17.s>GetTrain, L17.t=0                                                    {WHEN 752}
 DO	$Draw Message(1,3,3)="Train number 0 on section L17"
WHEN L17.s=Departing, *lpTI2.s>=Departing, *lpTI2.s<=Occupied                   {WHEN 753}
 OR  L17.s=Departing, *lpTI2.s=StopClear
 DO	L17.s=WaitClear
WHEN L17.s=WaitClear, OptL17=FALSE, OptOL17=FALSE, CurL17=FALSE                 {WHEN 754}
 DO	L17.s=Free, L17.t=0, L17.p=0
	$Color Block(11,12,1)=colt0
WHEN L18.s=Free, *rpTO5.s>Booked, *pspTI2.p<>0                                  {WHEN 755}
 DO	L18.s=Booked, L18.t=*rpTO5.t, L18.p=*pspTI2.p
WHEN L18.s=Booked, *rpTO5.s<=Stopping OR L18.s=Arriving, *rpTO5.s<=Stopping     {WHEN 756}
 DO	L18.s=WaitClear, L18.t=0, L18.p=0, $Color Block(14,8,1)=colt0
WHEN L18.s=Free, initialised=2, OptL18=TRUE                                     {WHEN 757}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L18"
	L18.s=WaitClear
WHEN L18.s=Departing, L19.s<>Booked, L19.s<Moving, L19.s<>Stopping, L19.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L18"         {WHEN 758}
WHEN L18.s>=Booked, L18.s<>GetCal, L18.p<>3, L18.p<>4                           {WHEN 759}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L18"
WHEN L18.s>GetTrain, L18.t=0                                                    {WHEN 760}
 DO	$Draw Message(1,3,3)="Train number 0 on section L18"
WHEN L18.s=Departing, L19.s>=Departing, L19.s<=Occupied                         {WHEN 761}
 OR  L18.s=Departing, L19.s=StopClear
 DO	L18.s=WaitClear
WHEN L18.s=WaitClear, OptL18=FALSE, OptOL18=FALSE, CurL18=FALSE                 {WHEN 762}
 DO	L18.s=Free, L18.t=0, L18.p=0
	$Color Block(14,8,1)=colt0
WHEN L19.s=Free, L18.s>Booked, L18.p<>0                                         {WHEN 763}
 DO	L19.s=Booked, L19.t=L18.t, L19.p=L18.p
WHEN L19.s=Booked, L18.s<=Stopping OR L19.s=Arriving, L18.s<=Stopping           {WHEN 764}
 DO	L19.s=WaitClear, L19.t=0, L19.p=0, $Color Block(13,4,1)=colt0
WHEN L19.s=Free, initialised=2, OptL19=TRUE                                     {WHEN 765}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L19"
	L19.s=WaitClear
WHEN L19.s=Departing, *npN1L19.s<>Booked, *npN1L19.s<Moving, *npN1L19.s<>Stopping, *npN1L19.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L19"         {WHEN 766}
WHEN L19.s>=Booked, L19.s<>GetCal, L19.p<>3, L19.p<>4                           {WHEN 767}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L19"
WHEN L19.s>GetTrain, L19.t=0                                                    {WHEN 768}
 DO	$Draw Message(1,3,3)="Train number 0 on section L19"
WHEN L19.s=Departing, *npN1L19.s>=Departing, *npN1L19.s<=Occupied               {WHEN 769}
 OR  L19.s=Departing, *npN1L19.s=StopClear
 DO	L19.s=WaitClear
WHEN L19.s=WaitClear, OptL19=FALSE, OptOL19=FALSE, CurL19=FALSE                 {WHEN 770}
 DO	L19.s=Free, L19.t=0, L19.p=0
	$Color Block(13,4,1)=colt0
WHEN L20.s=Free, *lpTO5.s>Booked, *pspTI2.p<>0                                  {WHEN 771}
 DO	L20.s=Booked, L20.t=*lpTO5.t, L20.p=*pspTI2.p
WHEN L20.s=Booked, *lpTO5.s<=Stopping OR L20.s=Arriving, *lpTO5.s<=Stopping     {WHEN 772}
 DO	L20.s=WaitClear, L20.t=0, L20.p=0, $Color Block(13,9,1)=colt0
WHEN L20.s=Free, initialised=2, OptL20=TRUE                                     {WHEN 773}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L20"
	L20.s=WaitClear
WHEN L20.s=Departing, L21.s<>Booked, L21.s<Moving, L21.s<>Stopping, L21.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L20"         {WHEN 774}
WHEN L20.s>=Booked, L20.s<>GetCal, L20.p<>2, L20.p<>4                           {WHEN 775}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L20"
WHEN L20.s>GetTrain, L20.t=0                                                    {WHEN 776}
 DO	$Draw Message(1,3,3)="Train number 0 on section L20"
WHEN L20.s=Departing, L21.s>=Departing, L21.s<=Occupied                         {WHEN 777}
 OR  L20.s=Departing, L21.s=StopClear
 DO	L20.s=WaitClear
WHEN L20.s=WaitClear, OptL20=FALSE, OptOL20=FALSE, CurL20=FALSE                 {WHEN 778}
 DO	L20.s=Free, L20.t=0, L20.p=0
	$Color Block(13,9,1)=colt0
WHEN L21.s=Free, L20.s>Booked, L20.p<>0                                         {WHEN 779}
 DO	L21.s=Booked, L21.t=L20.t, L21.p=L20.p
WHEN L21.s=Booked, L20.s<=Stopping OR L21.s=Arriving, L20.s<=Stopping           {WHEN 780}
 DO	L21.s=WaitClear, L21.t=0, L21.p=0, $Color Block(13,5,1)=colt0
WHEN L21.s=Free, initialised=2, OptL21=TRUE                                     {WHEN 781}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section L21"
	L21.s=WaitClear
WHEN L21.s=Departing, *npN1L21.s<>Booked, *npN1L21.s<Moving, *npN1L21.s<>Stopping, *npN1L21.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section L21"         {WHEN 782}
WHEN L21.s>=Booked, L21.s<>GetCal, L21.p<>2, L21.p<>4                           {WHEN 783}
 DO	$Draw Message(1,3,3)="Controller number invalid on section L21"
WHEN L21.s>GetTrain, L21.t=0                                                    {WHEN 784}
 DO	$Draw Message(1,3,3)="Train number 0 on section L21"
WHEN L21.s=Departing, *npN1L21.s>=Departing, *npN1L21.s<=Occupied               {WHEN 785}
 OR  L21.s=Departing, *npN1L21.s=StopClear
 DO	L21.s=WaitClear
WHEN L21.s=WaitClear, OptL21=FALSE, OptOL21=FALSE, CurL21=FALSE                 {WHEN 786}
 DO	L21.s=Free, L21.t=0, L21.p=0
	$Color Block(13,5,1)=colt0
WHEN P2.s=Free, *pspN2_P2.s>Booked, *pspN2_P2.p<>0                              {WHEN 787}
 DO	P2.s=Booked, P2.t=*pspN2_P2.t, P2.p=*pspN2_P2.p
WHEN P2.s=Booked, *pspN2_P2.s<=Stopping OR P2.s=Arriving, *pspN2_P2.s<=Stopping {WHEN 788}
 DO	P2.s=WaitClear, P2.t=0, P2.p=0, $Color Block(6,5,1)=colt0
WHEN P2.s=Free, initialised=2, OptP2=TRUE                                       {WHEN 789}
 DO	$Draw Message(1,3,3)="Entry sensor triggered when free on section P2"
	P2.s=WaitClear
WHEN P2.s=Departing, *npN2P2.s<>Booked, *npN2P2.s<Moving, *npN2P2.s<>Stopping, *npN2P2.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section P2"          {WHEN 790}
WHEN P2.s>=Booked, P2.s<>GetCal, P2.p<>4, P2.p<>5, P2.p<>8                      {WHEN 791}
 DO	$Draw Message(1,3,3)="Controller number invalid on section P2"
WHEN P2.s>GetTrain, P2.t=0                                                      {WHEN 792}
 DO	$Draw Message(1,3,3)="Train number 0 on section P2"
WHEN P2.s=Departing, *npN2P2.s>=Departing, *npN2P2.s<=Occupied                  {WHEN 793}
 OR  P2.s=Departing, *npN2P2.s=StopClear
 DO	P2.s=WaitClear
WHEN P2.s=WaitClear, OptP2=FALSE, OptOP2=FALSE, CurP2=FALSE                     {WHEN 794}
 DO	P2.s=Free, P2.t=0, P2.p=0
	$Color Block(6,5,1)=colt0
WHEN P1.s=Free, *pspN2_P1.s>Booked, *pspN2_P1.p<>0                              {WHEN 795}
 DO	P1.s=Booked, P1.t=*pspN2_P1.t, P1.p=*pspN2_P1.p
WHEN P1.s=Booked, *pspN2_P1.s<=Stopping                                         {WHEN 796}
 DO	P1.s=WaitClear, P1.t=0, P1.p=0, $Color Block(1,1,1)=colt0
WHEN P1.s=Departing, *npN2P1.s<>Booked, *npN2P1.s<Moving, *npN2P1.s<>Stopping, *npN2P1.s<>StopClear
 DO	$Draw Message(1,3,3)="Next not ready for departing section P1"          {WHEN 797}
WHEN P1.s>=Booked, P1.s<>GetCal, P1.p<>4, P1.p<>5, P1.p<>8                      {WHEN 798}
 DO	$Draw Message(1,3,3)="Controller number invalid on section P1"
WHEN P1.s>GetTrain, P1.t=0                                                      {WHEN 799}
 DO	$Draw Message(1,3,3)="Train number 0 on section P1"
WHEN P1.s=Departing, *npN2P1.s>=Departing, *npN2P1.s<=Occupied                  {WHEN 800}
 OR  P1.s=Departing, *npN2P1.s=StopClear
 DO	P1.s=WaitClear
WHEN P1.s=WaitClear, OptP2=FALSE, OptOP1=FALSE, CurP1=FALSE                     {WHEN 801}
 DO	P1.s=Free, P1.t=0, P1.p=0
	$Color Block(1,1,1)=colt0

{ Track sections: handle cab switching & basic state changes }

{ WHEN Arr|Occ & using second & first free DO grab first }
{ WHEN Arr|Occ & using first & need second && free DO grab second }
{ WHEN first is grabbed DO switch to first, free second }
{ WHEN second is grabbed DO switch to second, free first }
{ WHEN using second & train uses first DO switch to first }
{ WHEN using first & train uses second DO switch to second }
{ WHEN zero Occupied & next Free DO Free }
{ WHEN zero Booked & next Arr|Occ DO Occupied }

WHEN L16.s>=ArrOcc, CurL16=TRUE, L16.p<>1, tc[1]=0 DO tc[1]=104                 {WHEN 802}
WHEN tc[1]=104 DO ncabt[L16.t]=1                                                {WHEN 803}
WHEN L16.p<>0, L16.p<>1, tc[1]=L16.t DO L16.p=1                                 {WHEN 804}
WHEN L16.p<>0, L16.p<>4, tc[4]=L16.t DO L16.p=4                                 {WHEN 805}
WHEN L15.s>=ArrOcc, CurL15=TRUE, L15.p<>1, ncnN2L15=1, tc[1]=0 DO tc[1]=106     {WHEN 806}
WHEN L15.s>=ArrOcc, CurL15=TRUE, L15.p<>6, ncnN2L15=6, tc[6]=0 DO tc[6]=106     {WHEN 807}
WHEN tc[1]=106 DO ncabt[L15.t]=1                                                {WHEN 808}
WHEN tc[6]=106 DO ncabt[L15.t]=6                                                {WHEN 809}
WHEN L15.p<>0, L15.p<>1, tc[1]=L15.t, ncnN2L15=1 DO L15.p=1                     {WHEN 810}
WHEN L15.p<>0, L15.p<>6, tc[6]=L15.t, ncnN2L15=6 DO L15.p=6                     {WHEN 811}
WHEN L14.s>=ArrOcc, CurL14=TRUE, L14.p<>2, tc[2]=0 DO tc[2]=107                 {WHEN 812}
WHEN tc[2]=107 DO ncabt[L14.t]=2                                                {WHEN 813}
WHEN L14.p<>0, L14.p<>2, tc[2]=L14.t DO L14.p=2                                 {WHEN 814}
WHEN L13.s>=ArrOcc, CurL13=TRUE, L13.p<>2, tc[2]=0 DO tc[2]=109                 {WHEN 815}
WHEN tc[2]=109 DO ncabt[L13.t]=2                                                {WHEN 816}
WHEN L13.p<>0, L13.p<>2, tc[2]=L13.t DO L13.p=2                                 {WHEN 817}
WHEN L12.s>=ArrOcc, CurL12=TRUE, L12.p<>2, tc[2]=0 DO tc[2]=110                 {WHEN 818}
WHEN tc[2]=110 DO ncabt[L12.t]=2                                                {WHEN 819}
WHEN L12.p<>0, L12.p<>2, tc[2]=L12.t DO L12.p=2                                 {WHEN 820}
WHEN L12.p<>0, L12.p<>1, tc[1]=L12.t DO L12.p=1                                 {WHEN 821}
WHEN L11.s>=ArrOcc, CurL11=TRUE, L11.p<>4, tc[4]=0 DO tc[4]=111                 {WHEN 822}
WHEN tc[4]=111 DO ncabt[L11.t]=4                                                {WHEN 823}
WHEN L11.p<>0, L11.p<>4, tc[4]=L11.t DO L11.p=4                                 {WHEN 824}
WHEN L11.p<>0, L11.p<>3, tc[3]=L11.t DO L11.p=3                                 {WHEN 825}
WHEN L10.s>=ArrOcc, CurL10=TRUE, L10.p<>4, tc[4]=0 DO tc[4]=112                 {WHEN 826}
WHEN tc[4]=112 DO ncabt[L10.t]=4                                                {WHEN 827}
WHEN L10.p<>0, L10.p<>4, tc[4]=L10.t DO L10.p=4                                 {WHEN 828}
WHEN L10.p<>0, L10.p<>3, tc[3]=L10.t DO L10.p=3                                 {WHEN 829}
WHEN L9.s>=ArrOcc, CurL9=TRUE, L9.p<>6, tc[6]=0 DO tc[6]=113                    {WHEN 830}
WHEN tc[6]=113 DO ncabt[L9.t]=6                                                 {WHEN 831}
WHEN L9.p<>0, L9.p<>6, tc[6]=L9.t DO L9.p=6                                     {WHEN 832}
WHEN L8.s>=ArrOcc, CurL8=TRUE, L8.p<>6, tc[6]=0 DO tc[6]=114                    {WHEN 833}
WHEN tc[6]=114 DO ncabt[L8.t]=6                                                 {WHEN 834}
WHEN L8.p<>0, L8.p<>6, tc[6]=L8.t DO L8.p=6                                     {WHEN 835}
WHEN L7.s>=ArrOcc, CurL7=TRUE, L7.p<>7, tc[7]=0 DO tc[7]=115                    {WHEN 836}
WHEN tc[7]=115 DO ncabt[L7.t]=7                                                 {WHEN 837}
WHEN L7.p<>0, L7.p<>7, tc[7]=L7.t DO L7.p=7                                     {WHEN 838}
WHEN L6.s>=ArrOcc, CurL6=TRUE, L6.p<>7, tc[7]=0 DO tc[7]=116                    {WHEN 839}
WHEN tc[7]=116 DO ncabt[L6.t]=7                                                 {WHEN 840}
WHEN L6.p<>0, L6.p<>7, tc[7]=L6.t DO L6.p=7                                     {WHEN 841}
WHEN L5.s>=ArrOcc, CurL5=TRUE, L5.p<>5, tc[5]=0 DO tc[5]=118                    {WHEN 842}
WHEN tc[5]=118 DO ncabt[L5.t]=5                                                 {WHEN 843}
WHEN L5.p<>0, L5.p<>5, tc[5]=L5.t DO L5.p=5                                     {WHEN 844}
WHEN L4.s>=ArrOcc, CurL4=TRUE, L4.p<>5, tc[5]=0 DO tc[5]=120                    {WHEN 845}
WHEN tc[5]=120 DO ncabt[L4.t]=5                                                 {WHEN 846}
WHEN L4.p<>0, L4.p<>5, tc[5]=L4.t DO L4.p=5                                     {WHEN 847}
WHEN L3.s>=ArrOcc, CurL3=TRUE, L3.p<>5, tc[5]=0 DO tc[5]=121                    {WHEN 848}
WHEN tc[5]=121 DO ncabt[L3.t]=5                                                 {WHEN 849}
WHEN L3.p<>0, L3.p<>5, tc[5]=L3.t DO L3.p=5                                     {WHEN 850}
WHEN L2.s>=ArrOcc, CurL2=TRUE, L2.p<>6, ncnN2L2=6, tc[6]=0 DO tc[6]=124         {WHEN 851}
WHEN L2.s>=ArrOcc, CurL2=TRUE, L2.p<>5, ncnN2L2=5, tc[5]=0 DO tc[5]=124         {WHEN 852}
WHEN tc[6]=124 DO ncabt[L2.t]=6                                                 {WHEN 853}
WHEN tc[5]=124 DO ncabt[L2.t]=5                                                 {WHEN 854}
WHEN L2.p<>0, L2.p<>6, tc[6]=L2.t, ncnN2L2=6 DO L2.p=6                          {WHEN 855}
WHEN L2.p<>0, L2.p<>5, tc[5]=L2.t, ncnN2L2=5 DO L2.p=5                          {WHEN 856}
WHEN L17.s>=ArrOcc, CurL17=TRUE, L17.p<>4, ncnTO4=4, tc[4]=0 DO tc[4]=126       {WHEN 857}
WHEN L17.s>=ArrOcc, CurL17=TRUE, L17.p<>5, ncnTO4=5, tc[5]=0 DO tc[5]=126       {WHEN 858}
WHEN tc[4]=126 DO ncabt[L17.t]=4                                                {WHEN 859}
WHEN tc[5]=126 DO ncabt[L17.t]=5                                                {WHEN 860}
WHEN L17.p<>0, L17.p<>4, tc[4]=L17.t, ncnTO4=4 DO L17.p=4                       {WHEN 861}
WHEN L17.p<>0, L17.p<>5, tc[5]=L17.t, ncnTO4=5 DO L17.p=5                       {WHEN 862}
WHEN L18.s>=ArrOcc, CurL18=TRUE, L18.p<>3, tc[3]=0 DO tc[3]=130                 {WHEN 863}
WHEN tc[3]=130 DO ncabt[L18.t]=3                                                {WHEN 864}
WHEN L18.p<>0, L18.p<>3, tc[3]=L18.t DO L18.p=3                                 {WHEN 865}
WHEN L19.s>=ArrOcc, CurL19=TRUE, L19.p<>3, tc[3]=0 DO tc[3]=131                 {WHEN 866}
WHEN tc[3]=131 DO ncabt[L19.t]=3                                                {WHEN 867}
WHEN L19.p<>0, L19.p<>3, tc[3]=L19.t DO L19.p=3                                 {WHEN 868}
WHEN L20.s>=ArrOcc, CurL20=TRUE, L20.p<>2, tc[2]=0 DO tc[2]=132                 {WHEN 869}
WHEN tc[2]=132 DO ncabt[L20.t]=2                                                {WHEN 870}
WHEN L20.p<>0, L20.p<>2, tc[2]=L20.t DO L20.p=2                                 {WHEN 871}
WHEN L21.s>=ArrOcc, CurL21=TRUE, L21.p<>2, tc[2]=0 DO tc[2]=134                 {WHEN 872}
WHEN tc[2]=134 DO ncabt[L21.t]=2                                                {WHEN 873}
WHEN L21.p<>0, L21.p<>2, tc[2]=L21.t DO L21.p=2                                 {WHEN 874}

{ Long sections where a train may be passed }

{ WHEN Arriving DO Collect following train types }
{ WHEN Time to go & waited for fast train DO collect following train types }
{ WHEN Arriving or time to go & no passing free DO cancel following train types }

{stat=L5, Feed=L6/*rpTO4}
WHEN L4.s=Arriving DO mxttL4=0, mxttL4=tt[*rpTO4.t]|, mxttL4=tt[L6.t]|          {WHEN 875}
WHEN L4.s=Stopped, $TIME>=L4.wt, initialised<>4, tt[L4.t]<mxttL4                {WHEN 876}
 DO	L4.wt=5+, mxttL4=0, mxttL4=tt[*rpTO4.t]|, mxttL4=tt[L6.t]|, mxttL4=tt[L5.t]|
WHEN L4.s=Arriving, L3.s<>Free                                                  {WHEN 877}
 OR  L4.s=Stopped, $TIME>=L4.wt, initialised<>4, tt[L4.t]<mxttL4, L3.s<>Free
 DO	mxttL4=0
{stat=L5, Feed=L6/*rpTO4}
WHEN L3.s=Arriving DO mxttL3=0, mxttL3=tt[*rpTO4.t]|, mxttL3=tt[L6.t]|          {WHEN 878}
WHEN L3.s=Stopped, $TIME>=L3.wt, initialised<>4, tt[L3.t]<mxttL3                {WHEN 879}
 DO	L3.wt=5+, mxttL3=0, mxttL3=tt[*rpTO4.t]|, mxttL3=tt[L6.t]|, mxttL3=tt[L5.t]|
WHEN L3.s=Arriving, L4.s<>Free                                                  {WHEN 880}
 OR  L3.s=Stopped, $TIME>=L3.wt, initialised<>4, tt[L3.t]<mxttL3, L4.s<>Free
 DO	mxttL3=0

{ Train stopping in long sections that are not sidings }

{ WHEN Timer expired DO release cab }
{ WHEN Stopping & !OptI DO StopClear }
{ WHEN ArrOcc after 1 second & t <> next.t OR Stopping DO speed=SLOW }
{ WHEN (Arriving|Occupied) & t = next.t DO [Resume speed] Brake_off }
{ WHEN Occupied & OptO DO Departing }

WHEN L16.s>=StopClear, L16.s<=Stopping, L16.t<90, $SESSION>=L16.wt              {WHEN 881}
 DO	spt[L16.t]=Stopped, L16.p=0, L16.s=Stopped, L16.wt=$TIME, L16.wt=5+
WHEN L16.s=Stopping, OptL16=FALSE                                               {WHEN 882}
 DO	L16.s=StopClear, $Color Block(3,15,1)=colt[L16.t]
WHEN L16.s>=ArrOcc, $SESSION>=L16.wt, L16.t<>*npN2L16.t OR L16.s=Stopping       {WHEN 883}
 DO	spt[L16.t]=DoMin
WHEN L16.s>=ArrOcc, L16.t=*npN2L16.t DO spt[L16.t]=DoFull                       {WHEN 884}
WHEN L16.s=Occupied, L16.t=*npN2L16.t, *npN2L16.s=Arriving                      {WHEN 885}
 OR  L16.s=Occupied, L16.t=*npN2L16.t, *npN2L16.s=Stopping
 OR  L16.s=Occupied, L16.t=*npN2L16.t, OptOL16=TRUE
 DO	L16.s=Departing
	$Color Block(3,15,1)=colt0, $Color Track(5,18,1)=colt[L16.t]
WHEN L15.s>=StopClear, L15.s<=Stopping, L15.t<90, $SESSION>=L15.wt              {WHEN 886}
 DO	spt[L15.t]=Stopped, L15.p=0, L15.s=Stopped, L15.wt=$TIME, L15.wt=5+
WHEN L15.s=Stopping, OptL15=FALSE                                               {WHEN 887}
 DO	L15.s=StopClear, $Color Block(7,18,1)=colt[L15.t]
WHEN L15.s>=ArrOcc, $SESSION>=L15.wt, L15.t<>*npN2L15.t OR L15.s=Stopping       {WHEN 888}
 DO	spt[L15.t]=DoMin, tcalL15=0
WHEN L15.s>=ArrOcc, L15.t=*npN2L15.t, tcalL15=0 DO spt[L15.t]=DoFull            {WHEN 889}
WHEN L15.s=Occupied, L15.t=*npN2L15.t, *npN2L15.s=Arriving                      {WHEN 890}
 OR  L15.s=Occupied, L15.t=*npN2L15.t, *npN2L15.s=Stopping
 OR  L15.s=Occupied, L15.t=*npN2L15.t, OptOL15=TRUE
 DO	L15.s=Departing
	$Color Block(7,18,1)=colt0, $Color Track(12,18,1)=colt[L15.t]
WHEN L14.s>=StopClear, L14.s<=Stopping, L14.t<90, $SESSION>=L14.wt              {WHEN 891}
 DO	spt[L14.t]=Stopped, L14.p=0, L14.s=Stopped, L14.wt=$TIME, L14.wt=5+
WHEN L14.s=Stopping, OptL14=FALSE                                               {WHEN 892}
 DO	L14.s=StopClear, $Color Block(13,18,1)=colt[L14.t]
WHEN L14.s>=ArrOcc, $SESSION>=L14.wt, L14.t<>X2.t OR L14.s=Stopping             {WHEN 893}
 DO	spt[L14.t]=DoMin
WHEN L14.s>=ArrOcc, L14.t=X2.t DO spt[L14.t]=DoFull                             {WHEN 894}
WHEN L14.s=Occupied, L14.t=X2.t, X2.s=Arriving                                  {WHEN 895}
 OR  L14.s=Occupied, L14.t=X2.t, X2.s=Stopping
 OR  L14.s=Occupied, L14.t=X2.t, OptOL14=TRUE
 DO	L14.s=Departing
	$Color Block(13,18,1)=colt0, $Color Track(15,15,1)=colt[L14.t]
WHEN L13.s>=StopClear, L13.s<=Stopping, L13.t<90, $SESSION>=L13.wt              {WHEN 896}
 DO	spt[L13.t]=Stopped, L13.p=0, L13.s=Stopped, L13.wt=$TIME, L13.wt=5+
WHEN L13.s=Stopping, OptL13=FALSE                                               {WHEN 897}
 DO	L13.s=StopClear, $Color Block(15,13,1)=colt[L13.t]
WHEN L13.s>=ArrOcc, $SESSION>=L13.wt, L13.t<>L12.t OR L13.s=Stopping            {WHEN 898}
 DO	spt[L13.t]=DoMin
WHEN L13.s>=ArrOcc, L13.t=L12.t DO spt[L13.t]=DoFull                            {WHEN 899}
WHEN L13.s=Occupied, L13.t=L12.t, L12.s=Arriving                                {WHEN 900}
 OR  L13.s=Occupied, L13.t=L12.t, L12.s=Stopping
 OR  L13.s=Occupied, L13.t=L12.t, OptOL13=TRUE
 DO	L13.s=Departing
	$Color Block(15,13,1)=colt0, $Color Track(15,8,1)=colt[L13.t]
WHEN L12.s>=StopClear, L12.s<=Stopping, L12.t<90, $SESSION>=L12.wt              {WHEN 901}
 DO	spt[L12.t]=Stopped, L12.p=0, L12.s=Stopped, L12.wt=$TIME, L12.wt=5+
WHEN L12.s=Stopping, OptL12=FALSE                                               {WHEN 902}
 DO	L12.s=StopClear, $Color Block(15,7,1)=colt[L12.t]
WHEN L12.s>=ArrOcc, $SESSION>=L12.wt, L12.t<>*npN1L12.t OR L12.s=Stopping       {WHEN 903}
 DO	spt[L12.t]=DoMin
WHEN L12.s>=ArrOcc, L12.t=*npN1L12.t DO spt[L12.t]=DoFull                       {WHEN 904}
WHEN L12.s=Occupied, L12.t=*npN1L12.t, *npN1L12.s=Arriving                      {WHEN 905}
 OR  L12.s=Occupied, L12.t=*npN1L12.t, *npN1L12.s=Stopping
 OR  L12.s=Occupied, L12.t=*npN1L12.t, OptOL12=TRUE
 DO	L12.s=Departing
	$Color Block(15,7,1)=colt0, $Color Track(12,3,1)=colt[L12.t]
WHEN L11.s>=StopClear, L11.s<=Stopping, L11.t<90, $SESSION>=L11.wt              {WHEN 906}
 DO	spt[L11.t]=Stopped, L11.p=0, L11.s=Stopped, L11.wt=$TIME, L11.wt=5+
WHEN L11.s=Stopping, OptL11=FALSE                                               {WHEN 907}
 DO	L11.s=StopClear, $Color Block(10,3,1)=colt[L11.t]
WHEN L11.s>=ArrOcc, $SESSION>=L11.wt, L11.t<>L10.t OR L11.s=Stopping            {WHEN 908}
 DO	spt[L11.t]=DoMin
WHEN L11.s>=ArrOcc, L11.t=L10.t DO spt[L11.t]=DoFull                            {WHEN 909}
WHEN L11.s=Occupied, L11.t=L10.t, L10.s=Arriving                                {WHEN 910}
 OR  L11.s=Occupied, L11.t=L10.t, L10.s=Stopping
 OR  L11.s=Occupied, L11.t=L10.t, OptOL11=TRUE
 DO	L11.s=Departing
	$Color Block(10,3,1)=colt0, $Color Track(6,3,1)=colt[L11.t]
WHEN L10.s>=StopClear, L10.s<=Stopping, L10.t<90, $SESSION>=L10.wt              {WHEN 911}
 DO	spt[L10.t]=Stopped, L10.p=0, L10.s=Stopped, L10.wt=$TIME, L10.wt=5+
WHEN L10.s=Stopping, OptL10=FALSE                                               {WHEN 912}
 DO	L10.s=StopClear, $Color Block(5,3,1)=colt[L10.t]
WHEN L10.s>=ArrOcc, $SESSION>=L10.wt, L10.t<>*npN2L10.t OR L10.s=Stopping       {WHEN 913}
 DO	spt[L10.t]=DoMin
WHEN L10.s>=ArrOcc, L10.t=*npN2L10.t DO spt[L10.t]=DoFull                       {WHEN 914}
WHEN L10.s=Occupied, L10.t=*npN2L10.t, *npN2L10.s=Arriving                      {WHEN 915}
 OR  L10.s=Occupied, L10.t=*npN2L10.t, *npN2L10.s=Stopping
 OR  L10.s=Occupied, L10.t=*npN2L10.t, OptOL10=TRUE
 DO	L10.s=Departing
	$Color Block(5,3,1)=colt0, $Color Track(3,7,1)=colt[L10.t]
WHEN L9.s>=StopClear, L9.s<=Stopping, L9.t<90, $SESSION>=L9.wt                  {WHEN 916}
 DO	spt[L9.t]=Stopped, L9.p=0, L9.s=Stopped, L9.wt=$TIME, L9.wt=5+
WHEN L9.s=Stopping, OptL9=FALSE                                                 {WHEN 917}
 DO	L9.s=StopClear, $Color Block(2,10,1)=colt[L9.t]
WHEN L9.s>=ArrOcc, $SESSION>=L9.wt, L9.t<>L8.t OR L9.s=Stopping                 {WHEN 918}
 DO	spt[L9.t]=DoMin, tcalL9=0
WHEN L9.s>=ArrOcc, L9.t=L8.t, tcalL9=0 DO spt[L9.t]=DoFull                      {WHEN 919}
WHEN L9.s=Occupied, L9.t=L8.t, L8.s=Arriving                                    {WHEN 920}
 OR  L9.s=Occupied, L9.t=L8.t, L8.s=Stopping
 OR  L9.s=Occupied, L9.t=L8.t, OptOL9=TRUE
 DO	L9.s=Departing
	$Color Block(2,10,1)=colt0, $Color Track(2,4,1)=colt[L9.t]
WHEN L8.s>=StopClear, L8.s<=Stopping, L8.t<90, $SESSION>=L8.wt                  {WHEN 921}
 DO	spt[L8.t]=Stopped, L8.p=0, L8.s=Stopped, L8.wt=$TIME, L8.wt=5+
WHEN L8.s=Stopping, OptL8=FALSE                                                 {WHEN 922}
 DO	L8.s=StopClear, $Color Block(2,3,1)=colt[L8.t]
WHEN L8.s>=ArrOcc, $SESSION>=L8.wt, L8.t<>L7.t OR L8.s=Stopping                 {WHEN 923}
 DO	spt[L8.t]=DoMin
WHEN L8.s>=ArrOcc, L8.t=L7.t DO spt[L8.t]=DoFull                                {WHEN 924}
WHEN L8.s=Occupied, L8.t=L7.t, L7.s=Arriving                                    {WHEN 925}
 OR  L8.s=Occupied, L8.t=L7.t, L7.s=Stopping
 OR  L8.s=Occupied, L8.t=L7.t, OptOL8=TRUE
 DO	L8.s=Departing
	$Color Block(2,3,1)=colt0, $Color Track(11,2,1)=colt[L8.t]
WHEN L7.s>=StopClear, L7.s<=Stopping, L7.t<90, $SESSION>=L7.wt                  {WHEN 926}
 DO	spt[L7.t]=Stopped, L7.p=0, L7.s=Stopped, L7.wt=$TIME, L7.wt=5+
WHEN L7.s=Stopping, OptL7=FALSE                                                 {WHEN 927}
 DO	L7.s=StopClear, $Color Block(12,2,1)=colt[L7.t]
WHEN L7.s>=ArrOcc, $SESSION>=L7.wt, L7.t<>L6.t OR L7.s=Stopping                 {WHEN 928}
 DO	spt[L7.t]=DoMin
WHEN L7.s>=ArrOcc, L7.t=L6.t DO spt[L7.t]=DoFull                                {WHEN 929}
WHEN L7.s=Occupied, L7.t=L6.t, L6.s=Arriving                                    {WHEN 930}
 OR  L7.s=Occupied, L7.t=L6.t, L6.s=Stopping
 OR  L7.s=Occupied, L7.t=L6.t, OptOL7=TRUE
 DO	L7.s=Departing
	$Color Block(12,2,1)=colt0, $Color Track(16,7,1)=colt[L7.t]
WHEN L6.s>=StopClear, L6.s<=Stopping, L6.t<90, $SESSION>=L6.wt                  {WHEN 931}
 DO	spt[L6.t]=Stopped, L6.p=0, L6.s=Stopped, L6.wt=$TIME, L6.wt=5+
WHEN L6.s=Stopping, OptL6=FALSE                                                 {WHEN 932}
 DO	L6.s=StopClear, $Color Block(16,8,1)=colt[L6.t]
WHEN L6.s>=ArrOcc, $SESSION>=L6.wt, L6.t<>*lpTI4.t OR L6.s=Stopping             {WHEN 933}
 DO	spt[L6.t]=DoMin
WHEN L6.s>=ArrOcc, L6.t=*lpTI4.t DO spt[L6.t]=DoFull                            {WHEN 934}
WHEN L6.s=Occupied, L6.t=*lpTI4.t, *lpTI4.s=Arriving                            {WHEN 935}
 OR  L6.s=Occupied, L6.t=*lpTI4.t, *lpTI4.s=Stopping
 OR  L6.s=Occupied, L6.t=*lpTI4.t, OptOL6=TRUE
 DO	L6.s=Departing
	$Color Block(16,8,1)=colt0, $Color Track(16,14,1)=colt[L6.t]
WHEN L5.s>=StopClear, L5.s<=Stopping, L5.t<90, $SESSION>=L5.wt                  {WHEN 936}
 DO	spt[L5.t]=Stopped, L5.p=0, L5.s=Stopped, L5.wt=$TIME, L5.wt=5+
WHEN L5.s=Stopping, OptL5=FALSE                                                 {WHEN 937}
 DO	L5.s=StopClear, $Color Block(16,16,1)=colt[L5.t]
WHEN L5.s>=ArrOcc, $SESSION>=L5.wt, L5.t<>*npTO3.t OR L5.s=Stopping             {WHEN 938}
 DO	spt[L5.t]=DoMin
WHEN L5.s>=ArrOcc, L5.t=*npTO3.t DO spt[L5.t]=DoFull                            {WHEN 939}
WHEN L5.s=Occupied, L5.t=*npTO3.t, *npTO3.s=Arriving                            {WHEN 940}
 OR  L5.s=Occupied, L5.t=*npTO3.t, *npTO3.s=Stopping
 OR  L5.s=Occupied, L5.t=*npTO3.t, OptOL5=TRUE
 DO	L5.s=Departing
	$Color Block(16,16,1)=colt0, $Color Track(14,19,1)=colt[L5.t]
WHEN L4.s>=StopClear, L4.s<=Stopping, L4.t<90, $SESSION>=L4.wt                  {WHEN 941}
 DO	spt[L4.t]=Stopped, L4.p=0, L4.s=Stopped, L4.wt=$TIME, L4.wt=5+
WHEN L4.s=Stopping, OptL4=FALSE                                                 {WHEN 942}
 DO	L4.s=StopClear, $Color Block(12,20,1)=colt[L4.t]
WHEN L4.s>=ArrOcc, $SESSION>=L4.wt, L4.t<>*npN2L4.t OR L4.s=Stopping            {WHEN 943}
 DO	spt[L4.t]=DoMin
WHEN L4.s>=ArrOcc, L4.t=*npN2L4.t DO spt[L4.t]=DoFull                           {WHEN 944}
WHEN L4.s=Occupied, L4.t=*npN2L4.t, *npN2L4.s=Arriving                          {WHEN 945}
 OR  L4.s=Occupied, L4.t=*npN2L4.t, *npN2L4.s=Stopping
 OR  L4.s=Occupied, L4.t=*npN2L4.t, OptOL4=TRUE
 DO	L4.s=Departing
	$Color Block(12,20,1)=colt0, $Color Track(5,20,1)=colt[L4.t]
WHEN L3.s>=StopClear, L3.s<=Stopping, L3.t<90, $SESSION>=L3.wt                  {WHEN 946}
 DO	spt[L3.t]=Stopped, L3.p=0, L3.s=Stopped, L3.wt=$TIME, L3.wt=5+
WHEN L3.s=Stopping, OptL3=FALSE                                                 {WHEN 947}
 DO	L3.s=StopClear, $Color Block(12,19,1)=colt[L3.t]
WHEN L3.s>=ArrOcc, $SESSION>=L3.wt, L3.t<>*npN2L3.t OR L3.s=Stopping            {WHEN 948}
 DO	spt[L3.t]=DoMin
WHEN L3.s>=ArrOcc, L3.t=*npN2L3.t DO spt[L3.t]=DoFull                           {WHEN 949}
WHEN L3.s=Occupied, L3.t=*npN2L3.t, *npN2L3.s=Arriving                          {WHEN 950}
 OR  L3.s=Occupied, L3.t=*npN2L3.t, *npN2L3.s=Stopping
 OR  L3.s=Occupied, L3.t=*npN2L3.t, OptOL3=TRUE
 DO	L3.s=Departing
	$Color Block(12,19,1)=colt0, $Color Track(6,19,1)=colt[L3.t]
WHEN L2.s>=StopClear, L2.s<=Stopping, L2.t<90, $SESSION>=L2.wt                  {WHEN 951}
 DO	spt[L2.t]=Stopped, L2.p=0, L2.s=Stopped, L2.wt=$TIME, L2.wt=5+
WHEN L2.s=Stopping, D2.s=Fwd, OptL2=FALSE                                       {WHEN 952}
 OR  L2.s=Stopping, D2.s=Rev, OptOL2=FALSE
 DO	L2.s=StopClear, $Color Block(3,19,1)=colt[L2.t]
WHEN L2.s>=ArrOcc, $SESSION>=L2.wt, L2.t<>*npN2L2.t OR L2.s=Stopping            {WHEN 953}
 DO	spt[L2.t]=DoMin
WHEN L2.s>=ArrOcc, L2.t=*npN2L2.t DO spt[L2.t]=DoFull                           {WHEN 954}
WHEN L2.s=Occupied, L2.t=*npN2L2.t, *npN2L2.s=Arriving                          {WHEN 955}
 OR  L2.s=Occupied, L2.t=*npN2L2.t, *npN2L2.s=Stopping
 OR  L2.s=Occupied, L2.t=*npN2L2.t, OptOL2=TRUE
 DO	L2.s=Departing
	$Color Block(3,19,1)=colt0, $Color Track(2,16,1)=colt[L2.t]
WHEN L17.s>=StopClear, L17.s<=Stopping, L17.t<90, $SESSION>=L17.wt              {WHEN 956}
 DO	spt[L17.t]=Stopped, L17.p=0, L17.s=Stopped, L17.wt=$TIME, L17.wt=5+
WHEN L17.s=Stopping, OptL17=FALSE                                               {WHEN 957}
 DO	L17.s=StopClear, $Color Block(7,12,1)=colt[L17.t]
WHEN L17.s>=ArrOcc, $SESSION>=L17.wt, L17.t<>*lpTI2.t OR L17.s=Stopping         {WHEN 958}
 DO	spt[L17.t]=DoMin
WHEN L17.s>=ArrOcc, L17.t=*lpTI2.t DO spt[L17.t]=DoFull                         {WHEN 959}
WHEN L17.s=Occupied, L17.t=*lpTI2.t, *lpTI2.s=Arriving                          {WHEN 960}
 OR  L17.s=Occupied, L17.t=*lpTI2.t, *lpTI2.s=Stopping
 OR  L17.s=Occupied, L17.t=*lpTI2.t, OptOL17=TRUE
 DO	L17.s=Departing
	$Color Block(7,12,1)=colt0, $Color Track(11,12,1)=colt[L17.t]
WHEN L18.s>=StopClear, L18.s<=Stopping, L18.t<90, $SESSION>=L18.wt              {WHEN 961}
 DO	spt[L18.t]=Stopped, L18.p=0, L18.s=Stopped, L18.wt=$TIME, L18.wt=5+
WHEN L18.s=Stopping, OptL18=FALSE                                               {WHEN 962}
 DO	L18.s=StopClear, $Color Block(14,10,1)=colt[L18.t]
WHEN L18.s>=ArrOcc, $SESSION>=L18.wt, L18.t<>L19.t OR L18.s=Stopping            {WHEN 963}
 DO	spt[L18.t]=DoMin
WHEN L18.s>=ArrOcc, L18.t=L19.t DO spt[L18.t]=DoFull                            {WHEN 964}
WHEN L18.s=Occupied, L18.t=L19.t, L19.s=Arriving                                {WHEN 965}
 OR  L18.s=Occupied, L18.t=L19.t, L19.s=Stopping
 OR  L18.s=Occupied, L18.t=L19.t, OptOL18=TRUE
 DO	L18.s=Departing
	$Color Block(14,10,1)=colt0, $Color Track(14,8,1)=colt[L18.t]
WHEN L19.s>=StopClear, L19.s<=Stopping, L19.t<90, $SESSION>=L19.wt              {WHEN 966}
 DO	spt[L19.t]=Stopped, L19.p=0, L19.s=Stopped, L19.wt=$TIME, L19.wt=5+
WHEN L19.s=Stopping, OptL19=FALSE                                               {WHEN 967}
 DO	L19.s=StopClear, $Color Block(14,7,1)=colt[L19.t]
WHEN L19.s>=ArrOcc, $SESSION>=L19.wt, L19.t<>*npN1L19.t OR L19.s=Stopping       {WHEN 968}
 DO	spt[L19.t]=DoMin
WHEN L19.s>=ArrOcc, L19.t=*npN1L19.t DO spt[L19.t]=DoFull                       {WHEN 969}
WHEN L19.s=Occupied, L19.t=*npN1L19.t, *npN1L19.s=Arriving                      {WHEN 970}
 OR  L19.s=Occupied, L19.t=*npN1L19.t, *npN1L19.s=Stopping
 OR  L19.s=Occupied, L19.t=*npN1L19.t, OptOL19=TRUE
 DO	L19.s=Departing
	$Color Block(14,7,1)=colt0, $Color Track(13,4,1)=colt[L19.t]
WHEN L20.s>=StopClear, L20.s<=Stopping, L20.t<90, $SESSION>=L20.wt              {WHEN 971}
 DO	spt[L20.t]=Stopped, L20.p=0, L20.s=Stopped, L20.wt=$TIME, L20.wt=5+
WHEN L20.s=Stopping, OptL20=FALSE                                               {WHEN 972}
 DO	L20.s=StopClear, $Color Block(13,10,1)=colt[L20.t]
WHEN L20.s>=ArrOcc, $SESSION>=L20.wt, L20.t<>L21.t OR L20.s=Stopping            {WHEN 973}
 DO	spt[L20.t]=DoMin
WHEN L20.s>=ArrOcc, L20.t=L21.t DO spt[L20.t]=DoFull                            {WHEN 974}
WHEN L20.s=Occupied, L20.t=L21.t, L21.s=Arriving                                {WHEN 975}
 OR  L20.s=Occupied, L20.t=L21.t, L21.s=Stopping
 OR  L20.s=Occupied, L20.t=L21.t, OptOL20=TRUE
 DO	L20.s=Departing
	$Color Block(13,10,1)=colt0, $Color Track(13,9,1)=colt[L20.t]
WHEN L21.s>=StopClear, L21.s<=Stopping, L21.t<90, $SESSION>=L21.wt              {WHEN 976}
 DO	spt[L21.t]=Stopped, L21.p=0, L21.s=Stopped, L21.wt=$TIME, L21.wt=5+
WHEN L21.s=Stopping, OptL21=FALSE                                               {WHEN 977}
 DO	L21.s=StopClear, $Color Block(13,7,1)=colt[L21.t]
WHEN L21.s>=ArrOcc, $SESSION>=L21.wt, L21.t<>*npN1L21.t OR L21.s=Stopping       {WHEN 978}
 DO	spt[L21.t]=DoMin
WHEN L21.s>=ArrOcc, L21.t=*npN1L21.t DO spt[L21.t]=DoFull                       {WHEN 979}
WHEN L21.s=Occupied, L21.t=*npN1L21.t, *npN1L21.s=Arriving                      {WHEN 980}
 OR  L21.s=Occupied, L21.t=*npN1L21.t, *npN1L21.s=Stopping
 OR  L21.s=Occupied, L21.t=*npN1L21.t, OptOL21=TRUE
 DO	L21.s=Departing
	$Color Block(13,7,1)=colt0, $Color Track(13,5,1)=colt[L21.t]

{ Long sections with optical: Train arriving but next section not booked for it }

{ WHEN Shutting down or passing DO Stopping }
{ WHEN Stopping at station DO Stopping }
{ WHEN Booked & (fwd.OptI or rev.OptO) DO Arriving }
{ WHEN Arriving & t=next.t & !OptI & OptO DO Departing }
{ WHEN Arriving & prev Departing & !OptI & !OptO & Cur DO Occupied }
{ WHEN Occupied & !OptI & !OptO & TrLen>SectLen DO TrLen = SectLen }
{ WHEN Moving & t <> next.t, OptO DO Stopping, brake, cancel timer }
{ WHEN Stopping|StopClear & OptO DO Brake, set timer }
{ WHEN Booked & OptO & Cur DO Error, Arriving }
{ WHEN Free & OptO DO Error }

WHEN L16.s=Arriving, initialised=4 DO L16.s=Stopping, L16.wt=99999+             {WHEN 981}
WHEN L16.s=Booked, OptL16=TRUE DO L16.s=Arriving, L16.wt=$SESSION, L16.wt=10+   {WHEN 982}
	$Color Track(3,15,1)=colt[L16.t]
WHEN L16.s=Arriving, L16.t=*npN2L16.t, OptL16=FALSE, OptOL16=TRUE               {WHEN 983}
 DO	L16.s=Departing
	$Color Block(3,15,1)=colt0, $Color Track(5,18,1)=colt[L16.t]
WHEN L16.s=Arriving, *pspN2_L16.s=Departing, OptL16=FALSE, CurL16=TRUE, OptOL16=FALSE
 DO	L16.s=Occupied                                                          {WHEN 984}
	$Color Block(3,15,1)=colt[L16.t]
WHEN L16.s=Occupied, OptL16=FALSE, OptOL16=FALSE, CurL16=TRUE, lent[L16.t]>24   {WHEN 985}
 DO	lent[L16.t]=24
WHEN L16.s=Departing, *npN2L16.s=Booked, OptOL16=FALSE, lent[L16.t]>15          {WHEN 986}
 DO	lent[L16.t]=15
WHEN L16.s>=Moving, OptOL16=TRUE, L16.t<>*npN2L16.t                             {WHEN 987}
 DO	L16.s=Stopping, L16.wt=99999+, spt[L16.t]=Braking
WHEN L16.s>=StopClear, L16.s<=Stopping, OptOL16=TRUE                            {WHEN 988}
 DO	spt[L16.t]=Braking, L16.wt=$SESSION, L16.wt=10+, wait 0.3, L16.p=0
WHEN L16.s=Booked, initialised=2, CurL16=TRUE, OptOL16=TRUE                     {WHEN 989}
 DO	L16.s=Arriving, L16.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L16"
WHEN L16.s=Free, initialised=2, OptOL16=TRUE                                    {WHEN 990}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L16"
	L16.s=WaitClear
WHEN L15.s=Arriving, initialised=4 DO L15.s=Stopping, L15.wt=99999+             {WHEN 991}
WHEN L15.s=Arriving, tt[L15.t]=Local, RandL15<40000                             {WHEN 992}
 OR  L15.s=Arriving, tt[L15.t]=Passenger, RandL15<18000
 OR  L15.s=Arriving, tt[L15.t]=Express, RandL15<4000
 DO	L15.s=Stopping, L15.wt=99999+
WHEN L15.s=Booked, OptL15=TRUE                                                  {WHEN 993}
 DO	L15.s=Arriving, L15.wt=$SESSION, L15.wt=10+, tcalL15=$SESSION, RandL15=$RANDOM
	$Color Track(7,18,1)=colt[L15.t]
WHEN L15.s=Arriving, L15.t=*npN2L15.t, OptL15=FALSE, OptOL15=TRUE               {WHEN 994}
 DO	L15.s=Departing
	$Color Block(7,18,1)=colt0, $Color Track(12,18,1)=colt[L15.t]
WHEN L15.s=Arriving, *pspN2_L15.s=Departing, OptL15=FALSE, CurL15=TRUE, OptOL15=FALSE
 DO	L15.s=Occupied                                                          {WHEN 995}
	$Color Block(7,18,1)=colt[L15.t]
WHEN L15.s=Occupied, OptL15=FALSE, OptOL15=FALSE, CurL15=TRUE, lent[L15.t]>31   {WHEN 996}
 DO	lent[L15.t]=31
WHEN L15.s=Departing, *npN2L15.s=Booked, OptOL15=FALSE, lent[L15.t]>8           {WHEN 997}
 DO	lent[L15.t]=8
WHEN L15.s>=Moving, OptOL15=TRUE, L15.t<>*npN2L15.t                             {WHEN 998}
 DO	L15.s=Stopping, L15.wt=99999+, spt[L15.t]=Braking
WHEN L15.s>=StopClear, L15.s<=Stopping, OptOL15=TRUE                            {WHEN 999}
 DO	spt[L15.t]=Braking, L15.wt=$SESSION, L15.wt=10+, wait 0.3, L15.p=0
WHEN L15.s=Booked, initialised=2, CurL15=TRUE, OptOL15=TRUE                     {WHEN 1000}
 DO	L15.s=Arriving, L15.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L15"
WHEN L15.s=Free, initialised=2, OptOL15=TRUE                                    {WHEN 1001}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L15"
	L15.s=WaitClear
WHEN L14.s=Arriving, initialised=4 DO L14.s=Stopping, L14.wt=99999+             {WHEN 1002}
WHEN L14.s=Booked, OptL14=TRUE DO L14.s=Arriving, L14.wt=$SESSION, L14.wt=10+   {WHEN 1003}
	$Color Track(13,18,1)=colt[L14.t]
WHEN L14.s=Arriving, L14.t=X2.t, OptL14=FALSE, OptOL14=TRUE DO L14.s=Departing  {WHEN 1004}
	$Color Block(13,18,1)=colt0, $Color Track(15,15,1)=colt[L14.t]
WHEN L14.s=Arriving, *pspN2_L14.s=Departing, OptL14=FALSE, CurL14=TRUE, OptOL14=FALSE
 DO	L14.s=Occupied                                                          {WHEN 1005}
	$Color Block(13,18,1)=colt[L14.t]
WHEN L14.s=Occupied, OptL14=FALSE, OptOL14=FALSE, CurL14=TRUE, lent[L14.t]>27   {WHEN 1006}
 DO	lent[L14.t]=27
WHEN L14.s=Departing, X2.s=Booked, OptOL14=FALSE, lent[L14.t]>10                {WHEN 1007}
 DO	lent[L14.t]=10
WHEN L14.s>=Moving, OptOL14=TRUE, L14.t<>X2.t                                   {WHEN 1008}
 DO	L14.s=Stopping, L14.wt=99999+, spt[L14.t]=Braking
WHEN L14.s>=StopClear, L14.s<=Stopping, OptOL14=TRUE                            {WHEN 1009}
 DO	spt[L14.t]=Braking, L14.wt=$SESSION, L14.wt=10+, wait 0.3, L14.p=0
WHEN L14.s=Booked, initialised=2, CurL14=TRUE, OptOL14=TRUE                     {WHEN 1010}
 DO	L14.s=Arriving, L14.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L14"
WHEN L14.s=Free, initialised=2, OptOL14=TRUE                                    {WHEN 1011}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L14"
	L14.s=WaitClear
WHEN L13.s=Arriving, initialised=4 DO L13.s=Stopping, L13.wt=99999+             {WHEN 1012}
WHEN L13.s=Booked, OptL13=TRUE DO L13.s=Arriving, L13.wt=$SESSION, L13.wt=10+   {WHEN 1013}
	$Color Track(15,13,1)=colt[L13.t]
WHEN L13.s=Arriving, L13.t=L12.t, OptL13=FALSE, OptOL13=TRUE DO L13.s=Departing {WHEN 1014}
	$Color Block(15,13,1)=colt0, $Color Track(15,8,1)=colt[L13.t]
WHEN L13.s=Arriving, L14.s=Departing, OptL13=FALSE, CurL13=TRUE, OptOL13=FALSE  {WHEN 1015}
 DO	L13.s=Occupied
	$Color Block(15,13,1)=colt[L13.t]
WHEN L13.s>=Moving, OptOL13=TRUE, L13.t<>L12.t                                  {WHEN 1016}
 DO	L13.s=Stopping, L13.wt=99999+, spt[L13.t]=Braking
WHEN L13.s>=StopClear, L13.s<=Stopping, OptOL13=TRUE                            {WHEN 1017}
 DO	spt[L13.t]=Braking, L13.wt=$SESSION, L13.wt=10+, wait 0.3, L13.p=0
WHEN L13.s=Booked, initialised=2, CurL13=TRUE, OptOL13=TRUE                     {WHEN 1018}
 DO	L13.s=Arriving, L13.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L13"
WHEN L13.s=Free, initialised=2, OptOL13=TRUE                                    {WHEN 1019}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L13"
	L13.s=WaitClear
WHEN L12.s=Arriving, initialised=4 DO L12.s=Stopping, L12.wt=99999+             {WHEN 1020}
WHEN L12.s=Booked, OptL12=TRUE DO L12.s=Arriving, L12.wt=$SESSION, L12.wt=10+   {WHEN 1021}
	$Color Track(15,7,1)=colt[L12.t]
WHEN L12.s=Arriving, L12.t=*npN1L12.t, OptL12=FALSE, OptOL12=TRUE               {WHEN 1022}
 DO	L12.s=Departing
	$Color Block(15,7,1)=colt0, $Color Track(12,3,1)=colt[L12.t]
WHEN L12.s=Arriving, L13.s=Departing, OptL12=FALSE, CurL12=TRUE, OptOL12=FALSE  {WHEN 1023}
 DO	L12.s=Occupied
	$Color Block(15,7,1)=colt[L12.t]
WHEN L12.s>=Moving, OptOL12=TRUE, L12.t<>*npN1L12.t                             {WHEN 1024}
 DO	L12.s=Stopping, L12.wt=99999+, spt[L12.t]=Braking
WHEN L12.s>=StopClear, L12.s<=Stopping, OptOL12=TRUE                            {WHEN 1025}
 DO	spt[L12.t]=Braking, L12.wt=$SESSION, L12.wt=10+, wait 0.3, L12.p=0
WHEN L12.s=Booked, initialised=2, CurL12=TRUE, OptOL12=TRUE                     {WHEN 1026}
 DO	L12.s=Arriving, L12.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L12"
WHEN L12.s=Free, initialised=2, OptOL12=TRUE                                    {WHEN 1027}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L12"
	L12.s=WaitClear
WHEN L11.s=Arriving, initialised=4 DO L11.s=Stopping, L11.wt=99999+             {WHEN 1028}
WHEN L11.s=Booked, OptL11=TRUE DO L11.s=Arriving, L11.wt=$SESSION, L11.wt=10+   {WHEN 1029}
	$Color Track(10,3,1)=colt[L11.t]
WHEN L11.s=Arriving, L11.t=L10.t, OptL11=FALSE, OptOL11=TRUE DO L11.s=Departing {WHEN 1030}
	$Color Block(10,3,1)=colt0, $Color Track(6,3,1)=colt[L11.t]
WHEN L11.s=Arriving, *pspN1_L11.s=Departing, OptL11=FALSE, CurL11=TRUE, OptOL11=FALSE
 DO	L11.s=Occupied                                                          {WHEN 1031}
	$Color Block(10,3,1)=colt[L11.t]
WHEN L11.s=Occupied, OptL11=FALSE, OptOL11=FALSE, CurL11=TRUE, lent[L11.t]>42   {WHEN 1032}
 DO	lent[L11.t]=42
WHEN L11.s=Departing, L10.s=Booked, OptOL11=FALSE, lent[L11.t]>10               {WHEN 1033}
 DO	lent[L11.t]=10
WHEN L11.s>=Moving, OptOL11=TRUE, L11.t<>L10.t                                  {WHEN 1034}
 DO	L11.s=Stopping, L11.wt=99999+, spt[L11.t]=Braking
WHEN L11.s>=StopClear, L11.s<=Stopping, OptOL11=TRUE                            {WHEN 1035}
 DO	spt[L11.t]=Braking, L11.wt=$SESSION, L11.wt=10+, wait 0.3, L11.p=0
WHEN L11.s=Booked, initialised=2, CurL11=TRUE, OptOL11=TRUE                     {WHEN 1036}
 DO	L11.s=Arriving, L11.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L11"
WHEN L11.s=Free, initialised=2, OptOL11=TRUE                                    {WHEN 1037}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L11"
	L11.s=WaitClear
WHEN L10.s=Arriving, initialised=4 DO L10.s=Stopping, L10.wt=99999+             {WHEN 1038}
WHEN L10.s=Booked, OptL10=TRUE DO L10.s=Arriving, L10.wt=$SESSION, L10.wt=10+   {WHEN 1039}
	$Color Track(5,3,1)=colt[L10.t]
WHEN L10.s=Arriving, L10.t=*npN2L10.t, OptL10=FALSE, OptOL10=TRUE               {WHEN 1040}
 DO	L10.s=Departing
	$Color Block(5,3,1)=colt0, $Color Track(3,7,1)=colt[L10.t]
WHEN L10.s=Arriving, L11.s=Departing, OptL10=FALSE, CurL10=TRUE, OptOL10=FALSE  {WHEN 1041}
 DO	L10.s=Occupied
	$Color Block(5,3,1)=colt[L10.t]
WHEN L10.s>=Moving, OptOL10=TRUE, L10.t<>*npN2L10.t                             {WHEN 1042}
 DO	L10.s=Stopping, L10.wt=99999+, spt[L10.t]=Braking
WHEN L10.s>=StopClear, L10.s<=Stopping, OptOL10=TRUE                            {WHEN 1043}
 DO	spt[L10.t]=Braking, L10.wt=$SESSION, L10.wt=10+, wait 0.3, L10.p=0
WHEN L10.s=Booked, initialised=2, CurL10=TRUE, OptOL10=TRUE                     {WHEN 1044}
 DO	L10.s=Arriving, L10.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L10"
WHEN L10.s=Free, initialised=2, OptOL10=TRUE                                    {WHEN 1045}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L10"
	L10.s=WaitClear
WHEN L9.s=Arriving, initialised=4 DO L9.s=Stopping, L9.wt=99999+                {WHEN 1046}
WHEN L9.s=Booked, OptL9=TRUE                                                    {WHEN 1047}
 DO	L9.s=Arriving, L9.wt=$SESSION, L9.wt=10+, tcalL9=$SESSION
	$Color Track(2,10,1)=colt[L9.t]
WHEN L9.s=Arriving, L9.t=L8.t, OptL9=FALSE, OptOL9=TRUE DO L9.s=Departing       {WHEN 1048}
	$Color Block(2,10,1)=colt0, $Color Track(2,4,1)=colt[L9.t]
WHEN L9.s=Arriving, *pspN2_L9.s=Departing, OptL9=FALSE, CurL9=TRUE, OptOL9=FALSE
 DO	L9.s=Occupied                                                           {WHEN 1049}
	$Color Block(2,10,1)=colt[L9.t]
WHEN L9.s=Occupied, OptL9=FALSE, OptOL9=FALSE, CurL9=TRUE, lent[L9.t]>50        {WHEN 1050}
 DO	lent[L9.t]=50
WHEN L9.s=Departing, L8.s=Booked, OptOL9=FALSE, lent[L9.t]>7 DO lent[L9.t]=7    {WHEN 1051}
WHEN L9.s>=Moving, OptOL9=TRUE, L9.t<>L8.t                                      {WHEN 1052}
 DO	L9.s=Stopping, L9.wt=99999+, spt[L9.t]=Braking
WHEN L9.s>=StopClear, L9.s<=Stopping, OptOL9=TRUE                               {WHEN 1053}
 DO	spt[L9.t]=Braking, L9.wt=$SESSION, L9.wt=10+, wait 0.3, L9.p=0
WHEN L9.s=Booked, initialised=2, CurL9=TRUE, OptOL9=TRUE                        {WHEN 1054}
 DO	L9.s=Arriving, L9.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L9"
WHEN L9.s=Free, initialised=2, OptOL9=TRUE                                      {WHEN 1055}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L9"
	L9.s=WaitClear
WHEN L8.s=Arriving, initialised=4 DO L8.s=Stopping, L8.wt=99999+                {WHEN 1056}
WHEN L8.s=Booked, OptL8=TRUE DO L8.s=Arriving, L8.wt=$SESSION, L8.wt=10+        {WHEN 1057}
	$Color Track(2,3,1)=colt[L8.t]
WHEN L8.s=Arriving, L8.t=L7.t, OptL8=FALSE, OptOL8=TRUE DO L8.s=Departing       {WHEN 1058}
	$Color Block(2,3,1)=colt0, $Color Track(11,2,1)=colt[L8.t]
WHEN L8.s=Arriving, L9.s=Departing, OptL8=FALSE, CurL8=TRUE, OptOL8=FALSE       {WHEN 1059}
 DO	L8.s=Occupied
	$Color Block(2,3,1)=colt[L8.t]
WHEN L8.s>=Moving, OptOL8=TRUE, L8.t<>L7.t                                      {WHEN 1060}
 DO	L8.s=Stopping, L8.wt=99999+, spt[L8.t]=Braking
WHEN L8.s>=StopClear, L8.s<=Stopping, OptOL8=TRUE                               {WHEN 1061}
 DO	spt[L8.t]=Braking, L8.wt=$SESSION, L8.wt=10+, wait 0.3, L8.p=0
WHEN L8.s=Booked, initialised=2, CurL8=TRUE, OptOL8=TRUE                        {WHEN 1062}
 DO	L8.s=Arriving, L8.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L8"
WHEN L8.s=Free, initialised=2, OptOL8=TRUE                                      {WHEN 1063}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L8"
	L8.s=WaitClear
WHEN L7.s=Arriving, initialised=4 DO L7.s=Stopping, L7.wt=99999+                {WHEN 1064}
WHEN L7.s=Booked, OptL7=TRUE DO L7.s=Arriving, L7.wt=$SESSION, L7.wt=10+        {WHEN 1065}
	$Color Track(12,2,1)=colt[L7.t]
WHEN L7.s=Arriving, L7.t=L6.t, OptL7=FALSE, OptOL7=TRUE DO L7.s=Departing       {WHEN 1066}
	$Color Block(12,2,1)=colt0, $Color Track(16,7,1)=colt[L7.t]
WHEN L7.s=Arriving, L8.s=Departing, OptL7=FALSE, CurL7=TRUE, OptOL7=FALSE       {WHEN 1067}
 DO	L7.s=Occupied
	$Color Block(12,2,1)=colt[L7.t]
WHEN L7.s>=Moving, OptOL7=TRUE, L7.t<>L6.t                                      {WHEN 1068}
 DO	L7.s=Stopping, L7.wt=99999+, spt[L7.t]=Braking
WHEN L7.s>=StopClear, L7.s<=Stopping, OptOL7=TRUE                               {WHEN 1069}
 DO	spt[L7.t]=Braking, L7.wt=$SESSION, L7.wt=10+, wait 0.3, L7.p=0
WHEN L7.s=Booked, initialised=2, CurL7=TRUE, OptOL7=TRUE                        {WHEN 1070}
 DO	L7.s=Arriving, L7.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L7"
WHEN L7.s=Free, initialised=2, OptOL7=TRUE                                      {WHEN 1071}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L7"
	L7.s=WaitClear
WHEN L6.s=Arriving, initialised=4 DO L6.s=Stopping, L6.wt=99999+                {WHEN 1072}
WHEN L6.s=Booked, OptL6=TRUE DO L6.s=Arriving, L6.wt=$SESSION, L6.wt=10+        {WHEN 1073}
	$Color Track(16,8,1)=colt[L6.t]
WHEN L6.s=Arriving, L6.t=*lpTI4.t, OptL6=FALSE, OptOL6=TRUE DO L6.s=Departing   {WHEN 1074}
	$Color Block(16,8,1)=colt0, $Color Track(16,14,1)=colt[L6.t]
WHEN L6.s=Arriving, L7.s=Departing, OptL6=FALSE, CurL6=TRUE, OptOL6=FALSE       {WHEN 1075}
 DO	L6.s=Occupied
	$Color Block(16,8,1)=colt[L6.t]
WHEN L6.s>=Moving, OptOL6=TRUE, L6.t<>*lpTI4.t                                  {WHEN 1076}
 DO	L6.s=Stopping, L6.wt=99999+, spt[L6.t]=Braking
WHEN L6.s>=StopClear, L6.s<=Stopping, OptOL6=TRUE                               {WHEN 1077}
 DO	spt[L6.t]=Braking, L6.wt=$SESSION, L6.wt=10+, wait 0.3, L6.p=0
WHEN L6.s=Booked, initialised=2, CurL6=TRUE, OptOL6=TRUE                        {WHEN 1078}
 DO	L6.s=Arriving, L6.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L6"
WHEN L6.s=Free, initialised=2, OptOL6=TRUE                                      {WHEN 1079}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L6"
	L6.s=WaitClear
WHEN L5.s=Arriving, initialised=4 DO L5.s=Stopping, L5.wt=99999+                {WHEN 1080}
WHEN L5.s=Booked, OptL5=TRUE DO L5.s=Arriving, L5.wt=$SESSION, L5.wt=10+        {WHEN 1081}
	$Color Track(16,16,1)=colt[L5.t]
WHEN L5.s=Arriving, L5.t=*npTO3.t, OptL5=FALSE, OptOL5=TRUE DO L5.s=Departing   {WHEN 1082}
	$Color Block(16,16,1)=colt0, $Color Track(14,19,1)=colt[L5.t]
WHEN L5.s=Arriving, *pspTI4.s=Departing, OptL5=FALSE, CurL5=TRUE, OptOL5=FALSE  {WHEN 1083}
 DO	L5.s=Occupied
	$Color Block(16,16,1)=colt[L5.t]
WHEN L5.s=Occupied, OptL5=FALSE, OptOL5=FALSE, CurL5=TRUE, lent[L5.t]>26        {WHEN 1084}
 DO	lent[L5.t]=26
WHEN L5.s=Departing, *npTO3.s=Booked, OptOL5=FALSE, lent[L5.t]>10               {WHEN 1085}
 DO	lent[L5.t]=10
WHEN L5.s>=Moving, OptOL5=TRUE, L5.t<>*npTO3.t                                  {WHEN 1086}
 DO	L5.s=Stopping, L5.wt=99999+, spt[L5.t]=Braking
WHEN L5.s>=StopClear, L5.s<=Stopping, OptOL5=TRUE                               {WHEN 1087}
 DO	spt[L5.t]=Braking, L5.wt=$SESSION, L5.wt=10+, wait 0.3, L5.p=0
WHEN L5.s=Booked, initialised=2, CurL5=TRUE, OptOL5=TRUE                        {WHEN 1088}
 DO	L5.s=Arriving, L5.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L5"
WHEN L5.s=Free, initialised=2, OptOL5=TRUE                                      {WHEN 1089}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L5"
	L5.s=WaitClear
WHEN L4.s=Arriving, initialised=4 OR L4.s=Arriving, mxttL4>tt[L4.t]             {WHEN 1090}
 DO	L4.s=Stopping, L4.wt=99999+
WHEN L4.s=Arriving, tt[L4.t]=Local, RandL4<40000                                {WHEN 1091}
 OR  L4.s=Arriving, tt[L4.t]=Passenger, RandL4<18000
 OR  L4.s=Arriving, tt[L4.t]=Express, RandL4<4000
 DO	L4.s=Stopping, L4.wt=99999+
WHEN L4.s=Booked, OptL4=TRUE                                                    {WHEN 1092}
 DO	L4.s=Arriving, L4.wt=$SESSION, L4.wt=10+, RandL4=$RANDOM
	$Color Track(12,20,1)=colt[L4.t]
WHEN L4.s=Arriving, L4.t=*npN2L4.t, OptL4=FALSE, OptOL4=TRUE DO L4.s=Departing  {WHEN 1093}
	$Color Block(12,20,1)=colt0, $Color Track(5,20,1)=colt[L4.t]
WHEN L4.s=Arriving, *lpTO3.s=Departing, OptL4=FALSE, CurL4=TRUE, OptOL4=FALSE   {WHEN 1094}
 DO	L4.s=Occupied
	$Color Block(12,20,1)=colt[L4.t]
WHEN L4.s>=Moving, OptOL4=TRUE, L4.t<>*npN2L4.t                                 {WHEN 1095}
 DO	L4.s=Stopping, L4.wt=99999+, spt[L4.t]=Braking
WHEN L4.s>=StopClear, L4.s<=Stopping, OptOL4=TRUE                               {WHEN 1096}
 DO	spt[L4.t]=Braking, L4.wt=$SESSION, L4.wt=10+, wait 0.3, L4.p=0
WHEN L4.s=Booked, initialised=2, CurL4=TRUE, OptOL4=TRUE                        {WHEN 1097}
 DO	L4.s=Arriving, L4.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L4"
WHEN L4.s=Free, initialised=2, OptOL4=TRUE                                      {WHEN 1098}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L4"
	L4.s=WaitClear
WHEN L3.s=Arriving, initialised=4 OR L3.s=Arriving, mxttL3>tt[L3.t]             {WHEN 1099}
 DO	L3.s=Stopping, L3.wt=99999+
WHEN L3.s=Arriving, tt[L3.t]=Local, RandL3<40000                                {WHEN 1100}
 OR  L3.s=Arriving, tt[L3.t]=Passenger, RandL3<18000
 OR  L3.s=Arriving, tt[L3.t]=Express, RandL3<4000
 DO	L3.s=Stopping, L3.wt=99999+
WHEN L3.s=Booked, OptL3=TRUE                                                    {WHEN 1101}
 DO	L3.s=Arriving, L3.wt=$SESSION, L3.wt=10+, RandL3=$RANDOM
	$Color Track(12,19,1)=colt[L3.t]
WHEN L3.s=Arriving, L3.t=*npN2L3.t, OptL3=FALSE, OptOL3=TRUE DO L3.s=Departing  {WHEN 1102}
	$Color Block(12,19,1)=colt0, $Color Track(6,19,1)=colt[L3.t]
WHEN L3.s=Arriving, *rpTO3.s=Departing, OptL3=FALSE, CurL3=TRUE, OptOL3=FALSE   {WHEN 1103}
 DO	L3.s=Occupied
	$Color Block(12,19,1)=colt[L3.t]
WHEN L3.s>=Moving, OptOL3=TRUE, L3.t<>*npN2L3.t                                 {WHEN 1104}
 DO	L3.s=Stopping, L3.wt=99999+, spt[L3.t]=Braking
WHEN L3.s>=StopClear, L3.s<=Stopping, OptOL3=TRUE                               {WHEN 1105}
 DO	spt[L3.t]=Braking, L3.wt=$SESSION, L3.wt=10+, wait 0.3, L3.p=0
WHEN L3.s=Booked, initialised=2, CurL3=TRUE, OptOL3=TRUE                        {WHEN 1106}
 DO	L3.s=Arriving, L3.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L3"
WHEN L3.s=Free, initialised=2, OptOL3=TRUE                                      {WHEN 1107}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L3"
	L3.s=WaitClear
WHEN L2.s=Arriving, initialised=4 DO L2.s=Stopping, L2.wt=99999+                {WHEN 1108}
WHEN L2.s=Booked, D2.s=Fwd, OptL2=TRUE OR L2.s=Booked, D2.s=Rev, OptOL2=TRUE    {WHEN 1109}
 DO	L2.s=Arriving, L2.wt=$SESSION, L2.wt=10+
	$Color Track(3,19,1)=colt[L2.t]
WHEN L2.s=Arriving, L2.t=*npN2L2.t, D2.s=Fwd, OptL2=FALSE, OptOL2=TRUE          {WHEN 1110}
 OR  L2.s=Arriving, L2.t=*npN2L2.t, D2.s=Rev, OptOL2=FALSE, OptL2=TRUE
 DO	L2.s=Departing
	$Color Block(3,19,1)=colt0, $Color Track(2,16,1)=colt[L2.t]
WHEN L2.s=Arriving, *pspN2_L2.s=Departing, OptL2=FALSE, CurL2=TRUE, OptOL2=FALSE
 DO	L2.s=Occupied                                                           {WHEN 1111}
	$Color Block(3,19,1)=colt[L2.t]
WHEN L2.s>=Moving, D2.s=Fwd, OptOL2=TRUE, L2.t<>*npN2L2.t                       {WHEN 1112}
 OR  L2.s>=Moving, D2.s=Rev, OptL2=TRUE, L2.t<>*npN2L2.t
 DO	L2.s=Stopping, L2.wt=99999+, spt[L2.t]=Braking
WHEN L2.s>=Moving, D2.s=Fwd, OptOL2=TRUE, L2.t<>*npN2L2.t                       {WHEN 1113}
 OR  L2.s>=Moving, D2.s=Rev, OptL2=TRUE, L2.t<>*npN2L2.t
 DO	spt[L2.t]=Braking, L2.wt=$SESSION, L2.wt=10+, wait 0.3, L2.p=0
WHEN L2.s=Booked, initialised=2, CurL2=TRUE, D2.s=Fwd, OptOL2=TRUE              {WHEN 1114}
 OR  L2.s=Booked, initialised=2, CurL2=TRUE, D2.s=Rev, OptL2=TRUE
 DO	L2.s=Arriving, L2.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L2"
WHEN L2.s=Free, initialised=2, OptOL2=TRUE                                      {WHEN 1115}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L2"
	L2.s=WaitClear
WHEN L17.s=Arriving, initialised=4 DO L17.s=Stopping, L17.wt=99999+             {WHEN 1116}
WHEN L17.s=Booked, OptL17=TRUE DO L17.s=Arriving, L17.wt=$SESSION, L17.wt=10+   {WHEN 1117}
	$Color Track(7,12,1)=colt[L17.t]
WHEN L17.s=Arriving, L17.t=*lpTI2.t, OptL17=FALSE, OptOL17=TRUE                 {WHEN 1118}
 DO	L17.s=Departing
	$Color Block(7,12,1)=colt0, $Color Track(11,12,1)=colt[L17.t]
WHEN L17.s=Arriving, *pspN2_L17.s=Departing, OptL17=FALSE, CurL17=TRUE, OptOL17=FALSE
 DO	L17.s=Occupied                                                          {WHEN 1119}
	$Color Block(7,12,1)=colt[L17.t]
WHEN L17.s=Occupied, OptL17=FALSE, OptOL17=FALSE, CurL17=TRUE, lent[L17.t]>59   {WHEN 1120}
 DO	lent[L17.t]=59
WHEN L17.s>=Moving, OptOL17=TRUE, L17.t<>*lpTI2.t                               {WHEN 1121}
 DO	L17.s=Stopping, L17.wt=99999+, spt[L17.t]=Braking
WHEN L17.s>=StopClear, L17.s<=Stopping, OptOL17=TRUE                            {WHEN 1122}
 DO	spt[L17.t]=Braking, L17.wt=$SESSION, L17.wt=10+, wait 0.3, L17.p=0
WHEN L17.s=Booked, initialised=2, CurL17=TRUE, OptOL17=TRUE                     {WHEN 1123}
 DO	L17.s=Arriving, L17.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L17"
WHEN L17.s=Free, initialised=2, OptOL17=TRUE                                    {WHEN 1124}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L17"
	L17.s=WaitClear
WHEN L18.s=Arriving, initialised=4 DO L18.s=Stopping, L18.wt=99999+             {WHEN 1125}
WHEN L18.s=Booked, OptL18=TRUE DO L18.s=Arriving, L18.wt=$SESSION, L18.wt=10+   {WHEN 1126}
	$Color Track(14,10,1)=colt[L18.t]
WHEN L18.s=Arriving, L18.t=L19.t, OptL18=FALSE, OptOL18=TRUE DO L18.s=Departing {WHEN 1127}
	$Color Block(14,10,1)=colt0, $Color Track(14,8,1)=colt[L18.t]
WHEN L18.s=Arriving, *rpTO5.s=Departing, OptL18=FALSE, CurL18=TRUE, OptOL18=FALSE
 DO	L18.s=Occupied                                                          {WHEN 1128}
	$Color Block(14,10,1)=colt[L18.t]
WHEN L18.s>=Moving, OptOL18=TRUE, L18.t<>L19.t                                  {WHEN 1129}
 DO	L18.s=Stopping, L18.wt=99999+, spt[L18.t]=Braking
WHEN L18.s>=StopClear, L18.s<=Stopping, OptOL18=TRUE                            {WHEN 1130}
 DO	spt[L18.t]=Braking, L18.wt=$SESSION, L18.wt=10+, wait 0.3, L18.p=0
WHEN L18.s=Booked, initialised=2, CurL18=TRUE, OptOL18=TRUE                     {WHEN 1131}
 DO	L18.s=Arriving, L18.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L18"
WHEN L18.s=Free, initialised=2, OptOL18=TRUE                                    {WHEN 1132}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L18"
	L18.s=WaitClear
WHEN L19.s=Arriving, initialised=4 DO L19.s=Stopping, L19.wt=99999+             {WHEN 1133}
WHEN L19.s=Booked, OptL19=TRUE DO L19.s=Arriving, L19.wt=$SESSION, L19.wt=10+   {WHEN 1134}
	$Color Track(14,7,1)=colt[L19.t]
WHEN L19.s=Arriving, L19.t=*npN1L19.t, OptL19=FALSE, OptOL19=TRUE               {WHEN 1135}
 DO	L19.s=Departing
	$Color Block(14,7,1)=colt0, $Color Track(13,4,1)=colt[L19.t]
WHEN L19.s=Arriving, L18.s=Departing, OptL19=FALSE, CurL19=TRUE, OptOL19=FALSE  {WHEN 1136}
 DO	L19.s=Occupied
	$Color Block(14,7,1)=colt[L19.t]
WHEN L19.s>=Moving, OptOL19=TRUE, L19.t<>*npN1L19.t                             {WHEN 1137}
 DO	L19.s=Stopping, L19.wt=99999+, spt[L19.t]=Braking
WHEN L19.s>=StopClear, L19.s<=Stopping, OptOL19=TRUE                            {WHEN 1138}
 DO	spt[L19.t]=Braking, L19.wt=$SESSION, L19.wt=10+, wait 0.3, L19.p=0
WHEN L19.s=Booked, initialised=2, CurL19=TRUE, OptOL19=TRUE                     {WHEN 1139}
 DO	L19.s=Arriving, L19.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L19"
WHEN L19.s=Free, initialised=2, OptOL19=TRUE                                    {WHEN 1140}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L19"
	L19.s=WaitClear
WHEN L20.s=Arriving, initialised=4 DO L20.s=Stopping, L20.wt=99999+             {WHEN 1141}
WHEN L20.s=Arriving, tt[L20.t]=Local, RandL20<40000                             {WHEN 1142}
 OR  L20.s=Arriving, tt[L20.t]=Passenger, RandL20<18000
 OR  L20.s=Arriving, tt[L20.t]=Express, RandL20<4000
 DO	L20.s=Stopping, L20.wt=99999+
WHEN L20.s=Booked, OptL20=TRUE                                                  {WHEN 1143}
 DO	L20.s=Arriving, L20.wt=$SESSION, L20.wt=10+, RandL20=$RANDOM
	$Color Track(13,10,1)=colt[L20.t]
WHEN L20.s=Arriving, L20.t=L21.t, OptL20=FALSE, OptOL20=TRUE DO L20.s=Departing {WHEN 1144}
	$Color Block(13,10,1)=colt0, $Color Track(13,9,1)=colt[L20.t]
WHEN L20.s=Arriving, *lpTO5.s=Departing, OptL20=FALSE, CurL20=TRUE, OptOL20=FALSE
 DO	L20.s=Occupied                                                          {WHEN 1145}
	$Color Block(13,10,1)=colt[L20.t]
WHEN L20.s>=Moving, OptOL20=TRUE, L20.t<>L21.t                                  {WHEN 1146}
 DO	L20.s=Stopping, L20.wt=99999+, spt[L20.t]=Braking
WHEN L20.s>=StopClear, L20.s<=Stopping, OptOL20=TRUE                            {WHEN 1147}
 DO	spt[L20.t]=Braking, L20.wt=$SESSION, L20.wt=10+, wait 0.3, L20.p=0
WHEN L20.s=Booked, initialised=2, CurL20=TRUE, OptOL20=TRUE                     {WHEN 1148}
 DO	L20.s=Arriving, L20.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L20"
WHEN L20.s=Free, initialised=2, OptOL20=TRUE                                    {WHEN 1149}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L20"
	L20.s=WaitClear
WHEN L21.s=Arriving, initialised=4 DO L21.s=Stopping, L21.wt=99999+             {WHEN 1150}
WHEN L21.s=Booked, OptL21=TRUE DO L21.s=Arriving, L21.wt=$SESSION, L21.wt=10+   {WHEN 1151}
	$Color Track(13,7,1)=colt[L21.t]
WHEN L21.s=Arriving, L21.t=*npN1L21.t, OptL21=FALSE, OptOL21=TRUE               {WHEN 1152}
 DO	L21.s=Departing
	$Color Block(13,7,1)=colt0, $Color Track(13,5,1)=colt[L21.t]
WHEN L21.s=Arriving, L20.s=Departing, OptL21=FALSE, CurL21=TRUE, OptOL21=FALSE  {WHEN 1153}
 DO	L21.s=Occupied
	$Color Block(13,7,1)=colt[L21.t]
WHEN L21.s>=Moving, OptOL21=TRUE, L21.t<>*npN1L21.t                             {WHEN 1154}
 DO	L21.s=Stopping, L21.wt=99999+, spt[L21.t]=Braking
WHEN L21.s>=StopClear, L21.s<=Stopping, OptOL21=TRUE                            {WHEN 1155}
 DO	spt[L21.t]=Braking, L21.wt=$SESSION, L21.wt=10+, wait 0.3, L21.p=0
WHEN L21.s=Booked, initialised=2, CurL21=TRUE, OptOL21=TRUE                     {WHEN 1156}
 DO	L21.s=Arriving, L21.wt=$SESSION, $Draw Message(1,3,3)="Entry optical sensor missed on section L21"
WHEN L21.s=Free, initialised=2, OptOL21=TRUE                                    {WHEN 1157}
 DO	$Draw Message(1,3,3)="Exit sensor triggered when free on section L21"
	L21.s=WaitClear

{ Turnouts: Choose a direction if none allocated }
{ WHEN Free & prev=(Arriving|occ) & TTurn=Undef &rand>=RightChance & left=free }
{  DO     TTurn = Left }
{ WHEN Free & prev=(Arriving|occ) & TTurn=Undef & rand<RightChance & right=free }
{  DO     TTurn = Right }

{ Action chosen direction, go occupied & free as needed }

{ WHEN Free & prev = (Arriving|occupied) & TTurn = left }
{  DO     nextp = &left, leftp = &prev, TurnRequest=Left, Booked }
{ WHEN Free & prev = (Arriving|occupied) & TTurn = right }
{  DO     nextp = &right, rightp = &prev TurnRequest=Right, Booked }
{ WHEN Booked for left, left pointer changes DO update pointers }
{ WHEN Booked for right, right pointer changes DO update pointers }
{ WHEN Booked & prev stopped/free DO Stopped }
{ WHEN Booked & *nextp Moving DO Arriving, clear pointers }
{ WHEN Arriving & next=Occ|Dep DO Stopped }
{ WHEN Stopped & either l or r free DO Free }
{ WHEN Free & both l & r not free DO Stopped }

WHEN TO3.s=Free, L5.s>Booked, TO3.TReq=Undef, Rand>=32768, L4.s=Free            {WHEN 1158}
 OR  TO3.s=Free, L5.s>Booked, TO3.TReq=Undef, L3.s<>Free
 DO	TO3.TReq=ChosenLeft, Rand=$RANDOM
WHEN TO3.s=Free, L5.s>Booked, TO3.TReq=Undef, Rand<32768, L3.s=Free             {WHEN 1159}
 OR  TO3.s=Free, L5.s>Booked, TO3.TReq=Undef, L4.s<>Free
 DO	TO3.TReq=ChosenRight, Rand=$RANDOM
WHEN TO3.s=Free, L5.s>Booked, TO3.TReq=ChosenLeft                               {WHEN 1160}
 DO	TO3.s=Booked, TO3.Treq=Left, $Switch(13,19, 1)=1
	lpTO3=&L5, npTO3=&L4,
WHEN TO3.s=Free, L5.s>Booked, TO3.TReq=ChosenRight                              {WHEN 1161}
 DO	TO3.s=Booked, TO3.Treq=Right, $Switch(13,19, 1)=0
	rpTO3=&L5, npTO3=&L3,
WHEN TO3.s=Booked, TO3.TReq>1, L5.s<=Stopping                                   {WHEN 1162}
 OR  TO3.s=Arriving, TO3.TReq>1, L5.s<=Stopping
 DO	TO3.s=Stopped, npTO3=&FreeSect, TO3.TReq=Undef
	lpTO3=&FreeSect, rpTO3=&FreeSect, $Switch(13,19, 1)=2
WHEN TO3.s=Booked, *npTO3.s>=Moving DO TO3.s=Arriving                           {WHEN 1163}
WHEN TO3.s=Arriving, *npTO3.s>=Departing, *npTO3.s<=Occupied                    {WHEN 1164}
 OR  TO3.s=Arriving, *npTO3.s=StopClear
 DO	TO3.s=Stopped, npTO3=&FreeSect, TO3.TReq=Undef, lpTO3=&FreeSect, rpTO3=&FreeSect, $Switch(13,19, 1)=2
WHEN TO3.s=Stopped, L4.s=Free OR TO3.s=Stopped, L3.s=Free                       {WHEN 1165}
 DO	TO3.s=Free, TO3.TReq=Undef, lpTO3=&FreeSect, rpTO3=&FreeSect
WHEN TO3.s=Free, L4.s<>Free, L3.s<>Free DO TO3.s=Stopped, npTO3=&FreeSect       {WHEN 1166}
WHEN TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=Undef, Rand>=32768, *npTO5.s=Free   {WHEN 1167}
 OR  TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=Undef, X2.s<>Free
 DO	TO4.TReq=ChosenLeft, Rand=$RANDOM
WHEN TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=Undef, Rand<32768, X2.s=Free        {WHEN 1168}
 OR  TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=Undef, *npTO5.s<>Free
 DO	TO4.TReq=ChosenRight, Rand=$RANDOM
WHEN TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=ChosenLeft                          {WHEN 1169}
 DO	TO4.s=Booked, TO4.Treq=Left, $Switch(12,12, 1)=1
	lpTO4=pspTI2, npTO4=npTO5, ncnTO4=4,
WHEN TO4.s=Free, *pspTI2.s>Booked, TO4.TReq=ChosenRight                         {WHEN 1170}
 DO	TO4.s=Booked, TO4.Treq=Right, $Switch(12,12, 1)=0
	rpTO4=pspTI2, npTO4=&X2, ncnTO4=5,
WHEN TO4.s=Booked, TO4.TReq>1, *pspTI2.s<=Stopping                              {WHEN 1171}
 OR  TO4.s=Arriving, TO4.TReq>1, *pspTI2.s<=Stopping
 DO	TO4.s=Stopped, npTO4=&FreeSect, TO4.TReq=Undef
	lpTO4=&FreeSect, rpTO4=&FreeSect, $Switch(12,12, 1)=2
WHEN TO4.s=Booked, *npTO4.s>=Moving DO TO4.s=Arriving                           {WHEN 1172}
WHEN TO4.s=Arriving, *npTO4.s>=Departing, *npTO4.s<=Occupied                    {WHEN 1173}
 OR  TO4.s=Arriving, *npTO4.s=StopClear
 DO	TO4.s=Stopped, npTO4=&FreeSect, TO4.TReq=Undef, lpTO4=&FreeSect, rpTO4=&FreeSect, $Switch(12,12, 1)=2
WHEN TO4.s=Stopped, *npTO5.s=Free OR TO4.s=Stopped, X2.s=Free                   {WHEN 1174}
 DO	TO4.s=Free, TO4.TReq=Undef, lpTO4=&FreeSect, rpTO4=&FreeSect, ncnTO4=0
WHEN TO4.s=Free, *npTO5.s<>Free, X2.s<>Free DO TO4.s=Stopped, npTO4=&FreeSect   {WHEN 1175}
WHEN TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=Undef, Rand>=32768, L20.s=Free       {WHEN 1176}
 OR  TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=Undef, L18.s<>Free
 DO	TO5.TReq=ChosenLeft, Rand=$RANDOM
WHEN TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=Undef, Rand<32768, L18.s=Free        {WHEN 1177}
 OR  TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=Undef, L20.s<>Free
 DO	TO5.TReq=ChosenRight, Rand=$RANDOM
WHEN TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=ChosenLeft                           {WHEN 1178}
 DO	TO5.s=Booked, TO5.Treq=Left, $Switch(13,11, 1)=1
	lpTO5=lpTO4, npTO4=&L20, npTO5=&L20, ncnTO5=4,
WHEN TO5.s=Free, *lpTO4.s>Booked, TO5.TReq=ChosenRight                          {WHEN 1179}
 DO	TO5.s=Booked, TO5.Treq=Right, $Switch(13,11, 1)=0
	rpTO5=lpTO4, npTO4=&L18, npTO5=&L18, ncnTO5=4,
WHEN TO5.s=Booked, TO5.TReq>1, *lpTO4.s<=Stopping                               {WHEN 1180}
 OR  TO5.s=Arriving, TO5.TReq>1, *lpTO4.s<=Stopping
 DO	TO5.s=Stopped, npTO5=&FreeSect, TO5.TReq=Undef
	lpTO5=&FreeSect, rpTO5=&FreeSect, $Switch(13,11, 1)=2
WHEN TO5.s=Booked, *npTO5.s>=Moving DO TO5.s=Arriving                           {WHEN 1181}
WHEN TO5.s=Arriving, *npTO5.s>=Departing, *npTO5.s<=Occupied                    {WHEN 1182}
 OR  TO5.s=Arriving, *npTO5.s=StopClear
 DO	TO5.s=Stopped, npTO5=&FreeSect, TO5.TReq=Undef, lpTO5=&FreeSect, rpTO5=&FreeSect, $Switch(13,11, 1)=2
WHEN TO5.s=Stopped, L20.s=Free OR TO5.s=Stopped, L18.s=Free                     {WHEN 1183}
 DO	TO5.s=Free, TO5.TReq=Undef, lpTO5=&FreeSect, rpTO5=&FreeSect, ncnTO5=0
WHEN TO5.s=Free, L20.s<>Free, L18.s<>Free DO TO5.s=Stopped, npTO5=&FreeSect     {WHEN 1184}

{ TurnIns, TurnOuts: Handle actual switching }

{ WHEN TurnRequest = TurnSet DO TurnRequest = 2+ }
{ WHEN TurnRequest <> TurnSet DO TurnBook = BookNo, BookNo=+ }
{ WHEN TurnBook = Avail DO DirRelay=TurnRequest, wait 0.3, Pulse TurnRelay, }
{ 	    Avail=+, TurnSet=TurnRequest, TurnRequest=2+ }
{ WHEN Need turn left DO Pulse left }
{ WHEN Need turn right DO Pulse right }

WHEN initialised>=2, TO1.TReq=TO1.Tset, TO1.TReq<2 DO TO1.TReq=2+               {WHEN 1185}
WHEN TO1.Treq=Left, TO1.Tset<>Left, TBookTO1=0                                  {WHEN 1186}
 OR  TO1.Treq=Right, TO1.Tset<>Right, TBookTO1=0
 DO	TBookTO1=BookNo, BookNo=+
WHEN initialised>=2, TBookTO1=Avail                                             {WHEN 1187}
 DO	DirRelay=TO1.Treq, TO1.Tset=TO1.Treq, TO1.Treq=2+, TBookTO1=0
	wait 0.5, TurnTO1=Pulse 0.2, Avail=+
WHEN initialised>=2, CO1.TReq=CO1.Tset, CO1.TReq<2 DO CO1.TReq=2+               {WHEN 1188}
WHEN CO1.Treq=Left, CO1.Tset<>Left, TBookCO1=0                                  {WHEN 1189}
 OR  CO1.Treq=Right, CO1.Tset<>Right, TBookCO1=0
 DO	TBookCO1=BookNo, BookNo=+
WHEN initialised>=2, TBookCO1=Avail                                             {WHEN 1190}
 DO	DirRelay=CO1.Treq, CO1.Tset=CO1.Treq, CO1.Treq=2+, TBookCO1=0
	wait 0.6, TurnCO1=Pulse 0.2, Avail=+
WHEN initialised>=2, CO2.TReq=CO2.Tset, CO2.TReq<2 DO CO2.TReq=2+               {WHEN 1191}
WHEN CO2.Treq=Left, CO2.Tset<>Left, TBookCO2=0                                  {WHEN 1192}
 OR  CO2.Treq=Right, CO2.Tset<>Right, TBookCO2=0
 DO	TBookCO2=BookNo, BookNo=+
WHEN initialised>=2, TBookCO2=Avail                                             {WHEN 1193}
 DO	DirRelay=CO2.Treq, CO2.Tset=CO2.Treq, CO2.Treq=2+, TBookCO2=0
	wait 0.6, TurnCO2=Pulse 0.2, Avail=+
WHEN initialised>=2, TI4.TReq=TI4.Tset, TI4.TReq<2 DO TI4.TReq=2+               {WHEN 1194}
WHEN TI4.Treq=Left, TI4.Tset<>Left                                              {WHEN 1195}
 DO	TurnBTI4=pulse 4, TI4.Tset=TI4.Treq, TI4.Treq=2+
WHEN TI4.Treq=Right, TI4.Tset<>Right                                            {WHEN 1196}
 DO	TurnATI4=pulse 4, TI4.Tset=TI4.Treq, TI4.Treq=2+
WHEN initialised>=2, TO3.TReq=TO3.Tset, TO3.TReq<2 DO TO3.TReq=2+               {WHEN 1197}
WHEN TO3.Treq=Left, TO3.Tset<>Left, TBookTO3=0                                  {WHEN 1198}
 OR  TO3.Treq=Right, TO3.Tset<>Right, TBookTO3=0
 DO	TBookTO3=BookNo, BookNo=+
WHEN initialised>=2, TBookTO3=Avail                                             {WHEN 1199}
 DO	DirRelay=TO3.Treq, TO3.Tset=TO3.Treq, TO3.Treq=2+, TBookTO3=0
	wait 0.5, TurnTO3=Pulse 0.2, Avail=+
WHEN initialised>=2, TI3.TReq=TI3.Tset, TI3.TReq<2 DO TI3.TReq=2+               {WHEN 1200}
WHEN TI3.Treq=Left, TI3.Tset<>Left, TBookTI3=0                                  {WHEN 1201}
 OR  TI3.Treq=Right, TI3.Tset<>Right, TBookTI3=0
 DO	TBookTI3=BookNo, BookNo=+
WHEN initialised>=2, TBookTI3=Avail                                             {WHEN 1202}
 DO	DirRelay=TI3.Treq, TI3.Tset=TI3.Treq, TI3.Treq=2+, TBookTI3=0
	wait 0.5, TurnTI3=Pulse 0.2, Avail=+
WHEN initialised>=2, TO2.TReq=TO2.Tset, TO2.TReq<2 DO TO2.TReq=2+               {WHEN 1203}
WHEN TO2.Treq=Left, TO2.Tset<>Left, TBookTO2=0                                  {WHEN 1204}
 OR  TO2.Treq=Right, TO2.Tset<>Right, TBookTO2=0
 DO	TBookTO2=BookNo, BookNo=+
WHEN initialised>=2, TBookTO2=Avail                                             {WHEN 1205}
 DO	DirRelay=TO2.Treq, TO2.Tset=TO2.Treq, TO2.Treq=2+, TBookTO2=0
	wait 0.5, TurnTO2=Pulse 0.2, Avail=+
WHEN initialised>=2, TI1.TReq=TI1.Tset, TI1.TReq<2 DO TI1.TReq=2+               {WHEN 1206}
WHEN TI1.Treq=Left, TI1.Tset<>Left, TBookTI1=0                                  {WHEN 1207}
 OR  TI1.Treq=Right, TI1.Tset<>Right, TBookTI1=0
 DO	TBookTI1=BookNo, BookNo=+
WHEN initialised>=2, TBookTI1=Avail                                             {WHEN 1208}
 DO	DirRelay=TI1.Treq, TI1.Tset=TI1.Treq, TI1.Treq=2+, TBookTI1=0
	wait 0.5, TurnTI1=Pulse 0.2, Avail=+
WHEN initialised>=2, TI2.TReq=TI2.Tset, TI2.TReq<2 DO TI2.TReq=2+               {WHEN 1209}
WHEN TI2.Treq=Left, TI2.Tset<>Left                                              {WHEN 1210}
 DO	TurnBTI2=pulse 0.2, TI2.Tset=TI2.Treq, TI2.Treq=2+, PwrTI2=TI2.Tset
WHEN TI2.Treq=Right, TI2.Tset<>Right                                            {WHEN 1211}
 DO	TurnATI2=pulse 0.2, TI2.Tset=TI2.Treq, TI2.Treq=2+, PwrTI2=TI2.Tset
WHEN initialised>=2, TO4.TReq=TO4.Tset, TO4.TReq<2 DO TO4.TReq=2+               {WHEN 1212}
WHEN TO4.Treq=Left, TO4.Tset<>Left                                              {WHEN 1213}
 DO	TurnBTO4=pulse 0.2, TO4.Tset=TO4.Treq, TO4.Treq=2+
WHEN TO4.Treq=Right, TO4.Tset<>Right                                            {WHEN 1214}
 DO	TurnATO4=pulse 0.2, TO4.Tset=TO4.Treq, TO4.Treq=2+
WHEN initialised>=2, TO5.TReq=TO5.Tset, TO5.TReq<2 DO TO5.TReq=2+               {WHEN 1215}
WHEN TO5.Treq=Left, TO5.Tset<>Left                                              {WHEN 1216}
 DO	TurnBTO5=pulse 0.2, TO5.Tset=TO5.Treq, TO5.Treq=2+
WHEN TO5.Treq=Right, TO5.Tset<>Right                                            {WHEN 1217}
 DO	TurnATO5=pulse 0.2, TO5.Tset=TO5.Treq, TO5.Treq=2+
WHEN initialised>=2, TI6.TReq=TI6.Tset, TI6.TReq<2 DO TI6.TReq=2+               {WHEN 1218}
WHEN TI6.Treq=Left, TI6.Tset<>Left                                              {WHEN 1219}
 DO	TurnBTI6=pulse 4, TI6.Tset=TI6.Treq, TI6.Treq=2+
WHEN TI6.Treq=Right, TI6.Tset<>Right                                            {WHEN 1220}
 DO	TurnATI6=pulse 4, TI6.Tset=TI6.Treq, TI6.Treq=2+
WHEN initialised>=2, TI7.TReq=TI7.Tset, TI7.TReq<2 DO TI7.TReq=2+               {WHEN 1221}
WHEN TI7.Treq=Left, TI7.Tset<>Left                                              {WHEN 1222}
 DO	TurnBTI7=pulse 4, TI7.Tset=TI7.Treq, TI7.Treq=2+
WHEN TI7.Treq=Right, TI7.Tset<>Right                                            {WHEN 1223}
 DO	TurnATI7=pulse 4, TI7.Tset=TI7.Treq, TI7.Treq=2+
WHEN initialised>=2, TI8.TReq=TI8.Tset, TI8.TReq<2 DO TI8.TReq=2+               {WHEN 1224}
WHEN TI8.Treq=Left, TI8.Tset<>Left                                              {WHEN 1225}
 DO	TurnBTI8=pulse 0.2, TI8.Tset=TI8.Treq, TI8.Treq=2+, PwrTI8=TI8.Tset
WHEN TI8.Treq=Right, TI8.Tset<>Right                                            {WHEN 1226}
 DO	TurnATI8=pulse 0.2, TI8.Tset=TI8.Treq, TI8.Treq=2+, PwrTI8=TI8.Tset
WHEN initialised>=2, TI11.TReq=TI11.Tset, TI11.TReq<2 DO TI11.TReq=2+           {WHEN 1227}
WHEN TI11.Treq=Left, TI11.Tset<>Left                                            {WHEN 1228}
 DO	TurnBTI11=pulse 4, TI11.Tset=TI11.Treq, TI11.Treq=2+
WHEN TI11.Treq=Right, TI11.Tset<>Right                                          {WHEN 1229}
 DO	TurnATI11=pulse 4, TI11.Tset=TI11.Treq, TI11.Treq=2+
WHEN initialised>=2, TI12.TReq=TI12.Tset, TI12.TReq<2 DO TI12.TReq=2+           {WHEN 1230}
WHEN TI12.Treq=Left, TI12.Tset<>Left                                            {WHEN 1231}
 DO	TurnBTI12=pulse 4, TI12.Tset=TI12.Treq, TI12.Treq=2+
WHEN TI12.Treq=Right, TI12.Tset<>Right                                          {WHEN 1232}
 DO	TurnATI12=pulse 4, TI12.Tset=TI12.Treq, TI12.Treq=2+
WHEN initialised>=2, TI13.TReq=TI13.Tset, TI13.TReq<2 DO TI13.TReq=2+           {WHEN 1233}
WHEN TI13.Treq=Left, TI13.Tset<>Left                                            {WHEN 1234}
 DO	TurnBTI13=pulse 0.2, TI13.Tset=TI13.Treq, TI13.Treq=2+
WHEN TI13.Treq=Right, TI13.Tset<>Right                                          {WHEN 1235}
 DO	TurnATI13=pulse 0.2, TI13.Tset=TI13.Treq, TI13.Treq=2+
WHEN initialised>=2, TI14.TReq=TI14.Tset, TI14.TReq<2 DO TI14.TReq=2+           {WHEN 1236}
WHEN TI14.Treq=Left, TI14.Tset<>Left                                            {WHEN 1237}
 DO	TurnBTI14=pulse 0.2, TI14.Tset=TI14.Treq, TI14.Treq=2+
WHEN TI14.Treq=Right, TI14.Tset<>Right                                          {WHEN 1238}
 DO	TurnATI14=pulse 0.2, TI14.Tset=TI14.Treq, TI14.Treq=2+
WHEN initialised>=2, TI15.TReq=TI15.Tset, TI15.TReq<2 DO TI15.TReq=2+           {WHEN 1239}
WHEN TI15.Treq=Left, TI15.Tset<>Left                                            {WHEN 1240}
 DO	TurnBTI15=pulse 0.2, TI15.Tset=TI15.Treq, TI15.Treq=2+
WHEN TI15.Treq=Right, TI15.Tset<>Right                                          {WHEN 1241}
 DO	TurnATI15=pulse 0.2, TI15.Tset=TI15.Treq, TI15.Treq=2+

{ Turnins: When free tell everybody, Book arrivals }

{ WHEN Free & prev arriving DO collect following train types }
{ WHEN Free & left priority DO Booked for left }
{ WHEN Free & right priority DO Booked for right }
{ WHEN Booked & left pointer changes DO update pointer }
{ WHEN Booked & right pointer changes DO update pointer }
{ WHEN Booked & next<>Free DO Occupied }
{ WHEN Occupied & next=Free OR Booked & prev Stopped DO Free }

WHEN TI2.s=Free, L17.s>Booked OR TI2.s=Free, FreeSect.s>Booked                  {WHEN 1242}
 DO	TI2.Treq=100, TI2.Treq=tt[L17.t]+, TI2.Treq=tt[FreeSect.t]-
WHEN TI2.s=Free, TI2.Treq>100 OR TI2.s=Free, TI2.Treq=100, L17.s>FreeSect.s     {WHEN 1243}
 DO	TI2.s=Booked, TI2.Treq=Left, $Switch(1,1, 1)=0
	pspTI2=&L17, lpTI2=npTO4, rpTI2=&TI2.s
WHEN TI2.s=Free, TI2.Treq>70, TI2.Treq<100                                      {WHEN 1244}
 OR  TI2.s=Free, TI2.Treq=100, L17.s<=FreeSect.s
 DO	TI2.s=Booked, TI2.Treq=Right, $Switch(1,1, 1)=1
	pspTI2=&FreeSect, rpTI2=npTO4, lpTI2=&TI2.s
WHILE TI2.s=Booked, TI2.Treq=Left, lpTI2<>npTO4                                  {WHEN 1245}
 OR  TI2.s=Booked, TI2.Treq=ChosenLeft, lpTI2<>npTO4
 DO	lpTI2=npTO4
WHILE TI2.s=Booked, TI2.Treq=Right, rpTI2<>npTO4                                 {WHEN 1246}
 OR  TI2.s=Booked, TI2.Treq=ChosenRight, rpTI2<>npTO4
 DO	rpTI2=npTO4
WHEN TI2.s=Booked, *npTO4.s<>Free, *pspTI2.t=*npTO4.t DO TI2.s=Occupied         {WHEN 1247}
WHEN TI2.s=Occupied, *npTO4.s<=WaitClear OR TI2.s=Booked, *pspTI2.s<=Stopping   {WHEN 1248}
 DO	TI2.s=Free, pspTI2=&FreeSect, lpTI2=&TI2, rpTI2=&TI2, $Switch(1,1, 1)=2
WHEN TI4.s=Free, L6.s>Booked                                                    {WHEN 1249}
 DO	TI4.s=Booked, TI4.Treq=Left, $Switch(16,15, 1)=0
	pspTI4=&L6, lpTI4=&L5
WHEN TI4.s=Free, *rpTO4.s>Booked                                                {WHEN 1250}
 DO	TI4.s=Booked, TI4.Treq=Right, $Switch(16,15, 1)=1
	pspTI4=rpTO4, rpTI4=&L5, npTO4=&L5
WHEN TI4.s=Booked, L5.s<>Free, *pspTI4.t=L5.t DO TI4.s=Occupied                 {WHEN 1251}
WHEN TI4.s=Occupied, L5.s<=WaitClear OR TI4.s=Booked, *pspTI4.s<=Stopping       {WHEN 1252}
 DO	TI4.s=Free, pspTI4=&FreeSect, lpTI4=&TI4, rpTI4=&TI4, $Switch(16,15, 1)=2

{ sidings: Normal state changes }
{ WHEN Booked & Opt DO Stopping, save speed, speed=Slow }
{ WHEN Stopping & !OptI DO StopClear }
{ WHEN StopClear & OptO DO Brake, release cab, StopClear, Stopped }
{ WHEN Occupied, next Booked, t=next.t DO Departing, Speed=SLOW }
WHEN P2.s=Booked, OptP2=TRUE DO spt[P2.t]=DoMin, P2.s=Stopping                  {WHEN 1253}
	$Color Track(4,7,1)=colt[P2.t]
WHEN P2.s=Stopping, OptP2=FALSE DO P2.s=StopClear                               {WHEN 1254}
WHEN P2.s>=StopClear, P2.s<=Stopping, OptOP2=TRUE                               {WHEN 1255}
 DO	spt[P2.t]=Braking, wait 3, spt[P2.t]=Stopped
	P2.s=Stopped, P2.p=0, P2.wt=$TIME, P2.wt=50+
	$Color Block(4,7,1)=colt[P2.t]
WHEN P2.s=Occupied, P2.t=*npN2P2.t DO P2.s=Departing, spt[P2.t]=DoFull          {WHEN 1256}
	$Color Track(4,7,1)=colt[P2.t]
WHEN P1.s=Booked, OptP2=TRUE DO spt[P1.t]=DoMin, P1.s=Stopping                  {WHEN 1257}
	$Color Track(1,1,1)=colt[P1.t]
WHEN P1.s=Stopping, OptP2=FALSE DO P1.s=StopClear                               {WHEN 1258}
WHEN P1.s>=StopClear, P1.s<=Stopping, OptOP1=TRUE                               {WHEN 1259}
 DO	spt[P1.t]=Braking, wait 3, spt[P1.t]=Stopped
	P1.s=Stopped, P1.p=0, P1.wt=$TIME, P1.wt=50+
	$Color Block(1,1,1)=colt[P1.t]
WHEN P1.s=Occupied, P1.t=*npN2P1.t DO P1.s=Departing, spt[P1.t]=DoFull          {WHEN 1260}
	$Color Track(1,1,1)=colt[P1.t]

{ Crossings: }

{ WHEN Free & Either ArrOcc DO Collect following train types }
{ WHEN Free & left priority DO train=lefttrain, Booked }
{ WHEN Free & right priority DO train=righttrain, Booked }
{ WHEN Booked & dest Arriving DO Arriving }
{ WHEN Arriving & previous Free & dest Occ|Dep DO Free, train=0 }

{ WHEN Booked & prev Stopped DO Free, train=0 }

WHEN sX2=Free, *rpTO4.s>Booked, *rpTO4.t=*rpTI4.t                               {WHEN 1261}
 OR  sX2=Free, L14.s>Booked, L14.t=L13.t
 DO	ttX2=100, ttX2=tt[*rpTO4.t]+, ttX2=tt[L14.t]-
WHEN sX2=Free, ttX2>100, *rpTO4.t=*rpTI4.t                                      {WHEN 1262}
 OR  sX2=Free, ttX2=100, *rpTO4.s>Booked, *rpTO4.t=*rpTI4.t
 DO	X2.t=*rpTO4.t, sX2=Booked, ttX2=0
WHEN sX2=Free, ttX2>70, ttX2<100, L14.t=L13.t                                   {WHEN 1263}
 OR  sX2=Free, ttX2=100, L14.s>Booked, L14.t=L13.t
 DO	X2.t=L14.t, sX2=Booked, ttX2=0
WHEN sX2<>Free, X2.t=*rpTI4.t, X2.s<>*rpTI4.s DO X2.s=*rpTI4.s                  {WHEN 1264}
WHEN sX2<>Free, X2.t=L13.t, X2.s<>L13.s DO X2.s=L13.s                           {WHEN 1265}
WHEN sX2=Booked, X2.t=*rpTI4.t, *rpTI4.s>=ArrOcc                                {WHEN 1266}
 OR  sX2=Booked, X2.t=L13.t, L13.s>=ArrOcc
 DO	sX2=Arriving
WHEN sX2=Arriving, X2.t=*rpTI4.t, *rpTO4.s=Free                                 {WHEN 1267}
 OR  sX2=Arriving, X2.t=L13.t, L14.s=Free
 DO	sX2=Free, X2.s=Free, X2.t=0
WHEN sX2=Booked, X2.t=*rpTO4.t, *rpTO4.s<=Stopping                              {WHEN 1268}
 OR  sX2=Booked, X2.t=L14.t, L14.s<=Stopping
 DO	sX2=Free, X2.t=0

{ Networks: }

{ WHEN Free & All outputs busy DO booked }
{ WHEN Booked & any output free DO Free }

WHEN N1.t=Free, N1_L11.s<>Free DO N1.s=Stopped, N1.t=99                         {WHEN 1269}
WHEN N1.s=Stopped, N1_L11.s=Free                                                {WHEN 1270}
 DO	N1.s=Free, N1.t=0
WHEN N2.t=Free, N2_P2.s<>Free, N2_L2.s<>Free, N2_L9.s<>Free, N2_L14.s<>Free, N2_L15.s<>Free, N2_L16.s<>Free, N2_L17.s<>Free, N2_P1.s<>Free
 DO	N2.s=Stopped, N2.t=99                                                   {WHEN 1271}
WHEN N2.s=Stopped, N2_P2.s=Free                                                 {WHEN 1272}
 OR  N2.s=Stopped, N2_L2.s=Free
 OR  N2.s=Stopped, N2_L9.s=Free
 OR  N2.s=Stopped, N2_L14.s=Free
 OR  N2.s=Stopped, N2_L15.s=Free
 OR  N2.s=Stopped, N2_L16.s=Free
 OR  N2.s=Stopped, N2_L17.s=Free
 OR  N2.s=Stopped, N2_P1.s=Free
 DO	N2.s=Free, N2.t=0

{ NetInputs: }

{ WHEN Free & prev>=Booked DO Get following train type }
{ WHEN prev<Booked DO Clear following train type }
{ WHEN Free & prev>Booked, nettrain=0, Ttype>=all other inputs DO Offer train }
{ WHEN netinput=me, netout=0, timeout DO Withdraw offer }

WHEN RouteN1L12=Free, L12.s>=Booked, L12.p<>0 DO Tt_N1L12=tt[L12.t]             {WHEN 1273}
WHEN L12.s=Free DO Tt_N1L12=0                                                   {WHEN 1274}
WHEN RouteN1L12=Free, L12.s>Booked, L12.p<>0, N1.t=0, Tt_N1L12>=Tt_N1L21, Tt_N1L12>=Tt_N1L19, L12.p<>1
 DO	N1.t=L12.t, In_N1=47, Time_N1=$LOOPS, Time_N1=2+                        {WHEN 1275}
WHEN In_N1=47, Out_N1=0, $LOOPS>=Time_N1                                        {WHEN 1276}
 DO	Tt_N1L12=0, N1.t=0, RouteN1L12=99, wait 5, RouteN1L12=Free
WHEN RouteN2L2=Free, L2.s>=Booked, L2.p<>0 DO Tt_N2L2=tt[L2.t]                  {WHEN 1277}
WHEN L2.s=Free DO Tt_N2L2=0                                                     {WHEN 1278}
WHEN RouteN2L2=Free, L2.s>Booked, L2.p<>0, N2.t=0                               {WHEN 1279}
 DO	N2.t=L2.t, In_N2=55, Time_N2=$LOOPS, Time_N2=2+
WHEN In_N2=55, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1280}
 DO	Tt_N2L2=0, N2.t=0, RouteN2L2=99, wait 5, RouteN2L2=Free
WHEN RouteN2L3=Free, L3.s>=Booked, L3.p<>0 DO Tt_N2L3=tt[L3.t]                  {WHEN 1281}
WHEN L3.s=Free DO Tt_N2L3=0                                                     {WHEN 1282}
WHEN RouteN2L3=Free, L3.s>Booked, L3.p<>0, N2.t=0, Tt_N2L3>=Tt_N2L4, Tt_N2L3>=Tt_N2L15, Tt_N2L3>=Tt_N2L10, L3.p<>7
 DO	N2.t=L3.t, In_N2=56, Time_N2=$LOOPS, Time_N2=2+                         {WHEN 1283}
WHEN In_N2=56, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1284}
 DO	Tt_N2L3=0, N2.t=0, RouteN2L3=99, wait 5, RouteN2L3=Free
WHEN RouteN2L4=Free, L4.s>=Booked, L4.p<>0 DO Tt_N2L4=tt[L4.t]                  {WHEN 1285}
WHEN L4.s=Free DO Tt_N2L4=0                                                     {WHEN 1286}
WHEN RouteN2L4=Free, L4.s>Booked, L4.p<>0, N2.t=0, Tt_N2L4>=Tt_N2L3, Tt_N2L4>=Tt_N2L15, Tt_N2L4>=Tt_N2L10, L4.p<>7
 DO	N2.t=L4.t, In_N2=57, Time_N2=$LOOPS, Time_N2=2+                         {WHEN 1287}
WHEN In_N2=57, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1288}
 DO	Tt_N2L4=0, N2.t=0, RouteN2L4=99, wait 5, RouteN2L4=Free
WHEN RouteN1L19=Free, L19.s>=Booked, L19.p<>0 DO Tt_N1L19=tt[L19.t]             {WHEN 1289}
WHEN L19.s=Free DO Tt_N1L19=0                                                   {WHEN 1290}
WHEN RouteN1L19=Free, L19.s>Booked, L19.p<>0, N1.t=0, Tt_N1L19>=Tt_N1L21, Tt_N1L19>=Tt_N1L12
 DO	N1.t=L19.t, In_N1=48, Time_N1=$LOOPS, Time_N1=2+                        {WHEN 1291}
WHEN In_N1=48, Out_N1=0, $LOOPS>=Time_N1                                        {WHEN 1292}
 DO	Tt_N1L19=0, N1.t=0, RouteN1L19=99, wait 5, RouteN1L19=Free
WHEN RouteN2P1=Free, P1.s>=Booked, P1.p<>0 DO Tt_N2P1=tt[P1.t]                  {WHEN 1293}
WHEN P1.s=Free DO Tt_N2P1=0                                                     {WHEN 1294}
WHEN RouteN2P1=Free, P1.s>Booked, P1.p<>0, N2.t=0, P1.p<>4, P1.p<>5, P1.p<>8    {WHEN 1295}
 DO	N2.t=P1.t, In_N2=61, Time_N2=$LOOPS, Time_N2=2+
WHEN In_N2=61, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1296}
 DO	Tt_N2P1=0, N2.t=0, RouteN2P1=99, wait 5, RouteN2P1=Free
WHEN RouteN2P2=Free, P2.s>=Booked, P2.p<>0 DO Tt_N2P2=tt[P2.t]                  {WHEN 1297}
WHEN P2.s=Free DO Tt_N2P2=0                                                     {WHEN 1298}
WHEN RouteN2P2=Free, P2.s>Booked, P2.p<>0, N2.t=0, Tt_N2P2>=Tt_N2L10, Tt_N2P2>=Tt_N2L2, Tt_N2P2>=Tt_N2L3, Tt_N2P2>=Tt_N2L4, P2.p<>8
 DO	N2.t=P2.t, In_N2=54, Time_N2=$LOOPS, Time_N2=2+                         {WHEN 1299}
WHEN In_N2=54, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1300}
 DO	Tt_N2P2=0, N2.t=0, RouteN2P2=99, wait 5, RouteN2P2=Free
WHEN RouteN1L21=Free, L21.s>=Booked, L21.p<>0 DO Tt_N1L21=tt[L21.t]             {WHEN 1301}
WHEN L21.s=Free DO Tt_N1L21=0                                                   {WHEN 1302}
WHEN RouteN1L21=Free, L21.s>Booked, L21.p<>0, N1.t=0, Tt_N1L21>=Tt_N1L19, Tt_N1L21>=Tt_N1L12
 DO	N1.t=L21.t, In_N1=49, Time_N1=$LOOPS, Time_N1=2+                        {WHEN 1303}
WHEN In_N1=49, Out_N1=0, $LOOPS>=Time_N1                                        {WHEN 1304}
 DO	Tt_N1L21=0, N1.t=0, RouteN1L21=99, wait 5, RouteN1L21=Free
WHEN RouteN2L10=Free, L10.s>=Booked, L10.p<>0 DO Tt_N2L10=tt[L10.t]             {WHEN 1305}
WHEN L10.s=Free DO Tt_N2L10=0                                                   {WHEN 1306}
WHEN RouteN2L10=Free, L10.s>Booked, L10.p<>0, N2.t=0, Tt_N2L10>=Tt_N2L3, Tt_N2L10>=Tt_N2L4, L10.p<>3
 DO	N2.t=L10.t, In_N2=58, Time_N2=$LOOPS, Time_N2=2+                        {WHEN 1307}
WHEN In_N2=58, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1308}
 DO	Tt_N2L10=0, N2.t=0, RouteN2L10=99, wait 5, RouteN2L10=Free
WHEN RouteN2L15=Free, L15.s>=Booked, L15.p<>0 DO Tt_N2L15=tt[L15.t]             {WHEN 1309}
WHEN L15.s=Free DO Tt_N2L15=0                                                   {WHEN 1310}
WHEN RouteN2L15=Free, L15.s>Booked, L15.p<>0, N2.t=0, Tt_N2L15>=Tt_N2L3, Tt_N2L15>=Tt_N2L4
 DO	N2.t=L15.t, In_N2=59, Time_N2=$LOOPS, Time_N2=2+                        {WHEN 1311}
WHEN In_N2=59, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1312}
 DO	Tt_N2L15=0, N2.t=0, RouteN2L15=99, wait 5, RouteN2L15=Free
WHEN RouteN2L16=Free, L16.s>=Booked, L16.p<>0 DO Tt_N2L16=tt[L16.t]             {WHEN 1313}
WHEN L16.s=Free DO Tt_N2L16=0                                                   {WHEN 1314}
WHEN RouteN2L16=Free, L16.s>Booked, L16.p<>0, N2.t=0, L16.p<>4                  {WHEN 1315}
 DO	N2.t=L16.t, In_N2=60, Time_N2=$LOOPS, Time_N2=2+
WHEN In_N2=60, Out_N2=0, $LOOPS>=Time_N2                                        {WHEN 1316}
 DO	Tt_N2L16=0, N2.t=0, RouteN2L16=99, wait 5, RouteN2L16=Free

{ NetOutputs: }

{ WHEN Booked & next Arriving DO Arriving }

WHEN N1_L11.s=Booked, L11.s=Arriving DO N1_L11.s=Arriving                       {WHEN 1317}
WHEN N2_P2.s=Booked, P2.s=Arriving DO N2_P2.s=Arriving                          {WHEN 1318}
WHEN N2_L2.s=Booked, L2.s=Arriving DO N2_L2.s=Arriving                          {WHEN 1319}
WHEN N2_L9.s=Booked, L9.s=Arriving DO N2_L9.s=Arriving                          {WHEN 1320}
WHEN N2_L14.s=Booked, L14.s=Arriving DO N2_L14.s=Arriving                       {WHEN 1321}
WHEN N2_L15.s=Booked, L15.s=Arriving DO N2_L15.s=Arriving                       {WHEN 1322}
WHEN N2_L16.s=Booked, L16.s=Arriving DO N2_L16.s=Arriving                       {WHEN 1323}
WHEN N2_L17.s=Booked, L17.s=Arriving DO N2_L17.s=Arriving                       {WHEN 1324}
WHEN N2_P1.s=Booked, P1.s=Arriving DO N2_P1.s=Arriving                          {WHEN 1325}

{ NetRoutes: }

{ WHEN Free and acceptable train coming DO Bid for it }
{ WHEN Free & Route chosen DO Book route, set switches }
{ WHEN Arriving & next StopClear|OccDep or Booked & prev Stopped DO Free }

WHEN N1_L11.s=Free, L11.s=Free, N1.t<>0, In_N1=49, TI6.s=Free, TI7.s=Free, L21.p<>0
 DO	d=$RANDOM 100, IF d>=Pri_N1 THEN Pri_N1=d, Out_N1=50, ENDIF
WHEN N1_L11.s=Free, Out_N1=50, In_N1=49                                         {WHEN 1327}
 DO	N1_L11.s=Booked, RouteN1_L11=49, RouteN1L21=50, N1.t=0, In_N1=0, Out_N1=0, Pri_N1=0, Tt_N1L21=0
	TI6.s=Booked, TI6.Treq=Left, $Switch(12,4, 1)=0,
	TI7.s=Booked, TI7.Treq=Left, $Switch(11,3, 1)=1,
	pspN1_L11=&L21, N1_L11.t=L21.t, npN1L21=&L11
WHEN N1_L11.s=Arriving, RouteN1_L11=49, L11.s>=Departing, L11.s<=Occupied       {WHEN 1328}
 OR  N1_L11.s=Arriving, RouteN1_L11=49, L11.s=StopClear
 OR  N1_L11.s<>Free, RouteN1_L11=49, L21.s<=Stopping
 DO	N1_L11.s=Free, RouteN1_L11=Free, N1_L11.t=0, RouteN1L21=Free, Rand=$RANDOM,
	TI6.s=Free, $Switch(12,4, 1)=2, TI7.s=Free, $Switch(11,3, 1)=2,
	pspN1_L11=&FreeSect, N1_L11.t=0, npN1L21=&FreeSect
WHEN N1_L11.s=Free, L11.s=Free, N1.t<>0, In_N1=48, TI6.s=Free, TI7.s=Free, L19.p<>0
 DO	d=$RANDOM 100, IF d>=Pri_N1 THEN Pri_N1=d, Out_N1=50, ENDIF
WHEN N1_L11.s=Free, Out_N1=50, In_N1=48                                         {WHEN 1330}
 DO	N1_L11.s=Booked, RouteN1_L11=48, RouteN1L19=50, N1.t=0, In_N1=0, Out_N1=0, Pri_N1=0, Tt_N1L19=0
	TI6.s=Booked, TI6.Treq=Right, $Switch(12,4, 1)=1,
	TI7.s=Booked, TI7.Treq=Left, $Switch(11,3, 1)=1,
	pspN1_L11=&L19, N1_L11.t=L19.t, npN1L19=&L11
WHEN N1_L11.s=Arriving, RouteN1_L11=48, L11.s>=Departing, L11.s<=Occupied       {WHEN 1331}
 OR  N1_L11.s=Arriving, RouteN1_L11=48, L11.s=StopClear
 OR  N1_L11.s<>Free, RouteN1_L11=48, L19.s<=Stopping
 DO	N1_L11.s=Free, RouteN1_L11=Free, N1_L11.t=0, RouteN1L19=Free, Rand=$RANDOM,
	TI6.s=Free, $Switch(12,4, 1)=2, TI7.s=Free, $Switch(11,3, 1)=2,
	pspN1_L11=&FreeSect, N1_L11.t=0, npN1L19=&FreeSect
WHEN N1_L11.s=Free, L11.s=Free, N1.t<>0, In_N1=47, TI7.s=Free, L12.p<>0         {WHEN 1332}
 DO	d=$RANDOM 100, IF d>=Pri_N1 THEN Pri_N1=d, Out_N1=50, ENDIF
WHEN N1_L11.s=Free, Out_N1=50, In_N1=47                                         {WHEN 1333}
 DO	N1_L11.s=Booked, RouteN1_L11=47, RouteN1L12=50, N1.t=0, In_N1=0, Out_N1=0, Pri_N1=0, Tt_N1L12=0
	TI7.s=Booked, TI7.Treq=Right, $Switch(11,3, 1)=0,
	pspN1_L11=&L12, N1_L11.t=L12.t, npN1L12=&L11
WHEN N1_L11.s=Arriving, RouteN1_L11=47, L11.s>=Departing, L11.s<=Occupied       {WHEN 1334}
 OR  N1_L11.s=Arriving, RouteN1_L11=47, L11.s=StopClear
 OR  N1_L11.s<>Free, RouteN1_L11=47, L12.s<=Stopping
 DO	N1_L11.s=Free, RouteN1_L11=Free, N1_L11.t=0, RouteN1L12=Free, Rand=$RANDOM,
	TI7.s=Free, $Switch(11,3, 1)=2,
	pspN1_L11=&FreeSect, N1_L11.t=0, npN1L12=&FreeSect
WHEN N2_L2.s=Free, L2.s=Free, N2.t<>0, In_N2=56, TI3.s=Free, CO2b.s=Free, TO2.s=Free, L3.p<>0
 DO	d=$RANDOM 55, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=63, ENDIF
WHEN N2_L2.s=Free, Out_N2=63, In_N2=56                                          {WHEN 1336}
 DO	N2_L2.s=Booked, RouteN2_L2=56, RouteN2L3=63, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L3=0
	TI3.s=Booked, TI3.Treq=Right, $Switch(4,19, 1)=0,
	CO2b.s=Booked, CO2.Treq=Left, $Switch(6,18, 1)=0, $Switch(5,19, 1)=0,
	TO2.s=Booked, TO2.Treq=Left, $Switch(2,15, 1)=0,
	pspN2_L2=&L3, N2_L2.t=L3.t, npN2L3=&L2
WHEN N2_L2.s=Arriving, RouteN2_L2=56, L2.s>=Departing, L2.s<=Occupied           {WHEN 1337}
 OR  N2_L2.s=Arriving, RouteN2_L2=56, L2.s=StopClear
 OR  N2_L2.s<>Free, RouteN2_L2=56, L3.s<=Stopping
 DO	N2_L2.s=Free, RouteN2_L2=Free, N2_L2.t=0, RouteN2L3=Free, Rand=$RANDOM,
	TI3.s=Free, $Switch(4,19, 1)=2, CO2b.s=Free, $Switch(6,18, 1)=2, $Switch(5,19, 1)=2,
	TO2.s=Free, $Switch(2,15, 1)=2,
	pspN2_L2=&FreeSect, N2_L2.t=0, npN2L3=&FreeSect
WHEN N2_L2.s=Free, L2.s=Free, N2.t<>0, In_N2=57, TI3.s=Free, TO2.s=Free, L4.p<>0
 DO	d=$RANDOM 55, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=63, ENDIF
WHEN N2_L2.s=Free, Out_N2=63, In_N2=57                                          {WHEN 1339}
 DO	N2_L2.s=Booked, RouteN2_L2=57, RouteN2L4=63, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L4=0
	TI3.s=Booked, TI3.Treq=Left, $Switch(4,19, 1)=1,
	TO2.s=Booked, TO2.Treq=Left, $Switch(2,15, 1)=0,
	pspN2_L2=&L4, N2_L2.t=L4.t, npN2L4=&L2
WHEN N2_L2.s=Arriving, RouteN2_L2=57, L2.s>=Departing, L2.s<=Occupied           {WHEN 1340}
 OR  N2_L2.s=Arriving, RouteN2_L2=57, L2.s=StopClear
 OR  N2_L2.s<>Free, RouteN2_L2=57, L4.s<=Stopping
 DO	N2_L2.s=Free, RouteN2_L2=Free, N2_L2.t=0, RouteN2L4=Free, Rand=$RANDOM,
	TI3.s=Free, $Switch(4,19, 1)=2, TO2.s=Free, $Switch(2,15, 1)=2,
	pspN2_L2=&FreeSect, N2_L2.t=0, npN2L4=&FreeSect
WHEN N2_L14.s=Free, L14.s=Free, N2.t<>0, In_N2=59, J14.s=Free                   {WHEN 1341}
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=65, ENDIF
WHEN N2_L14.s=Free, Out_N2=65, In_N2=59                                         {WHEN 1342}
 DO	N2_L14.s=Booked, RouteN2_L14=59, RouteN2L15=65, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L15=0
	J14.s=Booked,
	pspN2_L14=&L15, N2_L14.t=L15.t, npN2L15=&L14, ncnN2L15=1
WHEN N2_L14.s=Arriving, RouteN2_L14=59, L14.s>=Departing, L14.s<=Occupied       {WHEN 1343}
 OR  N2_L14.s=Arriving, RouteN2_L14=59, L14.s=StopClear
 OR  N2_L14.s<>Free, RouteN2_L14=59, L15.s<=Stopping
 DO	N2_L14.s=Free, RouteN2_L14=Free, N2_L14.t=0, RouteN2L15=Free, Rand=$RANDOM, ncnN2L15=0,
	J14.s=Free,
	pspN2_L14=&FreeSect, N2_L14.t=0, npN2L15=&FreeSect
WHEN N2_L2.s=Free, L2.s=Free, N2.t<>0, In_N2=59, CO2a.s=Free, CO2b.s=Free, TI3.s=Free
     TO2.s=Free, tt[N2.t]=3
 DO	d=$RANDOM 90, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=63, ENDIF
WHEN N2_L2.s=Free, Out_N2=63, In_N2=59                                          {WHEN 1345}
 DO	N2_L2.s=Booked, RouteN2_L2=59, RouteN2L15=63, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L15=0
	CO2a.s=Booked, CO2.Treq=Right, $Switch(6,18, 1)=1, $Switch(5,19, 1)=1, CO2b.s=Booked,
	TI3.s=Booked, TI3.Treq=Right, $Switch(4,19, 1)=0,
	TO2.s=Booked, TO2.Treq=Left, $Switch(2,15, 1)=0,
	pspN2_L2=&L15, N2_L2.t=L15.t, npN2L15=&L2, ncnN2L15=6
WHEN N2_L2.s=Arriving, RouteN2_L2=59, L2.s>=Departing, L2.s<=Occupied           {WHEN 1346}
 OR  N2_L2.s=Arriving, RouteN2_L2=59, L2.s=StopClear
 OR  N2_L2.s<>Free, RouteN2_L2=59, L15.s<=Stopping
 DO	N2_L2.s=Free, RouteN2_L2=Free, N2_L2.t=0, RouteN2L15=Free, Rand=$RANDOM, ncnN2L15=0,
	CO2a.s=Free, $Switch(6,18, 1)=2, $Switch(5,19, 1)=2, CO2b.s=Free,
	TI3.s=Free, $Switch(4,19, 1)=2, TO2.s=Free, $Switch(2,15, 1)=2,
	pspN2_L2=&FreeSect, N2_L2.t=0, npN2L15=&FreeSect
WHEN N2_L15.s=Free, L15.s=Free, N2.t<>0, In_N2=60, CO2a.s=Free, L16.p<>0        {WHEN 1347}
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=66, ENDIF
WHEN N2_L15.s=Free, Out_N2=66, In_N2=60                                         {WHEN 1348}
 DO	N2_L15.s=Booked, RouteN2_L15=60, RouteN2L16=66, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L16=0
	CO2a.s=Booked, CO2.Treq=Left, $Switch(6,18, 1)=0, $Switch(5,19, 1)=0,
	pspN2_L15=&L16, N2_L15.t=L16.t, npN2L16=&L15
WHEN N2_L15.s=Arriving, RouteN2_L15=60, L15.s>=Departing, L15.s<=Occupied       {WHEN 1349}
 OR  N2_L15.s=Arriving, RouteN2_L15=60, L15.s=StopClear
 OR  N2_L15.s<>Free, RouteN2_L15=60, L16.s<=Stopping
 DO	N2_L15.s=Free, RouteN2_L15=Free, N2_L15.t=0, RouteN2L16=Free, Rand=$RANDOM,
	CO2a.s=Free, $Switch(6,18, 1)=2, $Switch(5,19, 1)=2,
	pspN2_L15=&FreeSect, N2_L15.t=0, npN2L16=&FreeSect
WHEN N2_L16.s=Free, L16.s=Free, N2.t<>0, In_N2=58, TI8.s=Free, TO1.s=Free, CO1b.s=Free
     X1.s=Free, L10.p<>0
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=67, ENDIF
WHEN N2_L16.s=Free, Out_N2=67, In_N2=58                                         {WHEN 1351}
 DO	N2_L16.s=Booked, RouteN2_L16=58, RouteN2L10=67, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L10=0
	TI8.s=Booked, TI8.Treq=Right, $Switch(3,8, 1)=0,
	TO1.s=Booked, TO1.Treq=Right, $Switch(3,9, 1)=0,
	CO1b.s=Booked, CO1.Treq=Left, $Switch(2,11, 1)=0, $Switch(3,10, 1)=0, X1.s=Booked,
	pspN2_L16=&L10, N2_L16.t=L10.t, npN2L10=&L16
WHEN N2_L16.s=Arriving, RouteN2_L16=58, L16.s>=Departing, L16.s<=Occupied       {WHEN 1352}
 OR  N2_L16.s=Arriving, RouteN2_L16=58, L16.s=StopClear
 OR  N2_L16.s<>Free, RouteN2_L16=58, L10.s<=Stopping
 DO	N2_L16.s=Free, RouteN2_L16=Free, N2_L16.t=0, RouteN2L10=Free, Rand=$RANDOM,
	TI8.s=Free, $Switch(3,8, 1)=2, TO1.s=Free, $Switch(3,9, 1)=2,
	CO1b.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2, X1.s=Free,
	pspN2_L16=&FreeSect, N2_L16.t=0, npN2L10=&FreeSect
WHEN N2_L17.s=Free, L17.s=Free, N2.t<>0, In_N2=58, TI8.s=Free, TO1.s=Free, TI1.s=Free, L10.p<>0
 DO	d=$RANDOM 55, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=68, ENDIF
WHEN N2_L17.s=Free, Out_N2=68, In_N2=58                                         {WHEN 1354}
 DO	N2_L17.s=Booked, RouteN2_L17=58, RouteN2L10=68, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L10=0
	TI8.s=Booked, TI8.Treq=Right, $Switch(3,8, 1)=0,
	TO1.s=Booked, TO1.Treq=Left, $Switch(3,9, 1)=1,
	TI1.s=Booked, TI1.Treq=Left, $Switch(6,12, 1)=1,
	pspN2_L17=&L10, N2_L17.t=L10.t, npN2L10=&L17
WHEN N2_L17.s=Arriving, RouteN2_L17=58, L17.s>=Departing, L17.s<=Occupied       {WHEN 1355}
 OR  N2_L17.s=Arriving, RouteN2_L17=58, L17.s=StopClear
 OR  N2_L17.s<>Free, RouteN2_L17=58, L10.s<=Stopping
 DO	N2_L17.s=Free, RouteN2_L17=Free, N2_L17.t=0, RouteN2L10=Free, Rand=$RANDOM,
	TI8.s=Free, $Switch(3,8, 1)=2, TO1.s=Free, $Switch(3,9, 1)=2,
	TI1.s=Free, $Switch(6,12, 1)=2,
	pspN2_L17=&FreeSect, N2_L17.t=0, npN2L10=&FreeSect
WHEN N2_L9.s=Free, L9.s=Free, N2.t<>0, In_N2=55, CO1a.s=Free                    {WHEN 1356}
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=64, ENDIF
WHEN N2_L9.s=Free, Out_N2=64, In_N2=55                                          {WHEN 1357}
 DO	N2_L9.s=Booked, RouteN2_L9=55, RouteN2L2=64, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L2=0
	CO1a.s=Booked, CO1.Treq=Left, $Switch(2,11, 1)=0, $Switch(3,10, 1)=0, D2.s=Fwd,
	pspN2_L9=&L2, N2_L9.t=L2.t, npN2L2=&L9, ncnN2L2=6
WHEN N2_L9.s=Arriving, RouteN2_L9=55, L9.s>=Departing, L9.s<=Occupied           {WHEN 1358}
 OR  N2_L9.s=Arriving, RouteN2_L9=55, L9.s=StopClear
 OR  N2_L9.s<>Free, RouteN2_L9=55, L2.s<=Stopping
 DO	N2_L9.s=Free, RouteN2_L9=Free, N2_L9.t=0, RouteN2L2=Free, Rand=$RANDOM, ncnN2L2=0,
	CO1a.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2,
	pspN2_L9=&FreeSect, N2_L9.t=0, npN2L2=&FreeSect
WHEN N2_P1.s=Free, P1.s=Free, N2.t<>0, In_N2=55, lent[N2.t]<=10, CO1a.s=Free, CO1b.s=Free
     TO1.s=Free, TI8.s=Free, TI11.s=Free, TI12.s=Free, D2.s=Fwd
 DO	d=$RANDOM 80, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=69, ENDIF
WHEN N2_P1.s=Free, Out_N2=69, In_N2=55                                          {WHEN 1360}
 DO	N2_P1.s=Booked, RouteN2_P1=55, RouteN2L2=69, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L2=0
	CO1a.s=Booked, CO1.Treq=Right, $Switch(2,11, 1)=1, $Switch(3,10, 1)=1, CO1b.s=Booked,
	TO1.s=Booked, TO1.Treq=Right, $Switch(3,9, 1)=0,
	TI8.s=Booked, TI8.Treq=Left, $Switch(3,8, 1)=1,
	TI11.s=Booked, TI11.Treq=Left, $Switch(1,1, 1)=1,
	TI12.s=Booked, TI12.Treq=Left, $Switch(1,1, 1)=1,
	pspN2_P1=&L2, N2_P1.t=L2.t, npN2L2=&P1, ncnN2L2=5
WHEN N2_P1.s=Arriving, RouteN2_P1=55, P1.s>=Departing, P1.s<=Occupied           {WHEN 1361}
 OR  N2_P1.s=Arriving, RouteN2_P1=55, P1.s=StopClear
 OR  N2_P1.s<>Free, RouteN2_P1=55, L2.s<=Stopping
 DO	N2_P1.s=Free, RouteN2_P1=Free, N2_P1.t=0, RouteN2L2=Free, Rand=$RANDOM, ncnN2L2=0,
	CO1a.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2, CO1b.s=Free,
	TO1.s=Free, $Switch(3,9, 1)=2, TI8.s=Free, $Switch(3,8, 1)=2,
	TI11.s=Free, $Switch(1,1, 1)=2, TI12.s=Free, $Switch(1,1, 1)=2,
	pspN2_P1=&FreeSect, N2_P1.t=0, npN2L2=&FreeSect
WHEN N2_P2.s=Free, P2.s=Free, N2.t<>0, In_N2=55, lent[N2.t]<=20, CO1a.s=Free, CO1b.s=Free
     TO1.s=Free, TI8.s=Free, TI11.s=Free, TI12.s=Free, TI13.s=Free, D2.s=Fwd
 DO	d=$RANDOM 80, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=62, ENDIF
WHEN N2_P2.s=Free, Out_N2=62, In_N2=55                                          {WHEN 1363}
 DO	N2_P2.s=Booked, RouteN2_P2=55, RouteN2L2=62, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L2=0
	CO1a.s=Booked, CO1.Treq=Right, $Switch(2,11, 1)=1, $Switch(3,10, 1)=1, CO1b.s=Booked,
	TO1.s=Booked, TO1.Treq=Right, $Switch(3,9, 1)=0,
	TI8.s=Booked, TI8.Treq=Left, $Switch(3,8, 1)=1,
	TI11.s=Booked, TI11.Treq=Left, $Switch(1,1, 1)=1,
	TI12.s=Booked, TI12.Treq=Right, $Switch(1,1, 1)=0,
	TI13.s=Booked, TI13.Treq=Left, $Switch(1,1, 1)=1,
	pspN2_P2=&L2, N2_P2.t=L2.t, npN2L2=&P2, ncnN2L2=5
WHEN N2_P2.s=Arriving, RouteN2_P2=55, P2.s>=Departing, P2.s<=Occupied           {WHEN 1364}
 OR  N2_P2.s=Arriving, RouteN2_P2=55, P2.s=StopClear
 OR  N2_P2.s<>Free, RouteN2_P2=55, L2.s<=Stopping
 DO	N2_P2.s=Free, RouteN2_P2=Free, N2_P2.t=0, RouteN2L2=Free, Rand=$RANDOM, ncnN2L2=0,
	CO1a.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2, CO1b.s=Free,
	TO1.s=Free, $Switch(3,9, 1)=2, TI8.s=Free, $Switch(3,8, 1)=2,
	TI11.s=Free, $Switch(1,1, 1)=2, TI12.s=Free, $Switch(1,1, 1)=2,
	TI13.s=Free, $Switch(1,1, 1)=2,
	pspN2_P2=&FreeSect, N2_P2.t=0, npN2L2=&FreeSect
WHEN N2_L17.s=Free, L17.s=Free, N2.t<>0, In_N2=56, TI3.s=Free, CO2b.s=Free, L2.s=Free
     TO2.s=Free, X1.s=Free, TI1.s=Free, L3.p<>0
 DO	d=$RANDOM 45, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=68, ENDIF
WHEN N2_L17.s=Free, Out_N2=68, In_N2=56                                         {WHEN 1366}
 DO	N2_L17.s=Booked, RouteN2_L17=56, RouteN2L3=68, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L3=0
	TI3.s=Booked, TI3.Treq=Right, $Switch(4,19, 1)=0,
	CO2b.s=Booked, CO2.Treq=Left, $Switch(6,18, 1)=0, $Switch(5,19, 1)=0, ncnN2L2=5,
	TO2.s=Booked, TO2.Treq=Right, $Switch(2,15, 1)=1, X1.s=Booked,
	TI1.s=Booked, TI1.Treq=Right, $Switch(6,12, 1)=0, D2.s=Fwd,
	pspN2_L17=&L3, N2_L17.t=L3.t, npN2L3=&L17
WHEN N2_L17.s=Arriving, RouteN2_L17=56, L17.s>=Departing, L17.s<=Occupied       {WHEN 1367}
 OR  N2_L17.s=Arriving, RouteN2_L17=56, L17.s=StopClear
 OR  N2_L17.s<>Free, RouteN2_L17=56, L3.s<=Stopping
 DO	N2_L17.s=Free, RouteN2_L17=Free, N2_L17.t=0, RouteN2L3=Free, Rand=$RANDOM,
	TI3.s=Free, $Switch(4,19, 1)=2, CO2b.s=Free, $Switch(6,18, 1)=2, $Switch(5,19, 1)=2,
	ncnN2L2=0, TO2.s=Free, $Switch(2,15, 1)=2, X1.s=Free, TI1.s=Free, $Switch(6,12, 1)=2,
	pspN2_L17=&FreeSect, N2_L17.t=0, npN2L3=&FreeSect
WHEN N2_L17.s=Free, L17.s=Free, N2.t<>0, In_N2=57, TI3.s=Free, L2.s=Free, TO2.s=Free
     X1.s=Free, TI1.s=Free, L4.p<>0
 DO	d=$RANDOM 45, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=68, ENDIF
WHEN N2_L17.s=Free, Out_N2=68, In_N2=57                                         {WHEN 1369}
 DO	N2_L17.s=Booked, RouteN2_L17=57, RouteN2L4=68, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2L4=0
	TI3.s=Booked, TI3.Treq=Left, $Switch(4,19, 1)=1, ncnN2L2=5,
	TO2.s=Booked, TO2.Treq=Right, $Switch(2,15, 1)=1, X1.s=Booked,
	TI1.s=Booked, TI1.Treq=Right, $Switch(6,12, 1)=0, D2.s=Fwd,
	pspN2_L17=&L4, N2_L17.t=L4.t, npN2L4=&L17
WHEN N2_L17.s=Arriving, RouteN2_L17=57, L17.s>=Departing, L17.s<=Occupied       {WHEN 1370}
 OR  N2_L17.s=Arriving, RouteN2_L17=57, L17.s=StopClear
 OR  N2_L17.s<>Free, RouteN2_L17=57, L4.s<=Stopping
 DO	N2_L17.s=Free, RouteN2_L17=Free, N2_L17.t=0, RouteN2L4=Free, Rand=$RANDOM,
	TI3.s=Free, $Switch(4,19, 1)=2, ncnN2L2=0, TO2.s=Free, $Switch(2,15, 1)=2, X1.s=Free,
	TI1.s=Free, $Switch(6,12, 1)=2,
	pspN2_L17=&FreeSect, N2_L17.t=0, npN2L4=&FreeSect
WHEN N2_L16.s=Free, L16.s=Free, N2.t<>0, In_N2=54, TI13.s=Free, TI12.s=Free, TI11.s=Free
     TI8.s=Free, TO1.s=Free, CO1b.s=Free, X1.s=Free, P2.p<>0, tt[N2.t]<>1
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=67, ENDIF
WHEN N2_L16.s=Free, Out_N2=67, In_N2=54                                         {WHEN 1372}
 DO	N2_L16.s=Booked, RouteN2_L16=54, RouteN2P2=67, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2P2=0
	TI13.s=Booked, TI13.Treq=Left, $Switch(1,1, 1)=1,
	TI12.s=Booked, TI12.Treq=Right, $Switch(1,1, 1)=0,
	TI11.s=Booked, TI11.Treq=Left, $Switch(1,1, 1)=1,
	TI8.s=Booked, TI8.Treq=Left, $Switch(3,8, 1)=1,
	TO1.s=Booked, TO1.Treq=Right, $Switch(3,9, 1)=0,
	CO1b.s=Booked, CO1.Treq=Left, $Switch(2,11, 1)=0, $Switch(3,10, 1)=0, X1.s=Booked,
	pspN2_L16=&P2, N2_L16.t=P2.t, npN2P2=&L16
WHEN N2_L16.s=Arriving, RouteN2_L16=54, L16.s>=Departing, L16.s<=Occupied       {WHEN 1373}
 OR  N2_L16.s=Arriving, RouteN2_L16=54, L16.s=StopClear
 OR  N2_L16.s<>Free, RouteN2_L16=54, P2.s<=Stopping
 DO	N2_L16.s=Free, RouteN2_L16=Free, N2_L16.t=0, RouteN2P2=Free, Rand=$RANDOM,
	TI13.s=Free, $Switch(1,1, 1)=2, TI12.s=Free, $Switch(1,1, 1)=2,
	TI11.s=Free, $Switch(1,1, 1)=2, TI8.s=Free, $Switch(3,8, 1)=2,
	TO1.s=Free, $Switch(3,9, 1)=2, CO1b.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2,
	X1.s=Free,
	pspN2_L16=&FreeSect, N2_L16.t=0, npN2P2=&FreeSect
WHEN N2_L17.s=Free, L17.s=Free, N2.t<>0, In_N2=54, TI13.s=Free, TI12.s=Free, TI11.s=Free
     TI8.s=Free, TO1.s=Free, TI1.s=Free, P2.p<>0, tt[N2.t]<>1
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=68, ENDIF
WHEN N2_L17.s=Free, Out_N2=68, In_N2=54                                         {WHEN 1375}
 DO	N2_L17.s=Booked, RouteN2_L17=54, RouteN2P2=68, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2P2=0
	TI13.s=Booked, TI13.Treq=Left, $Switch(1,1, 1)=1,
	TI12.s=Booked, TI12.Treq=Right, $Switch(1,1, 1)=0,
	TI11.s=Booked, TI11.Treq=Left, $Switch(1,1, 1)=1,
	TI8.s=Booked, TI8.Treq=Left, $Switch(3,8, 1)=1,
	TO1.s=Booked, TO1.Treq=Left, $Switch(3,9, 1)=1,
	TI1.s=Booked, TI1.Treq=Left, $Switch(6,12, 1)=1,
	pspN2_L17=&P2, N2_L17.t=P2.t, npN2P2=&L17
WHEN N2_L17.s=Arriving, RouteN2_L17=54, L17.s>=Departing, L17.s<=Occupied       {WHEN 1376}
 OR  N2_L17.s=Arriving, RouteN2_L17=54, L17.s=StopClear
 OR  N2_L17.s<>Free, RouteN2_L17=54, P2.s<=Stopping
 DO	N2_L17.s=Free, RouteN2_L17=Free, N2_L17.t=0, RouteN2P2=Free, Rand=$RANDOM,
	TI13.s=Free, $Switch(1,1, 1)=2, TI12.s=Free, $Switch(1,1, 1)=2,
	TI11.s=Free, $Switch(1,1, 1)=2, TI8.s=Free, $Switch(3,8, 1)=2,
	TO1.s=Free, $Switch(3,9, 1)=2, TI1.s=Free, $Switch(6,12, 1)=2,
	pspN2_L17=&FreeSect, N2_L17.t=0, npN2P2=&FreeSect
WHEN N2_L2.s=Free, L2.s=Free, N2.t<>0, In_N2=54, TI13.s=Free, TI12.s=Free, TI11.s=Free
     TI8.s=Free, TO1.s=Free, CO1a.s=Free, CO1b.s=Free, TO2.s=Free, L3.s=Free, L4.s=Free, P2.p<>0, tt[N2.t]=1
 DO	d=$RANDOM 100, IF d>=Pri_N2 THEN Pri_N2=d, Out_N2=63, ENDIF
WHEN N2_L2.s=Free, Out_N2=63, In_N2=54                                          {WHEN 1378}
 DO	N2_L2.s=Booked, RouteN2_L2=54, RouteN2P2=63, N2.t=0, In_N2=0, Out_N2=0, Pri_N2=0, Tt_N2P2=0
	TI13.s=Booked, TI13.Treq=Left, $Switch(1,1, 1)=1,
	TI12.s=Booked, TI12.Treq=Right, $Switch(1,1, 1)=0,
	TI11.s=Booked, TI11.Treq=Left, $Switch(1,1, 1)=1,
	TI8.s=Booked, TI8.Treq=Left, $Switch(3,8, 1)=1,
	TO1.s=Booked, TO1.Treq=Right, $Switch(3,9, 1)=0,
	CO1a.s=Booked, CO1.Treq=Right, $Switch(2,11, 1)=1, $Switch(3,10, 1)=1, CO1b.s=Booked,
	TO2.s=Booked, TO2.Treq=Left, $Switch(2,15, 1)=0, D2.s=Rev,
	pspN2_L2=&P2, N2_L2.t=P2.t, npN2P2=&L2
WHEN N2_L2.s=Arriving, RouteN2_L2=54, L2.s>=Departing, L2.s<=Occupied           {WHEN 1379}
 OR  N2_L2.s=Arriving, RouteN2_L2=54, L2.s=StopClear
 OR  N2_L2.s<>Free, RouteN2_L2=54, P2.s<=Stopping
 DO	N2_L2.s=Free, RouteN2_L2=Free, N2_L2.t=0, RouteN2P2=Free, Rand=$RANDOM,
	TI13.s=Free, $Switch(1,1, 1)=2, TI12.s=Free, $Switch(1,1, 1)=2,
	TI11.s=Free, $Switch(1,1, 1)=2, TI8.s=Free, $Switch(3,8, 1)=2,
	TO1.s=Free, $Switch(3,9, 1)=2, CO1a.s=Free, $Switch(2,11, 1)=2, $Switch(3,10, 1)=2,
	CO1b.s=Free, TO2.s=Free, $Switch(2,15, 1)=2,
	pspN2_L2=&FreeSect, N2_L2.t=0, npN2P2=&FreeSect

{ End of file }

