Q$mg0V}b\g+9c RxCkQLAxlsLBSSNHBEGINABGAHEX!BHEXc>CHEXZRES MKSTRGnHEXCONLNqDISARRAY:LNHEXLEAD02BYTE1BYTE2NIBL1NIBL2SPLICEDirREPETEOMOOVE PSPDUPSLODWNFORWDlREVRSDELAYD*OTOxCHNGSPDV+BYTE3c4 D1A0A7CDCA8vC8NGBYTE4HexDecBYTEVALUELCONVERTCONVERT.NIBL`NIBRDUNNSumUNIBLIFUSUMRSUMLBITE1BITE2BITE3MKSTRNGSTRNIBDECNIB DECNIBSUMDECLrLNIBDECRRNIBcomport-SHOWITGOESTOPP#RUNNHOLD(HOLDDP1XmitGloco9RETURNB1bB2B3CONVRT0aMOOVEChgSpeedW INITIALIZE{Chg_speedmainkLOCOpeedGOsubTO6breakspeedupWslowdownroutines Inseparate subprogramsELSEIFIF>AutoRunhj!XDELAY2gD2D3OD32qtopspeedSpdinsideUfinishG subroutineAutoauto. ramp_upCruisedown-printittest1keysubendoY7 RtnToExeciExec. CruiseTime) AutoRunLoop>WaitTimeStopTimeMenuG BreakLoopExit1~ forwardSelecteddefaultA Yincrease9oneQother>revs]atzbottomX1uET4UKhowscancodes  uppercase lettersQ extendedcodeHellFreezesOverIatementsAddBYTE1.BYTE2.BYTE3.BYTE4D versionHVersion1) AutomaticcontrolProgramcontWstmtsdon statement]esleIFmodelocates`sKeyIsPressedHellFreezesOver TheSkeyIsPressed sKeyIsPressedmanualRampingNof%cycle:Clean statementsgDetectorSensesTrain Detector SensesTrain SensorBlockeddummydetectXsensorcanumbersspd Cmd GetLocoNum AutoCircle Nce5 ManualModemTitlej ManualRun<MoveAove^BAS eachRINTWSpd2Spd1d CtrReplacePvariable AutoPntToPnt# Nope countereCntrt WestboundRevCmd2Ct1[ Sp1uSp2Sp3 Cmd1ends operationS workspoorly5 GetLocomotiveNumber q subs above LocoNum no_ chgs Modify fixesL scrolling problem BreakAutoCirclej contrl BreakAutoPoint< spsw spcs> Cmd3 Key portA LOOP1 T1H Eastbd Westbd GONE Repl Both sensors blocked Fwd sleep1X sp fwdTHEN Cnt1 Cnt2 sleepsstops* duringHave{ workingcpu% GOTOcomport& GetPort Tower1Laptop front askv use correct TestEyesu BreakTestEyes stay test eyes msg@ when e, pt pt.1 rampsinstantaneously Como xTopSpeed PointSpeed` PtStopTimeJ StopTimePt> TopSpdPt locate5 Eastboundg TopSptPtS start StartEast5 ver4 jumpY into east starting gt pin Iin StartPtToPtJ KM v In1 In2 STopSpdPt3limiter EastSensor EastSensr WestSensr EastSensrIFQ NewVars# New VarsNewSpeedadjusttopa Timebackl routine NewSettings,Try schangeqsettingsF does work guessing WestSnsr EastSnsr StartRETURNAutoPt StopWait'DirNew OCATE  StopStarty StartInitGOSUBStartInitp tartInitr[ ChgPtToPtSettingsx NewPtToPtSettingsInIF only are#PtPt^minor TopSpdCir StopTimeCir CLSLOCATE BreakPnToPnt THENLOCATE BreakCirclePntToPnt=ChgCircleSettings THENGOSUBPnt AutomaticdZNceSLEEPN TimePntCruise TimePtCruisewprintStopTimePtpast SpdCirTop TimeCirCruise TimeCirStopSpdPtTop TimePtStop GetLocoNumbernamesOfrfred6THENSensorBlockedjWSensorBlockedYESensorBlockedzibitEKeyEYxmit2-xmit2bxmit2a_c1'Removecomments< GetLocoNumabytesfromhexHdecimalFwdSpddHexDecB1HexDecB2insertcommands NceFunctionsXmitFnctXmitfentersparseds4Ncef4Sf4NcequittingmessageB3fBYTE3fso functionswiththenKeynDmRNLOC24d.BAS, 07-18-01 / ver 24d: add code to ring bell automaticallyy> ver 24c: change code so functions work with any loco numberQ ver 24b: hardcode functions 0,1,2;Move quitting message from line 11 to line 550 ver 24a: Clean up to insert function commands# ver 23j: Remove version commentss L=6Sensors & Printer: Sharing same 25 pin parallel portLNCE & Mouse: Using 9 pin RS232 Serial ports (Com ports) (Mouse #1, NCE #2) Initialized yd d 8Circle settingsd d d Nssd sdPoint to Point settingssm/Turn 486's num lock key OFF, then press RETURN " * sd sdm.Return for Com1 (Laptop) or 2 for Com2 (Tower)  m2"a+%Tower-uses com port #2 (9 pin, mouse/NCE)p(m"COM2:9600,N,8,1,BIN,RS,DS0,CD0,CS0d (sd sdmOpened Com2(Tower) "e(=None of above = run manual mMLaptop-uses com port #12(m"COM1:9600,N,8,1,BIN,RS,DS0,CD0,CS0d (sd sdmOpened Com1(Laptop) e(>None of above = run manualI(None of above = run manual(ssdsdmERROR- ' m'is invalid Com Port #[* Pgy S 7Assign PORT to printer port input byte ?inp(port)&128ued e- +"key 18 = 'x' key (scan code 45,pg 340)  "%"per pg 236: 45=scan code for x key;Yg"Space bar=get loco number  L= !Executive Program =8 E=sdsd m0AUTOMATIC TRAIN CONTROL PROGRAM (By Fred Cupp) ( se sdm&11 b=bell, h=horn, l=lights, o=all offm=12 |--------------------------------------------------------|"m= | MENU (EXECUTIVE) 'q' to quit program |"m= | Space Bar to enter new loco # (t = sensor test) |"m= | Arrows: Up/Down = Speed Up/Down, -> & <- = forward/rev |"m= | p = Pnt To Pnt Automatic | c = Circle Mode |"m= | s = Chg Pnt To Pnt Settings | d = Chg Circle Settings |"m= | \--start Pnt to Pnt w/train blocking a sensor |"m=19 |----------------------------|---------------------------|"C'PRINT "20 (NCE Subroutine writes following lines) "; version$" L mq"G" -q to exitm(sese6m{ Key$=| L m|}..( L m "a 4Yg-Space bar=get loco number ( L mb"M Y4bell & light onS( L mh"M Y4horn & light onS( L ml"MT Y4light on, others off( L mo"M Y4all functions off( L mc"M Yu4Ramp up & down in circle( L md"M Y 9new speed & time( L mp"M( Y 2Ramp up & down, pt. to pt.( L ms"MB YF ( L mt"M Yj 0Test light sensitive detectors(I -None of above = run manual4sdm'4 Exec: Manual Run Mode - Speed Step = " e#m-"4 L -d a -2 chars=arrow pressed @sdeO -clear old msgs from auto loops@ L dB -isolate right charactero@ eM] -right arrow = forward@ eK] : -left arrow = reverseo@ eH]2 d -up arrow = increase speed@ eP]r dw -down arrow = decrease speed@Y-send command to NCE4P(P( (  L -#Read keybd; <- = ^K, -> = ^M, ^ = ^H, v= ^P-7 need above to reset Key$ after return from auto. subyb0 \sdsem ## Exiting program (Key$=| L m|) ==========>>"N =8 E=9Send new function command packet to NCE command stationoJ' Byte3 is the hex of the value of the following bits that are turned on5' 128 64 32 16  8  4  2  1 <--decimal valuest?' 1 0 0 0  4  3  2  1 <-- 0,4,3,2,1 are functionse0' 1 0 0 Lite Dy Brk Cplr Horn Bell!/!'  0 4321 <--functions 0 thru 4 bit positioni L mb"]je S5!'B3=1001 0001=h91=d145 bell & lights on, others offo L mh"]e S5!'B3=1001 0010=h92=d146 horn & lights on, others offo L mo"] e S)!'B3=1000 0=h80=d128 all functions off, L ml"]Xe S-!'B3=1001 0=h90=d144 lights on, others off  S Z  y Sy V V  mS C05"m " m " m " Zm "   d }  sd!sdm38 {.B1...B2...B3f..CK..|.BYTE1.BYTE2.BYTE3f.BYTE4.}" m9 {"   S Vm| m.... m.... Zm.... m....}" m10 { Xmit String=' m' }"o L= =8 E=g- Outputs: B1 & B2 (dec), Byte1$ Byte2$ (hex)=e` eP : d / Speed range = 0-14= sd sdm42 GetLoco: {Enter Loco Cab Number.(Return = 452)....  m]m0452 &erie lackawanna #0452R mu"]6m1862 'union pacific #1862R md"]jm2316 'd&h u23 #2316 1 mh"]m3333 'd&h c628 # 3 mq"][ -d_]d [g Z   -dc]m0"  [ d , " separate 2 hex bytes. d B  d,  dB (C PRINT LNHEX$; " "; BYTE1$; " "; BYTE2$; " "; NIBL1$; " "; NIBL2$ Pad loco number with 'C000' m0"]mC" [ m1"] mD" [ m2"]<mE" $   ! put byte back together"@Convert Byte1$ Byte2$ (hex) (via Sum) to B1 & B2 (dec) for Xor  Y    Y   Y/send command packet to NCE to print direction C'  = = = = = = = = = = = = = = = = = = =''Print values to screenr se m 20 {lnhex$=" m byte1$/byte2$=" m " P temporary check on bytes. sd sdeO sd sdm2 GetLoco: {..Cab # = '" m'..}o L=:Send new speed/dir command packet to NCE command station dc]d %Limits Spd range = 0 to 14 e_]e , da$%Limits Sp2 range = 0, 2 to 15 ,d W I^, d W#%Adds 1 to adjust around emer.stop P%%(emer. stop =1; need to avoid this)m*  = = = = = = = = = = = = = = = = = = =:  This section sends the command to the command station  W       y y V V  mQ m " m " m "   d } C'  = = = = = = = = = = = = = = = = = = =''Print values to screen sd sd  ]>m+3 NCE: Direction= Forward --> , Speed Step="   :]m+3 NCE: Direction= <--Reverse , Speed Step="  sesdm221 {.B1...B2...B3..CK..|.BYTE1.BYTE2.BYTE3.BYTE4.} m22 {    Vm| m.... m.... m.... m....}" m23 { Xmit String=' m' }"o L=rFThis subroutine converts hex bytes to decimal.' Data to be converted Genters as BYTE$, is parsed to left and right characters, converted tov 8hex by "brute force" lookup, then combined as decimal. Data is returned as SUM.@ d, ( (NIB$ IS VALUE TO CONVERT.)@ dB   * let's decimalize the left nibble first.@ mA"]d) [@ mB"]$e [@ mC"]Fe [@ mD"]he [@ mE"]e [@ mF"]e [@ Z " this does the digits 0-9i ep &! adjust for weight of left hex char. " now decimalize the right nibble@  mA"]`d) [@  mB"]e [@  mC"]e [@  mD"]e [@  mE"]e [@  mF"] e [@  Z " this does the digits 0-9g2 B now we will put the nibbles back together as a decimal value  @    o L=(  Automatic Run Point To Pointse sdm=12 |--------------------------------------------------------|"m= | MENU (POINT TO POINT) |"m= | |"m= | 'x' to Stop & Return to Manual Control |"m= | (use 'f' key on Fred's cmptr, while stopped) |"m= | |"m= | Stop so one sensor is blocked (do not stop in middle) |"m=19 |--------------------------------------------------------|"e)( e)+1x key breaks to manual ctl(sdm4 <- PntToPnt Mode ->e((sdsem (Top Speed=" m ) (Stop Time="( m) (Cruise Time=" Nm)"FD '''until 'x' key is pressed to break back to Exec & Manual control(sdse= d m (5) Cnt2 = -W Snsr ' - Test if West sensor is blockeds(d !reset sensor (0=false, -1=true)s( L mw"]%dx (1special, use w key to FAKE W snsr blkd( S !ene]F%dx  @W snsr blkd ( a%"W snsr blkd,bit 7=1: *1* 14sdeOsdsd4m6 |<|< At West Sensor4 Y 5change dir to East(P-E Snsr ' - Test if east sensor is blockeds(d !reset sensor (0=false, -1=true)s( L me"]&dx (1special, use e key to FAKE E snsr blkd( S !e@nd]&dx  =E snsr blkd( ah'#E snsr blkd,bit 6=0: 1*0* 14sdeOsdsd4m6"e7mAt East Sensor >|>|"4 : Y 5change dir to West(P)Waiting '' - Waiting for Sensor Inputo(sdsdeOsdsd(m;7 (3) Waiting to detect a Sensor blocked (w or e key)"(  L -#Read keybd; <- = ^K, -> = ^M, ^ = ^H, v= ^PEb#M= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ==.  d_a*.' RAMP DOWN (ramp down if engine is moving)(mb" L Y*bell & light onF(  ddxW). = RAMP DOWN4sdsdeOsdsd4m7"em(4) Ramping Down, Speed Step=" mof e4Yd{ .send new command packet to NCE( f(ml" L Y *light on( ' - STOPPED( d V*4  wd ]mh" L YGhorn & light4  wd ]ml" L Y Ghorn off4  wd]mh" L YGhorn & light4sdsdeOsdsd4m7"e-m(5) Stopped; (StopTime=" mof m)"<  L #(Read keybd (Fred's computer only)o< L mf"]*Y 5use for Fred's keyboardL4d{( f(ml" L Y *light onP)' - RAMP UP (Chg direction & ramp up)e sdsdeOsdsd  ]~+m6"e2mEastbound (Forward) ====>"  :]+m6"d)m<==== Westbound (Reverse)" d V, 0 = RAMP UPP(sdsdeOsdsd(m7 (1) Ramping Up, Speed Step=" mof (Yd {!'send new command packet to NCE f ' - CRUISE- d NV4- 2 = CRUISE(sdsdeOsdsd(m7"em(2) Cruising; time mof N(d{ f0 'LOCATE 7, 1: PRINT SPC(79); '' Clear linem L /'reset or else keeps faking sensor activationsoM= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ==`/ sdsdeOeO#:break to Exec. when x key presseded Ym L [)init Key$ to manual CntlM= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =e02F d Ysdsd4stop loco for new var's mPtToPt Top Speed=" mEnter New One or Return to keep"  sdsd d_]/   mPtToPt Stop Time=" m!Enter New One or Return to keep.."  d_] 0   mPtToPt Cruise Time=" Nm!Enter New One or Return to keep.."  d_]~0  N sdsdeOeOeO @clear lines9o =8 E=B'''  ELSEIF Key$ = "b" THEN GOSUB NceFunctions 'bell & light onB'''  ELSEIF Key$ = "h" THEN GOSUB NceFunctions 'horn & light onG'''  ELSEIF Key$ = "l" THEN GOSUB NceFunctions 'light on, others off N->->"m (Top Speed= ym) (Cruise Time=" m ) (Stop Time=" m)" F? '''until 'x' key is pressed to break to Exec & Manual controln(sdse= d m (5) Cnt2 = ( ' - RAMP UP( d yVF6 4 = RAMP UP4YsdsdeOsdsd4m6 (1) Ramping Up, Speed Step=" mof yd4d{was 4 ( f( ' - CRUISE-( d V7 6 = CRUISE4sdsdeOsdsd4m6"d)m(2) Cruising; time mof m(speed m)"4d{( f$( ' - FIND SENSOR(d 0reset sensor (0=false) use -1=true to get past( G8(%cruise until sensor blocked (true= -1)4sdsdeOsdsd4m6"e#m)(3) Waiting to detect West Sensor (w key)"4 S !ene]N8dx BW snsr blkd,bit 7=1: *1* 14 mw"]8dx "5FAKE W snsr blkd,bit 7=1: *1* 1(bh7( ' - RAMP DOWN(mb" L Y*bell & light onF(  yddxW94 = RAMP DOWN4YsdsdeOsdsd4m6"e(m(4) Ramping Down, Speed Step=" mof ye4d {was 4( f(ml" L Y *light on( ' - STOPPED( d Vd;4  wd ]mh" L YHhorn & light4  wd ]ml" L Y Hhorn off4  wd]mh" L YHhorn & light4sdsdeOsdsd4m6"e2m(5) Stopped; time" mof <  L ' Read keybd - for Fred's computer onlyf< L mf"]R;Y 4use for Fred's keyboardf4d{( f(ml" L Y *light onb5M= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =0= sdsdeOeO#:break to Exec. when x key presseddd Ym L [)init Key$ to manual CntlM= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =sZA d Ysdsd4stop loco for new var's mCircle Top Speed=" ymEnter New One or Return to keep"  d_]|=  ysdsdmCircle Cruise Time=" mEnter New One or Return to keep"  d_]=  sd!sdmCircle Stop Time=" m!Enter New One or Return to keep.."  d_]j>  sdsdeOsdsdeOeO Lclear lineso L=G  +---Decimal value of INPUT BYTE BEING READ  by ?inp(port) command=D  | Wst-| |---East Sensor (west snsr is bit 7, east is bit 6)11  | | 7 | 6 | 5| 4|3|2|1|0| Bit Position t;2  | |128| 64|32|16|8|4|2|1| Decimal Value Of Each Biti  | |---|---|--|--|-|-|-|-|53*  127 | 0 | 1 | 1| 1|1|1|1|1| Both sensors clearcK5*  --- |*1*| 0 | 0| 0|0|0|0|0| West (Left) sensor blocked AND 128 = 128=I7*  --- | 0 |*0*| 0| 0|0|0|0|0| East (Right) sensor blocked AND 64 = 02 L=Cj @ Verify computer reads light detectors ('s' key breaks to Exec)e)(v e)+-x key breaks to manual ctlFC'''until 'x key is pressed to break back to Exec & Manual controlssd sdm*============= Testing Eyes =============== S !ene]HBsdsdmWest (Left) Sensor Blocked S !e@nd]Bse semEast (Right) Sensor Blocked"bpAv m " L ['rewrite loco number info   L=UNUSED CODE: L= L='xmit2$ = "S C05 C1 C4 82 87" 'xmit2a$ = "S C05 C1 C4 90 95" 'xmit2b$ = "S C05 C1 C4 80 85"'PRINT #2, xmit2a$'PRINT #2, xmit2b$"'ck = c1 XOR c4 XOR 80: PRINT ck%'ck = 193 XOR 196 XOR 130: PRINT ck g