Signalman b.bb^Signalman by Duncan Munro from ZX Computing Jun/Jul.1985~KC  63999 %"Signalman"by D.J.Munro  train codes .0,3;"DESCRIPTION CLASS" .1,3;"----------- -----" #<2,0;"EXPRESS PASSENGER";2,25;"1" (=3,0;"ORDINARY PASSENGER";3,25;"2" -:4,0;"EXPRESS FREIGHT";4,25;"3" 2;5,0;"ORDINARY FREIGHT";5,25;"4" 71#1;"Press any key to continue":0: <0,12 ;"TIMETABLE" A1,12 ;"---------" F33,1;"DESCRIPTION TIME DUE CODE" H 4,15;"IN SECTION" J35,1;"----------- -------- ----" L46,0;"UP EXPRESS PASS. 1501 1UM01" N47,0;"BRANCH ORD PASS. 1503 2UB03" P48,0;"DOWN ORD PASS. 1505 2DM05" R49 ,0;"UP EXPR. FREIGHT 1509 3UM09" T510 ,0;"BRANCH ORD PASS. 1512 2UB12" V511 ,0;"UP ORD PASS. 1516 2UM16" X512 ,0;"DOWN ORD FREIGHT 1520 4DM20" Z1#1;"Press any key to continue":0: _'"PLEASE SET CAPS MODE, THEN ENTER";c$ d"16,8;"PLEASE WAIT!" i nn=137% sn187010b xa$ x=07 a a$+x,a x n route indicator light G"a",0,0,0,24,24,0,0,0 up arrow K"b",87W,85U,87W,84T,116t,0,0,0 G"c",4,2,127,2,4,0,0,0 down arrow K"d",0,0,0,32 ,64@,254,64@,32 O"e",0,0,0,206,170,170,170,206 O"f",0,0,0,169,173,239,235,169 road surface Q"g",171,85U,171,85U,171,85U,171,85U M"h",42*,85U,42*,85U,42*,85U,42*,85U gate warning lights K"i",0,0,0,0,96`,240,240,96` G"j",6,15,15,6,0,0,0,0 right gate post U"k",231,103g,103g,103g,103g,103g,103g,231 closed gates, right U"l",255,129,193,193,161,185,181,211 U"m",203,173,157,133,131,131,129,255 closed gates, left U"n",255,129,131,131,131,157,173,203 U"o",211,181,185,161,193,193,129,255 track section K"p",0,255,0,24,24,0,255,0 left gate post E"q",7,6,6,6,6,6,6,7 down line light arm O"a",0,568,68D,130,130,130,68D,568 G"b",1,1,1,1,255,0,0,0 up line light arm O"c",0,0,0,255,128,128,128,128 O"d",568,68D,130,130,130,68D,568,0 down line colour light Q"e",0,568,124|,254,254,254,124|,568 up line colour light Q"f",568,124|,254,254,254,124|,568,0 junction indicator G"g",24,12 ,6,3,1,0,0,0 ground disc on Q"h",60<,90Z,153,153,153,153,90Z,60< ground disc off Q"i",60<,70F,143,157,185,241,98b,60< ground disc arms O"j",128,128,128,128,255,0,0,0 G"k",0,0,0,255,1,1,1,1 junction arm J"l",0,0,0,0,24,36$,66B,129 lever L"m",0,24,60<,60<,60<,60<,60<,24 lever frame U"n",231,231,231,231,231,231,231,231 route indicator light G"o",0,0,0,24,24,0,0,0 siding junction arm G"p",1,1,1,1,255,8,8,8 up line open gates U"q",255,129,130,132,135,142,177,255 S"r",255,141,113q,225,33!,65A,129,255 down line open gates U"s",255,177,142,135,132,130,129,255 S"t",255,129,65A,33!,225,113q,141,255  7000X '7y=031:9 ,y;"";12 ,y;"":y @(x=38:x,x-3;"":x T)x=612 :x,x-6;"":x 10 ,11 ;"";10 ,25;"";11 ,10 ;"";11 ,26;"";13 ,23;"";13 ,22;"" )y=1722:14,y;"":y 14,18;"";10 ,30;"";13 ,0;"";7,13 ;"";8,13 ;"";13 ,13 ;"";14,13 ;"";8,15;"";13 ,12 ;""  up line J0,73I:255,0:0,78N:255,0  down line K0,97a:255,0:0,102f:255,0 siding L133,62>:46.,0:133,579:47/,0  up branch a0,154:502,104h-154:0,148:491,99c-148  down branch `0,130:502,80P-130:0,124|:491,75K-124| loop 1/2 _77M,80P:20,100d-80P:78N,75K:20,95_-75K loop 3/4 b198,100d:20,80P-100d:197,95_:20,75K-95_ siding junction `180,63?:13 ,76L-63?:181,58::13 ,71G-58: r1;27,103g:1;29,101e:1;26,98b:1;28,96` 8y=1621:8,y;"";13 ,y;"":y F8,22;"";14,16;"";13 ,17;"" gates closed \9 ,14;"";10 ,14;"";11 ,13 ;"";12 ,13 ;"" N"*****call second set of graphics X 7010b lx13 ,30;"";13 ,25;"";13 ,15;"";14,26;"";13 ,6;"" {D8,0;"";8,10 ;"";8,23;"" `11 ,7;"";10 ,22;"";10 ,15;"";11 ,28;"" )2,1;"";3,2;"" &16,8;"UUUUDDDDDSSSSSKC" &17,8;"JDHSJASHD12345LO" 418,3;"1=ON";21,2;"0=OFF" p63?,32 :193-63?,0:0,15:63?-193,0:0,-15 c$="2622522260000034" y=823 :18,y;ٰc$(y-7);"";19,y;0;"" 20,y;"" y `" SWITCH ON?(Y/N)";q$:Capital "N" is given as an option, but not accepted below. [JimG] q$="Y"730 q$="y"q$="n"725  700 2"PLEASE SET CAPS MODE, THEN ENTER";c$:700 .2~L,502 n13 ,30;6;"";13 ,25;2;"";13 ,15;"";13 ,7;"" i8,0;6;"";8,11 ;2;"";8,24;"";3,2;"" |11 ,8;2;"";10 ,15;"";10 ,23;"";11 ,28;"";14,26;""  #s$="UJUDUHUSDJDADSDHDDS1S2S3S4S5" %?p$="03020800081108241306130713151325133011081015102311281426" * l(14) /set all signal locks to ON 4%n=114:l(n)=1:n >initialise variables CLik=0:tr=1:demo=0:tr1=0:tr2=0 Mx(2):y(2) R'ot=0:rd=0:cumrd=0 W5set king lever lock to ON & gate lock to OFF. \kl=1:lock=0 a#set time to 1500 hrs. cC23674z\,41):23673y\,502:23672x\,224 e)m(x,y)=(x+y+(x-y))/2 fau()=(65536*23674z\+256*23673y\+23672x\)/(502*60<*60<) gt()=m(u(),u()) h sthr=t() istmin=((t()-sthr)*60<) k417,26;"TIME";18,29;"HRS" m]18,25;sthr;18,27;"0";18,28;stmin:.01z# =,20 p"DEMO MODE?(Y/N)";q$ uq$="Y"9500% z 900 4tr81000:cumrd=cumrd+rd:9000(#  890z ****** main program &nt1=0:nt2=0  tr1tr2965 3000 +(tr*10 ) !"ACCEPT CODE ";(d$);"?(Y/N)";q$ 8q$="Y"(tr1tr2)tr=tr+1:950 ^q$="Y"tr1tr2tr1=1:nt1=1:tr=tr+1:956 q$"Y"q$"N"930 q$="N"960 <tr1tr2=1:nt2=1:956 &tr1=1:nt1=1 *0,3;"TRAIN ";d$;" accepted" &1100L:1000:1170: %tr1tr21000: 1000:1170: lever frame operation  1800 lock1900l .lock6,6;" " "ENTER LEVER CODE";r$ !r$3r$"RS"1015  r$="RS" 3r$(13)="CO0"3200 :1010 3r$(13)="KL0"3100 :1010  3r$(13)="CO1"3250 :1010  3r$(13)="KL1"3150N :1010 -r$(3)"0"r$(3)"1"1010 =r$(1)"U"r$(1)"D"r$(1)"S"1010 1first check interlocks set for signal operation .kllokc1600@:1800:1015 2***find lever & signal colour and print position 8 3300 B 1010 Lfind entry point QLd$(23)="UB"nt1x(1)=3:y(1)=0 VLd$(23)="UB"nt2x(2)=3:y(2)=0 [Ld$(23)="UM"nt1x(1)=9 :y(1)=0 `Ld$(23)="UM"nt2x(2)=9 :y(2)=0 eNd$(23)="DM"nt1x(1)=12 :y(1)=31 jNd$(23)="DM"nt2x(2)=12 :y(2)=31 tshow train position y3nt11;1;x(1),y(1);"" 3nt21;1;x(2),y(2);""  *** drive train *** 20,3;" OPERATE TRAIN CONTROLS " 21,3;"SHORT FLASH: key '5' or '8' " 22,3;"LONG FLASH: key 'Q' or 'P' " 23,3;" Key 'S' to call box " 24,3;" " 3*******tr1-short flash;tr2-long flash =tr20;1;x(2),y(2);"":15 =tr21;1;x(2),y(2);"":15 3tr10;1;x(1),y(1);"" 3tr11;1;x(1),y(1);"" =""1182 3tr10;1;x(1),y(1);"" =tr20;1;x(2),y(2);"":15 ="S"2000 tr15000 tr25200P Xtr1pt1=0:pt2=0:pt3=0:pt4=0 Xtr2vt1=0:vt2=0:vt3=0:vt4=0  ****check for signal at danger Y="8"x(1)<10 ƫ(x(1)-1,y(1)+1)=58:2000 Y="5"x(1)>10 ƫ(x(1)+1,y(1)-1)=58:2000 Y="P"x(2)<10 ƫ(x(2)-1,y(2)+1)=58:2000 Y="Q"x(2)>10 ƫ(x(2)+1,y(2)-1)=58:2000 ="5"Ŧ="8"21004 ="Q"Ŧ="P"2200  ****check if train hit buffers u(y(1)17x(1)=14tr1)(y(2)17x(2)=14tr2)1500  check for train out of section S(y(1)<0y(1)>31)tr1tr1=0:2000 S(y(2)<0y(2)>31)tr2tr2=0:2000  !******check trains not collided 9x(1)=x(2)y(1)=y(2)1400x F5If all O.K.,repeat for next INKEY entry K3tr11;1;x(1),y(1);"" L3tr21;1;x(2),y(2);"" N.1}L,40( P 1190 xtrains collided N0,0;1;1;2;" YOU CRASHED INTO OTHER TRAIN!" O1,0;1;1;2;"CONDUCT ACCIDENT INVESTIGATION!"  1550 hit siding buffers O0,0;1;1;2;" YOU CRASHED INTO THE BUFFERS! " O1,0;1;1;2;"CONDUCT ACCIDENT INVESTIGATION!" <2,2;2;" KEY 'R' TO TRY AGAIN " <3,2;2;" KEY 'E' TO END " /n=1510 -1:10 /n,n:n " ="R" , ="E" 6 1570" @6warning routine - attempting interlock override J*n=110 :.1}L,502:n hD1,3;1;2;" GATES MUST BE OPERATED! " r;2,3;2;" KING LEVER MUST BE 'ON' " |;3,3;2;" ALL SIGNALS MUST BE 'ON' " ;4,3;2;"PULL SIGNAL IF KING LEVER OFF"  100d $o$=" " n1;0,3;o$;1,3;o$;2,3;o$;3,3;o$;4,3;o$  lever frame header $o$=" " 21,3;" OPERATE LEVER FRAME " &22,3;" Key 'RS' when route set. " 0)3,3;o$;4,3;o$ : lroad traffic delay v9rd=((((t()*60<*60<)-ot)/6)^1.5@) ;6,6;"Aggro=";rd;6,16;"decibels"   *****return to operate signals #demolock1900l:2020 demolock2020 $o$=" " (lock1,3;o$:2015  1900l ;1,3;1;" REM:ROAD TRAFFIC! " Q0,3;o$;2,3;o$;3,3;o$;4,3;o$ $1,45-:1,45- 3tr11;1;x(1),y(1);"" 3tr21;1;x(2),y(2);""  4'y(1)=y(1)+(="8")-(="5") >_x(1)=x(1)+(="8"pt3)-(="8"pt1)+(="5"pt2)-(="5"pt4) H 'y(2)=y(2)+(="P")-(="Q") _x(2)=x(2)+(="P"vt3)-(="P"vt1)+(="Q"vt2)-(="Q"vt4)  |*******train codes for scheduled arrival times: 1501,1503,1505,1509 hours.,etc. d$="1UM01": d$="2UB03": d$="2DM05": d$="3UM09": d$="2UB12": d$="2UM16": d$="4DM20": # open gates-pull off king lever !(lock=01600@:1800: 0818,22;" ";21,22;3;"" ? kl=0 D.1}L,45-: N# close gates-return king lever O'first check all signals set to danger Pn=114 Q(l(n)=01600@:1800: Rn b821,22;3;" ";18,22;"" q kl=1 v.1}L,45-: open gates check if KL set to ON. &kl=01600@:1800: 818,23;" ";21,23;4;"" 7000X n=15 J7,15;2;"";14,12 ;"":.3,30 J7,15;7;"";14,12 ;"":.3,30 n 20 \9 ,14;"";12 ,13 ;"";10 ,14;" ";11 ,13 ;" " 7010b 08,13 ;"";13 ,13 ;"" ot=t()*60<*60< set gate lock to ON lock=1 (.3,30:.3,30: close gates check if KL set to ON &kl=01600@:1800: 821,23;" ";18,23;4;"" 7000X n=15 J7,15;2;"";14,12 ;"":.3,30 J7,15;7;"";14,12 ;"":.3,30 n 20 ԋ8,13 ;"";13 ,13 ;"";9 ,14;"";10 ,14;"";11 ,13 ;"";12 ,13 ;"" lock=0 &.3,30:.3,30 7010b cumrd=cumrd+rd rd=0  level colour ik=2 r$(1)="S"ik=0 r$(2)="D"ik=6 r$(1)="K"ik=3 &r$(12)="CO"ik=4 -r$(1)="D"r$(2)="J"ik=5 x=0 p=1272 Fs$(pp+1)=r$(12)x=7+((p+1)/2) p abort if no match  x=0 lever to 'on' 6r$(3)="1"21,x;" ";18,x;ik;"" *lever to 'off' /6r$(3)="0"18,x;" ";21,x;ik;"" signal colour Fr$(12)"DJ"r$(2)"D"r$(3)="1"ik=2 Vr$(12)"DJ"r$(1)"S"r$(2)="D"r$(3)="0"ik=4 -r$(1)="S"r$(3)="0"ik=2 6r$(12)="DJ"r$(3)="1"ik=0 6r$(12)="DJ"r$(3)="0"ik=5 -r$(2)="D"r$(3)="1"ik=6 -r$(2)="D"r$(3)="0"ik=4 now find position n=1:z=0 $p=1272 .rs$(pp+1)=r$(12)x=p$(nn+1):y=p$(n+2n+3):z=p:p=27:3650B 8 n=n+4 Bp  now find correct user graphic x=3x=8u$="F" x=13 y6u$="E" <(x=10 x=11 x=14)r$(3)="0"u$="I" <(x=10 x=11 x=14)r$(3)="1"u$="H" x=13 y=6u$="G" set signal interlock 1r$(3)="1"l((z+1)/2)=1 1r$(3)="0"l((z+1)/2)=0 <now alter signal F)u$="E"ik;x,y;"":.4L,25 P)u$="F"ik;x,y;"":.4L,25 Z)u$="I"ik;x,y;"":.4L,10 d)u$="H"ik;x,y;"":.4L,10 n)u$="G"ik;x,y;"":.4L,25 xnow alter points r$(3)="0"a=0 r$(3)="1"a=1 a$=r$(12) 6a$="UJ"a;502,98b:a;513,103g a$="DJ"a;27,103g:a;29,101e:a;26,98b:a;28,96`:a;502,74J:a;513,79O ja$="S1"a$="S2"a;76L,79O:a;77M,74J:a;99c,96`:a;98b,101e na$="S3"a$="S4"a;196,96`:a;197,101e:a;218,74J:a;219,79O 7a$="S5"a;194,77M:a;195,72H  2calculate pixel coords. of train tr1 )q1=175-(x(1)*8) )q2=168-(x(1)*8) 'p1=4+(y(1)*8) 'p2=3+(y(1)*8) now record if pixel set  pt1=(p1,q1)  pt2=(p2,q2)  pt3=(p1,q2)  pt4=(p2,q1) F P2calculate pixel coords. of train tr2 )w1=175-(x(2)*8) )w2=168-(x(2)*8) 'v1=4+(y(2)*8) 'v2=3+(y(2)*8) now record if pixel set  vt1=(v1,w1)  vt2=(v2,w2)  vt3=(v1,w2)  vt4=(v2,w1)  Xfirst user graphic set ]/23675{\,88X:23676|\,255: bsecond user graphic set g.23675{\,0:23676|\,250: @calculate the time J hr=t() Tmin=((t()-hr)*60<) ^gmin<10 18,25;hr;18,27;"0";18,28;min:.01z# =,20 hPmin10 18,25;hr;18,27;min:.01z# =,20 | #($*****calculate overall performance #2 #< 8000@ #PYmin200,0;"GOOD RUNNING TO TIMETABLE":score=100d:9070n# #Z\min40(0,0;"OVER-RAN TIMETABLE BY >20minS.":score=0:9070n# #d"score=(200-(5*min)) #n-1,0;"TRAIN RUNNING=";score;"%" #norm=140 #Ocumrdnorm3,0;"NORMAL ROAD DELAY":aggro=100d:9150# #&aggro=((140/cumrd)*100d) #,4,0;"ROAD TRAFFIC=";aggro;"%" #total=(aggro+score)/2 #.6,0;"OVERALL RATING=";total;"%" #>18,11 ;"PROGRAM ENDED:";18,29;"hrs" $T % demo mode %demo=1 %'1,6;2;"DEMO MODE" %22,3;"PRESS 'ENTER' KEY " % *3,3;"WATCH CODE AND SCREEN" %!h$(20) %"$o$=" " %#******accept UP EXPRESS PASSENGER,"1UM01" %&h$="CO0KL0US0UH0UD0" %+Qm=13 :nt1=1:nt2=0:tr1=1:tr=1 %-3000 +(tr*10 ) %0#"ACCEPT CODE ";(d$);"?(Y/N) Y";f$ %31100L:9900& %5:4,3;1;"Key '8'-drive out of section" %6 1180 %7**train out of section %8**close gates %:4,3;o$ %=h$="UD1UH1US1KL1CO1" %? 9900& %A-accept UP BRANCH ORDINARY PASSENGER,"2UB03" %Dh$="CO0KL0UH0UJ0" %F>m=10 :nt1=1:tr1=1:tr=2 %I3000 +(tr*10 ) %J#"ACCEPT CODE ";(d$);"?(Y/N) Y";f$ %L1100L:9900& %N94,3;1;"Key '8'-drive to UP starter" %O 1180 %P**train in section %Q**close gates %R4,3;o$ %Th$="UJ1UH1KL1CO1" %V 9900& %X***accept DOWN ORDINARY PASSENGER,"2DM05" %\h$="CO0KL0DH0" %]Pm=7:nt1=0:nt2=1:tr2=1:tr=3 %_3000 +(tr*10 ) %`#"ACCEPT CODE ";(d$);"?(Y/N) Y";f$ %b1100L:9900& %e;4,3;1;"Key 'Q'-drive to DOWN starter" %g 1180 %l**train in section %m**close gates %n4,3;o$ %qh$="DH1KL1CO1" %s 9900& %u**train in section %v** open gates %w'** set route for DOWN MAIN PASSENGER %yh$="CO0KL0DA0DS0" %{ m=10 %} 9900& %:4,3;1;"Key 'Q'-drive out of section" % 1180 %9nt1=0:nt2=0:tr2=0 %** train in section %"** reset for UP BRANCH PASSENGER %4,3;o$ %h$="DS1DA1S30US0" % 9900& %;4,3;1;"Key'8'-run to down line-Key S" %B5,4;2;1;"Do NOT drive out of section" % 1180 %!tr1=0:9655% %** train in section %** reset for DOWN line %)4,3;o$;5,3;o$ %h$="US1S31DA0DJ0DS0DH0" % m=16 % 9900& %:4,3;1;"Key '5'-drive out of section" % 1180 %**trains out of section %**close gates %4,3;o$ %h$="DH1DS1DJ1DA1KL1CO1" % 9900& %31,6;1;2;"END OF DEMO " %.5,502 %=2,0;1;"Key 'S' for performance rating " %=3,0;1;"of first 3 trains of timetable." %="S"9000(# % 9657% &find lever code &e=1m3 &r$=h$(ee+2) &"ENTER LEVER CODE ";(r$);f$ &"r$="CO0"3200 :9972& &"r$="KL0"3100 :9972& &"r$="CO1"3250 :9972& &"r$="KL1"3150N :9972& & 3300 &lock1900l &.lock6,6;" " &e & r$="RS" '"ENTER LEVER CODE ";(r$);f$ '