SIGNALMAN by Duncan Munro from ZX Computing Jun/Jul.1985 Duncan Munro has done a lot of research in Londonderry to ensure the accuracy of his signal box simulation. This program simulates the working of a modern signal box and is based on the actual working practice of the local Coleraine box. In order to get the details right, I spent some time with the signal man on a recent Saturday afternoon when traffic was quite busy. I had a very interesting time, away from the computer for a change, discussing and watching the actual operations and working methods. The Coleraine Section incidentally was one of the first to be fitted with track circuiting, colour light signalling, and a route indicator board in the box in the late 1930's. The Coleraine signal box has many interesting features, including control of two level crossing gates, a lifting cantilevered rail bridge across the river Bann, and control of trains on the main Belfast - Londonderry line as well as the branch line to Portrush. There are 48 levers in the lever frame so my computer simulation is a considerable simplification with only (!) 16 levers. Nevertheless, the program does include all the essential features. These include full interlocking of the crossing gates with the signals and points levers through a king lever as in real life. The lever colour coding is also accurately represented within the limits of the Spectrum's 8 colours. It does not attempt, however, to handle the various bell codes exchange between adjacent signal boxes, as this would require a program in its own right, and also slow operation down to an unacceptable level. There may seem to be a lot of beeps used but, in practice, a signal box is a surprisingly noisy place with different bells, buzzers, and telephones sounding every few minutes. The program contains several novel features, including working in real time to a pre-set timetable. At the end of the program, the overall efficiency of the signalman is calculated and displayed. This takes into account both the efficiency in running the trains to the timetable and the delays imposed on the road traffic. This delay has been made proportional to time on an exponential, rather than linear basis, so that a balance has to be achieved, as in real life, between running the trains on time, and keeping the road open to traffic for as long as possible. Skill is required in efficient and effective route setting and driving the trains while in the section. The program is not 'fast moving' in the arcade game sense but rather corresponds to the speed of operation required in real life practice. The degree of difficulty can be changed by small alterations in the delay function exponential power value. A value of 2, for example, instead of 1.5, will increase road delays to the point where a high score is almost impossible. A demo mode option is included, allowing the user to familiarise himself with the lever codes and the operation of the gates, signals, points, trains, etc. merely by pressing one key when instructed. Once a train is accepted and a route set up for it, the operator changes roles to become the engine driver. After driving the train to its correct place (a stop signal, across a junction, or out of section) he reverts back to the signalman role. The program structure and detailed instructions are described separately. However one or two items are noteworthy - 1. Due to the large number (37) of user-defined graphics, these are split into two sets and each set called up as needed by poking values into system variable 23675. 2. The program makes full use of Boolean operators (AND, NOT) to ensure correct signal interlocking with the gates, and to ensure correct subroutines are used to run various possible scenarios, and is essential in directing the trains correctly at a points junction. The method of directing the train at a junction, is, I believe, somewhat unique. It is fully explained in the subsequent text. Finally, the program requires 24.1 K for the Basic listing and consequently requires a 48K Spectrum. It has been thoroughly tested and debugged. It is 'idiot proof' and will not permit trains to be driven while the gates are closed to rail traffic, neither can a train be driven past a signal at danger. It will also stop and request an immediate 'Accident Investigation' if two trains are allowed to collide, or are driven into the buffers. Operating Instructions You are in charge of a Signal Box. Your section is controlled by colour lights based on British Signalling Practice. Seven trains will be offered to you in sequence of the operating time table, from 15:00 hours onwards (you will find it useful to make a note of the timetable codes for reference). No more than 2 trains in section are permitted. The branch line train is a local rail bus. After discharging passengers, the rail bus must wait for the MAIN line train, and then be rerouted back via the DOWN BRANCH line. Therefore, the rail bus must cross over to the Down Line before you can accept an UP MAIN line train. The seventh and final train is a DOWN freight train which has to be diverted to the siding, and then all signals set to 'ON' and the crossing gates closed. Your score will then be shown. BUT NO SCORE IF YOU CRASH! The score takes into account delays in routing of trains through your section and excessive delays to road traffic due to keeping the crossing gates closed. Car drivers' aggravation is indicated on an exponentially rising decibel scale! For safety reasons, the gates, and the signal levers are fully interlocked. Gates must be opened first before pulling off any other levers. The King lever interlock (labelled KL) must then be pulled off before you can pull off any signal levers. This sequence must be reversed before closing the gates (remember that closing the gates here means closing to rail traffic, not road traffic!). The levers are colour coded (yellow = distant, red = starter or home or advanced starter, black = ground signal, green = gate lever, magenta = king lever, and cyan = down line junction route indicator). 1 = 'ON' (at danger or caution) 0 = 'OFF' (clear) So, to pull off the Down Starter, input DS0. A demo mode operation is available to assist in familiarising the lever frame operation. When you have accepted a train, and set the routine up, you change roles and become the engine driver! When you have driven the train to its correct position, i.e. up to a signal at danger, or out of section, you will return to the box automatically. Otherwise key 'S' to return to the box. A description of the train codes and the operating timetable are shown at start of the program. The train codes are alpha numeric, containing 5 characters. The first is a numeral, 1 to 4, giving the train description, the second and third characters are alpha and indicate the line on which the train is travelling when entering section, and the last two are digits showing the time due in section. Thus, '2DM05' signifies ordinary (stopping) passenger train due on the down main line at 15:05 hours. Lever Interlocking There are 3 types of interlocks - variables LOCK, KL and L (n) - to ensure that: a) the signals cannot be set to clear if gates are shut (to rail traffic); b) the gates cannot be shut if a signal is at clear. As in real life practice, it is necessary to have an intermediate lever, called a KING lever, which must be pulled off before any signal lever is pulled. It must also be set back 'ON' before the gates can be opened or closed. When the gates are opened, they are physically locked in position by latch set in the road surface. The diagram illustrates the sequence of interlocking; '1' means lever is pulled 'OFF'; '0' means lever is set 'ON'. Program structure Lines 20-90 Train codes and Timetable. 100-254 Define USR graphics and store first 17 characters at addresses 65368 upwards. Store remainder at addresses 64000 and up. 280/600/etc. Poke system variable 23675 to call up required set of graphics. 295-680 Draw layout (The draw statements are left in the original format of one number minus another. I found this was essential to the task of plotting and drawing to an exact pixel position and correcting any errors.) 750-790 Add ink colours. 800-805 Store lever codes and corresponding signal print coordinates for use in subsequent subroutines. 865-877 Start the clock (see the Sinclair manual). 900-965 Main control program - controls which subroutines to call depending on whether one or two trains already in section and whether a train has been accepted into section. 1000-1090 Controls the lever frame operation and calls appropriate subroutine. 1100-1160 Finds starting coordinates of a train entering section and lights up route indicator. 1170 Main routine to drive trains. 1400-1590 Accident Notices. Program stops if activated. 1600-1720 Warning Notices if incorrect lever operation attempted. 1900-1950 Calculates the time, in minutes, that the gates have been opened and increments the value to the power 1.5 to give aggravation level on an exponentially rising scale of 'decibels' (rd). 2000-2040 Exit from driving routine, and return to signal box operation. 2100-2220 Subroutines for trains 1 and 2 to determine new print positions. 3000-3070 Individual train codes. 3100-3297 Gate and King lever routines including interlock setting (see text for details). Line 3227 - ot = time gates opened; Line 3295 - cumrd = cumulative road traffic delays for each interval of time gates opened and closed. 3300-4050 Operates signal levers, sets appropriate signal colour, changes the points, and sets signal interlock. 5000-5390 Evaluates the track on which each train is standing. Sets the appropriate variables: pt1, pt2, pt3, pt4; for train 1; and: vt1, vt2, vt3, vt4; for train 2. Returns to subroutines 2100-2220 to evaluate direction to move (E, W, NE, SE, SW or NW) for INKEY$ "5", "8", or "Q" or "P" (see text for details). 7000-7015 Subroutines to call up appropriate set of graphics. 8000-8060 Calculates the actual time for the digital clock display. 9000-9300 Calculates the display's final scores as separate performances against rail timetable operation and road traffic delay and also shows overall performance. 9500-9990 Demonstration mode routine. To open the gates: At the start, LOCK=0 (gate lever), KL=1 (King lever), L(n) to L(14)=1 (the signal lever locks are all set to 1). Pull off CO Open Gates. LOCK=1 Pull of KL KL=0 Signal lever can now be pulled off (L(1), etc. = 0) To shut the gates: All the signal levers must be reset to ON L(n) to L(14)=1 Set on KL KL=1 Set on CO Close Gates LOCK=0 LOCK KL L ---- ---- ---- 0 1 1 start - gates closed 1 1 1 open gates 1 0 1 pull King lever 1 0 0 set signals 1 0 1 reset signals 1 1 1 reset King lever 0 1 1 close gates -- Another Fine Product transcribed by: Jim Grimwood (jimg@globalnet.co.uk), Weardale, England --