;   ->  GPWS Custom Module V4.0beta  by Wilco van Deijl (puk_muk@knoware.nl)
;   ->  YOU CAN ADD THIS FILE AS CUSTOM MODULE TO A FLIGHTSHOP ATC ADVENTURE

gpws:
DECLARE init
IF init=0 THEN
init=1
DECLARE aa,adf,alt,alt0,ap,armed,armed0,atc,break,cat,com,crs,dh,dist,dist0
DECLARE dist1,fk,fma,gear,gpws,gs,hdg,hdgalt,ias,ias0,info,inh,keys,land
DECLARE landtest,lastcall,loc,nav1,nav2,pitch,pitch0,prt,ra,ra0,ra1,rdkeys
DECLARE roll,roll0,shift,time,time0,time1,trim,vs,warning,x0,x1,x2

gpws=2                       ;GPWS: on        (0=off,1=alt,2=on)
fma=2                        ;FMA: auto+      (0=man,1=auto,2=auto+)
fk=57                        ;FMA-key: Space  (0=off,57=Spacebar,83=Delete)
rdkeys=2                     ;RD-keys: Shift  (0=off,1=swap,2=Shift,3=normal)
hdgalt=1                     ;HDG/ALT: keypad (0=off,1=keypad)
land=1                       ;LAND: on        (0=off,1=on)
cat=3                        ;CAT-C           (1=A,2=B,3=C,4=D)
atc=1                        ;ATC ON
com=122.2                    ;default standby COM frequency
gear=10                      ;default RA correction for gear height (ft)
info=1                       ;default waypoint info on
prt=3                        ;default minimum print time
PRINT_TIME prt
ADV_KEYS ADD,83,287,288
ONKEY 288 GOSUB dh           ;Shift-d
ONKEY 287 GOSUB setup        ;Shift-s
ONKEY 11                     ;(enables key 0 with dual-player option)
GOSUB advkeys
ONSTALL GOSUB stickshaker
trim=ELEVATOR_TRIM_POSITION

DECLARE xVOR_1_GLIDE_SLOPE   ; -> DELETE THESE LINES IF YOU'VE GOT AN UPDATED
xVOR_1_GLIDE_SLOPE=3         ; -> VERSION OF FLIGHTSHOP AND DELETE THE 'x' OF
                             ; -> ALL THE xVOR_1_GLIDE_SLOPE VARIABLES IN THE
                             ; -> REST OF THIS PROGRAM
ENDIF

gpws_1:
    GOSUB apdisc_trim
    ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear           ;Radio Altitude
    vs=VELOCITY_Y*196.8                               ;Vertical Speed
    ias=VELOCITY_INDICATED                            ;Indicated Airspeed 
    IF ON_GROUND THEN
        GOSUB on_gnd
        IF ias>ias0 AND ias0>30 THEN
            IF NOT INRANGE(ELEVATOR_TRIM_POSITION,-8000,8000) OR FLAPS_LEFT_POSITION>25000 OR PARKING_BRAKES THEN
                PLAY "-towarn.wav"                        ;take-off config
                WAIT 1
                warning=1
                GOTO gpws_1
            ENDIF
        ENDIF
        ias0=ias
    ELSEIF INRANGE(ra,-30,2450) THEN
        IF ias0-ias>9 AND INRANGE(ias,1,170) AND PLANE_PITCH<25 AND ra<1500 AND (WIND_SURF_VEL>10 OR WIND_LOW_VEL>10) THEN 
            IF (INRANGE((WIND_SURF_DEPTH-PLANE_ALT),-50,50) OR INRANGE((WIND_LOW_BASE-PLANE_ALT),50,50)) AND gpws=2 THEN
                PLAY "-windshr.wav"                   ;mode7
                WAIT 1
                warning=1
                ias0=ias
                GOTO gpws_1
            ENDIF
        ENDIF
        ias0=ias
        IF vs<100 THEN
            IF ra<65 AND gpws>0 THEN                             
                GOTO flare                            ;mode6
            ELSEIF ra<1000 THEN
                IF vs<-1.8*ra-1400 AND gpws=2 THEN                  
                    IF vs<-1.2*ra-2000 THEN           
                        PLAY "-terrnpu.wav"           ;mode2
                    ELSE
                        PLAY "-snkrtpu.wav"           ;mode1
                    ENDIF                      
                    WAIT 2              
                    warning=1
                    GOTO gpws_1
                ELSEIF GEAR_3_POSITION=0 AND ra1=0 AND inh<3 AND gpws=2 THEN
                    IF ra<500 AND VELOCITY_INDICATED<190 THEN
                        PLAY "-gear.wav"              ;mode4a
                        WAIT 2
                        warning=1
                        GOTO gpws_1
                    ELSEIF VELOCITY_INDICATED>0.12*ra+130 THEN
                        PLAY "-toolowt.wav"
                        WAIT 2
                        warning=1
                        GOTO gpws_1
                    ENDIF
                ELSEIF FLAPS_LEFT_POSITION<20000 AND ra1=0 AND inh<2 AND gpws=2 THEN
                    IF ra<245 AND VELOCITY_INDICATED<160 THEN
                        PLAY "-flaps.wav"             ;mode4b (flaps<20)
                        WAIT 2
                        warning=1
                        GOTO gpws_1
                    ELSEIF VELOCITY_INDICATED>0.12*ra+130 THEN
                        PLAY "-toolowt.wav"
                        WAIT 2
                        warning=1
                        GOTO gpws_1
                    ENDIF
                ENDIF
                IF ra<110 THEN                        
                    IF lastcall!=100 THEN
                        IF dh!=100 AND gpws>0 THEN
                            PLAY "-100.wav"           ;mode6
                        ELSEIF gpws>0 THEN
                            PLAY "-min.wav"
                        ENDIF 
                        lastcall=100    
                    ENDIF 
                    IF vs<-1.6*ra-1000 AND gpws=2 THEN                     
                        PLAY "-snkrate.wav"           ;mode1
                        WAIT 1     
                    ELSEIF ra1>1 AND ra1-ra>ra/10 AND gpws=2 THEN
                        PLAY "-dontsnk.wav"           ;mode3
                        WAIT 1
                    ENDIF
                    GOTO gpws_1
                ELSEIF NOT INRANGE(ra,lastcall-90,lastcall+10) THEN
                    IF INRANGE(ra,160,210) THEN
                        IF dh!=200 AND gpws>0 THEN
                            PLAY "-200.wav"           ;mode6
                        ELSEIF gpws>0 THEN
                            PLAY "-min.wav"
                        ENDIF
                    ELSEIF INRANGE(ra,450,510) AND gpws>0 THEN
                        PLAY "-500.wav"               ;mode6
                    ENDIF                             
                    lastcall=((ra+90) IDIV 100)*100   ;autoland test <1000ft
                    GOTO land_arm                     ;   at 100ft intervals
                ELSEIF ra<210 THEN
                    GOSUB gpws_2
                    GOTO gpws_1
                ELSEIF ra<610 THEN
                    GOSUB gpws_2
                    GOSUB fma_change
                    GOSUB ap_trim
                    GOTO gpws_1
                ENDIF                                 
            ELSEIF vs<-2.5*ra-1000 AND gpws=2 THEN    ;ra>1000ft
                IF vs<-5.2*ra+2800 THEN               
                    PLAY "-terrnpu.wav"               ;mode2
                ELSE
                    PLAY "-snkrtpu.wav"               ;mode1
                ENDIF                      
                WAIT 2              
                warning=1
                GOTO gpws_1
            ENDIF
            GOSUB gpws_2
        ELSEIF ra<245 AND (GEAR_3_POSITION=0 OR FLAPS_LEFT_POSITION<20000) THEN  
            ra1=1  ;mode3 arm (take-off / go-around<245ft & gear/flaps raised)
        ENDIF
    ENDIF
    GOSUB fma_change
    IF warning=1 THEN
        warning=0
        GOTO gpws_1
    ELSEIF OVERSPEED_WARNING THEN
        PLAY "-clacker.wav"
        WAIT .5
        GOTO gpws_1
    ENDIF
    GOSUB ap_trim
RETURN

gpws_2:
    IF vs<-1.6*ra-1000 AND gpws=2 THEN                ;ra<2450ft
        PLAY "-snkrate.wav"                           ;mode1
        warning=1
        WAIT 2
    ELSEIF ra1>0 THEN                                 ;mode3
        IF ra>1333 OR (ra>700 AND VELOCITY_INDICATED<190) OR (GEAR_3_POSITION=32767 AND FLAPS_LEFT_POSITION>20000) THEN
            ra1=0                                     ;mode3 disarm
        ELSEIF ra>ra1 THEN
            ra1=ra
        ELSEIF ra1-ra>ra/10 AND gpws=2 THEN
            PLAY "-dontsnk.wav"
            warning=1
            WAIT 2
        ENDIF 
    ELSEIF VOR_1_GS_AVAIL AND ra<1500 THEN            ;mode5
        dist=GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)     ;distance to loc antenna
        ra=PLANE_ALT-VOR_1_ALT                        ;alt above loc antenna
        IF gs<5 THEN                                  ;if not 5x on g/p: reset
            IF NOT INRANGE((ra0-ra)/(dist0-dist),29.1*xVOR_1_GLIDE_SLOPE,35.6*xVOR_1_GLIDE_SLOPE) THEN
                gs=0                                  ;glide path 2.7-3.3
                dist0=dist
                ra0=ra
                RETURN
            ELSEIF gs=4 THEN
                GOSUB gs_crs
                IF INRANGE(crs,-1,1) AND GLIDE_SLOPE(VOR_1_LAT,VOR_1_LON)<xVOR_1_GLIDE_SLOPE AND inh=0 AND gpws=2 THEN
                    PLAY "-ss2.WAV"
                    PLAY "-ss2.WAV"                   ;mode5 armed
                    loc=VOR_1_LOCALIZER
                ELSE
                    ra0=0                             ;g/p not valid
                ENDIF
            ENDIF
            gs=gs+1
        ELSEIF ra>ra0 OR loc!=VOR_1_LOCALIZER THEN
            gs=0
            ra0=0
        ELSEIF ra<(ra0*.278-(dist0-dist)*27)*xVOR_1_GLIDE_SLOPE AND ra<305 THEN
            GOSUB gs_crs
            IF INRANGE(crs,-30,30) AND dist<10 AND inh=0 AND gpws=2 THEN
                PLAY "-gs.wav"                        ;0.5degree below g/p
                warning=1
                WAIT 1
            ENDIF
        ENDIF
    ELSE                                              
        ra0=0                                         ;mode5 reset
    ENDIF
RETURN
gs_crs:
    crs=VOR_1_LOCALIZER-VOR_1_RADIAL+180
    IF crs>180 THEN                                
        crs=crs-360                               
    ENDIF
RETURN

advkeys:
    ADV_KEYS DELETE,57,583,584,585,587,588,589,591,592,593
    ADV_KEYS DELETE,shift+20,shift+30,shift+46,shift+49,shift+50
    ONKEY 57
    ONKEY 83
    ONKEY 583
    ONKEY 584
    ONKEY 585
    ONKEY 587
    ONKEY 588
    ONKEY 589
    ONKEY 591
    ONKEY 592
    ONKEY 593
    ONKEY shift+20
    ONKEY shift+30
    ONKEY shift+46
    ONKEY shift+49
    ONKEY shift+50
    IF fk>0 THEN
        ADV_KEYS ADD,fk
        ONKEY fk GOSUB fma             ;Space/Delete
    ENDIF
    IF hdgalt=1 THEN
        ADV_KEYS ADD,583,584,585,587,588,589,591,592,593
        ONKEY 583 GOSUB hdg            ;Ctrl-KeyPad7
        ONKEY 587 GOSUB hdg_l10        ;Ctrl-KeyPad4      
        ONKEY 589 GOSUB hdg_r10        ;Ctrl-KeyPad6       
        ONKEY 591 GOSUB hdg_l1         ;Ctrl-KeyPad1    
        ONKEY 593 GOSUB hdg_r1         ;Ctrl-KeyPad3     
        ONKEY 585 GOSUB alt            ;Ctrl-KeyPad9
        ONKEY 592 GOSUB alt_dn         ;Ctrl-KeyPad2            
        ONKEY 584 GOSUB alt_up         ;Ctrl-KeyPad8             
        ONKEY 588 GOSUB nav_crs        ;Ctrl-KeyPad5
    ENDIF
    IF rdkeys>0 THEN
        shift=256
        IF rdkeys=3 THEN
            shift=0
        ENDIF
        ADV_KEYS ADD,shift+20,shift+30,shift+46,shift+49,shift+50
        ONKEY shift+49 GOSUB nav1      ;(Shift)n
        ONKEY shift+50 GOSUB nav2      ;(Shift)m
        ONKEY shift+30 GOSUB adf       ;(Shift)a
        ONKEY shift+46 GOSUB com       ;(Shift)c
        ONKEY shift+20 GOSUB xpdr      ;(Shift)t
    ENDIF
RETURN

advkeys_reset:                                        ;reset keys
    ADV_KEYS DELETE,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28
    PRINT_TIME prt
    break=1
    ias0=0                            
    trim=ELEVATOR_TRIM_POSITION
    time0=SECOND
    WAIT 0,KEYPRESS
RETURN

alt_alert:
    x0=AUTOPILOT_ALTITUDE-PLANE_ALT
    IF alt0=AUTOPILOT_ALTITUDE THEN      
        IF INRANGE(x0,-230,230) THEN                  ;within 750ft
            IF aa=0 THEN
                IF NOT INRANGE(x0,-75,75) THEN        ;not within 250ft
                    GOSUB alt_arm
                    GOSUB alt_alert2                  
                ENDIF
            ELSEIF aa<3 THEN
                IF AUTOPILOT_MASTER AND fma=2 THEN
                    IF INRANGE(x0,-6,6) THEN          ;alt hold
                        GOTO alt_hold
                    ELSEIF INRANGE(x0/vs,0,.025) THEN ;alt acq
                        break=2
                        PLAY "-ss1.wav"
                        PRINT
                        PRINT_TIME 20
                        ON roll GOSUB roll0,roll1,roll2,roll3,roll4,roll5,roll6,roll7
                        PRINT "ALT ACQ     ",
                        ON armed GOSUB armed0,armed1,armed2,armed3,armed4,armed5,armed6,armed7
                        break=1
                        GOSUB fma_reset
                        aa=3
                        time0=SECOND
                        time1=60*MINUTE+SECOND
                    ENDIF
                ELSEIF INRANGE(x0,-75,75) THEN        ;within 250ft
                    aa=0
                ENDIF
            ELSE                                      ;aa=3
                time=60*MINUTE+SECOND-time1
                IF time<0 THEN
                    time=time+3600
                ENDIF
                IF time>18 OR (NOT INRANGE(x0,-75,75) AND x0/vs<0) THEN
                    aa=0                              ;reset >18s or exit
                ELSEIF INRANGE(x0,-6,6) THEN          ;alt hold
                    GOTO alt_hold
                ENDIF
            ENDIF
        ELSEIF aa>0 THEN
            IF aa>1 THEN                              ;exit alert
                GOSUB alt_alert2
            ENDIF
            aa=0
        ENDIF
    ELSEIF alt0=-AUTOPILOT_ALTITUDE THEN
        alt0=-alt0
        IF INRANGE(x0,-230,-75) OR INRANGE(x0,75,230) THEN 
            GOSUB alt_arm                             ;no alert
        ELSE
            aa=0
        ENDIF
    ELSE
        alt0=-AUTOPILOT_ALTITUDE                      ;delay
    ENDIF
RETURN

alt_alert2:
    IF GEAR_3_POSITION=0 AND FLAPS_LEFT_POSITION<20000 THEN
        PLAY "-altalrt.wav"
        IF fma=2 THEN
            break=0
            FOR x0=1 TO 5
                PRINT "ALT ALERT"
                WAIT .4
                IF break>0 THEN
                    RETURN
                ENDIF
                PRINT " "
                WAIT .4
                IF break>0 THEN
                    RETURN
                ENDIF
            NEXT x0
            PRINT "ALT ALERT"
            WAIT .4
            IF break=0 THEN
                PRINT
            ENDIF
        ENDIF
    ENDIF
RETURN

alt_arm:
    IF x0/vs<0 THEN                                   ;exit from 250ft:                 
        aa=1                                          ;arm acq 
    ELSE                                              ;entry within 750ft:
        aa=2                                          ;arm acq + exit warn
    ENDIF
RETURN

alt_hold:
    aa=0
    break=2
    PLAY "-ss1.wav"
    PRINT
    PRINT_TIME prt
    ON roll GOSUB roll0,roll1,roll2,roll3,roll4,roll5,roll6,roll7
    PRINT "ALT HOLD    ",
    ON armed GOSUB armed0,armed1,armed2,armed3,armed4,armed5,armed6,armed7
    break=1
    GOSUB fma_reset
    time0=SECOND
RETURN

ap_trim:
    IF ap=1 AND NOT INRANGE(trim-ELEVATOR_TRIM_POSITION,-1248,1248) THEN
        PLAY "-trim2.wav"
        trim=ELEVATOR_TRIM_POSITION
    ENDIF
RETURN

apdisc_trim:                                          ;ap disconnect / trim
    IF AUTOPILOT_MASTER=0 THEN
        IF ap=1 THEN
            PLAY "-apdisco.wav"
            trim=ELEVATOR_TRIM_POSITION
            ap=0
        ELSEIF trim!=ELEVATOR_TRIM_POSITION THEN
            IF INRANGE(trim-ELEVATOR_TRIM_POSITION,-32,32) THEN
                PLAY "-trim1.wav"
            ELSE
                PLAY "-trim2.wav"
            ENDIF
            trim=ELEVATOR_TRIM_POSITION
        ENDIF
    ELSE
        ap=1
    ENDIF
RETURN

crs:
    IF crs>360 THEN
        crs=crs-360
    ELSEIF crs<1 THEN
        crs=crs+360
    ENDIF
RETURN

flare:                                                ;mode6 ra<60ft
    ON (45-ra) IDIV 10 GOTO forty,thirty,twenty,ten,zero
    WHILE ra>54
        IF ra>75 OR ON_GROUND THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF dh!=50 THEN
        PLAY "-50.wav"
    ELSE
        PLAY "-min.wav"
    ENDIF
    forty:
    WHILE ra>44
        IF ra>70 OR ON_GROUND THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    PLAY "-40.wav"
    thirty:
    WHILE ra>34
        IF ra>60 OR ON_GROUND THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    PLAY "-30.wav"
    twenty:
    WHILE ra>23
        IF ra>50 OR ON_GROUND THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF dh!=20 THEN
        PLAY "-20.wav"
    ELSE
        PLAY "-min.wav"
    ENDIF
    ten:
    WHILE ra>13
        IF ra>40 OR ON_GROUND THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    PLAY "-10.wav"
    zero:
    WHILE NOT ON_GROUND
        IF NOT INRANGE(ra,-30,30) THEN
            GOTO flare_end
        ENDIF
        GOSUB apdisc_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    time=0
    time0=SECOND
    WHILE time<6 AND ra<30
        GOSUB apdisc_trim
        GOSUB on_gnd
        GOSUB time
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
flare_end:
    ias0=0
    lastcall=0
    GOSUB fma_mode
    GOSUB fma_reset
    trim=ELEVATOR_TRIM_POSITION
GOTO gpws_1

fma:                                                  
    WAIT 0,KEYPRESS
    IF break>1 THEN
        IF break=3 THEN
            PLAY "-ss1.wav"
            WAIT .5,KEYPRESS
            IF KEY=fk THEN
                GOTO ra
            ENDIF
            IF ra>50 THEN
                PRINT "LAND      flare armed"
            ELSE
                PRINT "LAND      FLARE"
            ENDIF
        ENDIF
        RETURN
    ENDIF
    PLAY "-ss1.wav"
    PRINT
    PRINT_TIME prt*2
    fma_2:
    GOSUB fma_mode
    WAIT 0
    IF KEY=fk THEN
        GOTO ra
    ENDIF
    ON roll GOSUB roll0,roll1,roll2,roll3,roll4,roll5,roll6,roll7
    ON pitch GOSUB pitch0,pitch1,pitch2,pitch3
    ON armed GOSUB armed0,armed1,armed2,armed3,armed4,armed5,armed6,armed7
    PRINT_TIME prt
    GOSUB fma_reset
    break=1
    time0=SECOND
    WAIT 0,KEYPRESS
RETURN

fma_change:
    break=0
    GOSUB fma_mode
    IF pitch=1 THEN
        GOSUB alt_alert
    ENDIF 
    IF roll!=roll0 OR pitch!=pitch0 OR armed!=armed0 THEN
        IF break=1 THEN
            GOTO fma_change
        ELSEIF AUTOPILOT_MASTER AND fma>0 THEN
            break=2
            PLAY "-ss1.wav"
            PRINT
            PRINT_TIME prt*2
            ON roll GOSUB roll0,roll1,roll2,roll3,roll4,roll5,roll6,roll7
            ON pitch GOSUB pitch0,pitch1,pitch2,pitch3
            ON armed GOSUB armed0,armed1,armed2,armed3,armed4,armed5,armed6,armed7
            PRINT_TIME prt
            time0=SECOND
        ENDIF
        GOSUB fma_reset
        break=0
    ENDIF
RETURN

fma_mode:
    IF AUTOPILOT_ALTITUDE_HOLD THEN
        pitch=1
        IF NOT INRANGE(alt-MTOF(AUTOPILOT_ALTITUDE/100),-1,1) THEN
            alt=(MTOF(AUTOPILOT_ALTITUDE)+50) IDIV 100
            IF fma=2 THEN
                pitch0=0
            ENDIF
        ENDIF
    ELSEIF AUTOPILOT_ATTITUDE_HOLD THEN
        pitch=2
    ELSEIF AUTOPILOT_APPROACH_HOLD THEN
        pitch=3
    ELSE
        pitch=0
    ENDIF
    IF AUTOPILOT_HEADING_HOLD THEN
        GOSUB fma_mode_arm
        IF NOT INRANGE(hdg-AUTOPILOT_HEADING,-1,1) THEN
            hdg=INT(AUTOPILOT_HEADING+.5)
            IF fma=2 THEN
                roll0=0
            ENDIF
        ENDIF
        roll=1
    ELSEIF AUTOPILOT_ATTITUDE_HOLD THEN
        roll=2
        GOSUB fma_mode_arm
    ELSEIF AUTOPILOT_WING_LEVELER THEN
        roll=7
        GOSUB fma_mode_arm
    ELSEIF AUTOPILOT_APPROACH_HOLD THEN
        roll=3
        IF pitch!=3 THEN                              
            armed=2                                   
        ELSEIF armed!=1 THEN                          
            armed=0                                   
        ENDIF
    ELSEIF AUTOPILOT_LOCALIZER_HOLD THEN
        roll=4
        armed=0
    ELSEIF AUTOPILOT_BACK_COURSE_HOLD THEN
        roll=5
        armed=0
    ELSEIF AUTOPILOT_NAV_HOLD THEN
        roll=6
        armed=0
    ELSEIF AUTOPILOT_MASTER THEN
        roll=0
        armed=0
    ELSE
        roll=0
        armed=7
    ENDIF
RETURN

fma_mode_arm:
    IF AUTOPILOT_APPROACH_HOLD THEN
        IF pitch=3 THEN                               
            armed=4
        ELSE
            armed=3
        ENDIF
    ELSEIF AUTOPILOT_LOCALIZER_HOLD THEN
        armed=4
    ELSEIF AUTOPILOT_BACK_COURSE_HOLD THEN
        armed=5
    ELSEIF AUTOPILOT_NAV_HOLD THEN
        armed=6
    ELSEIF AUTOPILOT_MASTER THEN
        armed=0
    ELSE
        armed=7
    ENDIF
RETURN

fma_reset:
    roll0=roll
    pitch0=pitch
    armed0=armed
RETURN

on_gnd:                                ;RA correction on gnd of gear height
    IF INRANGE(PLANE_ALT-GROUND_ALTITUDE,0,9) AND ON_GROUND THEN    
         gear=MTOF(PLANE_ALT-GROUND_ALTITUDE)          
    ENDIF
RETURN

ra:
    PLAY "-ss1.wav"
    PRECISION 1,0,0
    PRINT_TIME prt
    PRINT "RA ",MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear,
    IF dh THEN
        PRINT "   DH ",dh
    ELSE
        PRINT " "
    ENDIF
    break=1
    WAIT 0,KEYPRESS
RETURN

stickshaker:
    PLAY "-stkshkr.wav"
    WAIT .5  
    warning=1
RETURN

time:
    time=SECOND-time0
    IF time<0 THEN                                  
        time=time+60
    ENDIF
RETURN

land_arm:                                             ;autoland test
    IF land>0 AND pitch=3 AND roll=3 AND AUTOPILOT_MASTER AND VOR_1_GS_AVAIL AND VOR_1_LOCALIZER_AVAIL THEN
        x0=(ra0-PLANE_ALT+VOR_1_ALT)/(dist0-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON))
        landtest=INRANGE(x0,29.1*xVOR_1_GLIDE_SLOPE,35.6*xVOR_1_GLIDE_SLOPE)
        x0=VOR_1_LOCALIZER-VOR_1_RADIAL+180
        landtest=landtest+INRANGE(x0,-3,3)+INRANGE(x0,357,363)
        x0=COURSE+MAGVAR-VOR_1_LOCALIZER
        landtest=landtest+INRANGE(x0,-3,3)+INRANGE(x0,357,363)+INRANGE(x0,-357,-363)+INRANGE(PLANE_BANK,-3,3)
        IF landtest=4 THEN
            IF armed!=1 AND fma>0 THEN
                PLAY "-ss1.wav"
                IF ra>510 THEN
                    PRINT_TIME prt*2
                ENDIF
                PRINT
                PRINT "APP LOC   APP G/S     land armed"
                PRINT_TIME prt
                armed0=1
            ENDIF
            IF ra<cat*100+111 THEN
                IF fma>0 THEN
                    IF armed!=1 THEN
                        armed=1
                        WAIT 1
                        GOTO land_arm
                    ENDIF
                    PLAY "-ss1.wav"
                    PRINT "LAND      flare armed"
                ENDIF
                GOTO land
            ENDIF
            armed=1
        ELSEIF lastcall=INT(cat*100+100) OR (ra<cat*100+111 AND armed=1) THEN
            IF fma>0 THEN
                PLAY "-ss1.wav"
                PRINT
                PRINT "APP LOC   APP G/S     app only"
                armed0=0
            ENDIF
            armed=0
        ENDIF
    ELSEIF armed=1 THEN
        armed=0
    ENDIF
GOTO gpws_1
land:                                                 ;autoland + mode6
    break=3
    gs=xVOR_1_GLIDE_SLOPE*32.35                       ;glide slope
    x1=VOR_1_LOCALIZER+180                            ;localizer+180
    IF x1>360 THEN                                
        x1=x1-360                               
    ENDIF
    crs=VOR_1_LOCALIZER-MAGVAR                        ;magnetic loc course
    dist1=GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)        ;distance to loc antenna
    ra1=PLANE_ALT+VELOCITY_Y*3.5                      ;maintain initial rate
    AUTOPILOT_ALTITUDE=ra1                            ;           of descent 
    AUTOPILOT_HEADING=PLANE_HEADING                   ;maintain initial hdg
    AUTOPILOT_APPROACH_HOLD=0
    AUTOPILOT_ALTITUDE_HOLD=1
    AUTOPILOT_HEADING_HOLD=1
    dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)    
    AUTOPILOT_ALTITUDE=ra1-dist*gs                    ;follow glide path
    IF lastcall!=200 THEN
        WHILE ra>205
            IF NOT INRANGE(crs+PLANE_HEADING-COURSE+4*(VOR_1_RADIAL-x1),0,360) THEN
                x2=4
                GOSUB land_crs
            ENDIF
            WHILE ra>lastcall-45
                dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
                AUTOPILOT_ALTITUDE=ra1-dist*gs
                AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE+4*(VOR_1_RADIAL-x1)
                IF AUTOPILOT_MASTER=0 OR ra>lastcall+10 OR ON_GROUND THEN
                    lastcall=500
                    GOTO land_end
                ENDIF
                GOSUB ap_trim
                ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
            ENDWHILE
            lastcall=lastcall-50
        ENDWHILE
        IF dh!=200 AND gpws>0 THEN
            PLAY "-200.wav"
        ELSEIF gpws>0 THEN
            PLAY "-min.wav"
        ENDIF
        dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
        AUTOPILOT_ALTITUDE=ra1-dist*gs
    ENDIF
    IF NOT INRANGE(crs+PLANE_HEADING-COURSE+3*(VOR_1_RADIAL-x1),0,360) THEN
        x2=3
        GOSUB land_crs
    ENDIF
    WHILE ra>105
        dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
        AUTOPILOT_ALTITUDE=ra1-dist*gs
        AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE+3*(VOR_1_RADIAL-x1)
        IF AUTOPILOT_MASTER=0 OR ra>210 OR ON_GROUND THEN
            lastcall=200             
            GOTO land_end
        ENDIF
        GOSUB ap_trim
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF dh!=100 AND gpws>0 THEN
        PLAY "-100.wav"
    ELSEIF gpws>0 THEN
        PLAY "-min.wav"
    ENDIF
    dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
    AUTOPILOT_ALTITUDE=ra1-dist*gs
    IF NOT INRANGE(crs+PLANE_HEADING-COURSE+2*(VOR_1_RADIAL-x1),0,360) THEN
        x2=2
        GOSUB land_crs
    ENDIF
    WHILE ra>53
        dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
        AUTOPILOT_ALTITUDE=ra1-dist*gs
        AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE+2*(VOR_1_RADIAL-x1)
        IF AUTOPILOT_MASTER=0 OR ra>110 OR ON_GROUND THEN
            lastcall=100             
            GOTO land_end
        ENDIF
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF dh!=50 AND gpws>0 THEN
        PLAY "-50.wav"
    ELSEIF gpws>0 THEN
        PLAY "-min.wav"
    ENDIF
    x2=YOKE_Y_POSITION
    IF cat>2 THEN
        ra1=GROUND_ALTITUDE+FTOM(gear)+4              ;follow flare path and
        ap=(AUTOPILOT_ALTITUDE-ra1)/54                ;   and correct if the
        vs=VELOCITY_Y/10.8                            ;    vert spd deviates
        WHILE ra>43
            AUTOPILOT_ALTITUDE=ra1+ra*(ap+vs)-5*VELOCITY_Y
            AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE
            IF AUTOPILOT_MASTER=0 OR ra>60 OR ON_GROUND THEN
                lastcall=50             
                GOTO land_end
            ENDIF
            ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
        ENDWHILE
    ELSE
        WHILE ra>43
            dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
            AUTOPILOT_ALTITUDE=ra1-dist*gs
            AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE
            IF AUTOPILOT_MASTER=0 OR ra>60 OR ON_GROUND THEN
                lastcall=50             
                GOTO land_end
            ENDIF
            ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
        ENDWHILE
    ENDIF
    IF gpws>0 THEN
        PLAY "-40.wav"
    ENDIF
    IF cat>1 THEN
        ra1=GROUND_ALTITUDE+FTOM(gear)+4
        IF cat=2 THEN
            ap=(AUTOPILOT_ALTITUDE-ra1)/44
            vs=VELOCITY_Y/8.8
        ENDIF
        WHILE ra>33
            AUTOPILOT_ALTITUDE=ra1+ra*(ap+vs)-5*VELOCITY_Y
            AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE
            IF AUTOPILOT_MASTER=0 OR ra>50 OR ON_GROUND THEN
                lastcall=40             
                GOTO land_end
            ENDIF
            ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
        ENDWHILE
        ra1=GROUND_ALTITUDE+FTOM(gear)+4
    ELSE
        WHILE ra>33
            dist=dist1-GROUND_DISTANCE(VOR_1_LAT,VOR_1_LON)
            AUTOPILOT_ALTITUDE=ra1-dist*gs
            AUTOPILOT_HEADING=crs+PLANE_HEADING-COURSE
            IF AUTOPILOT_MASTER=0 OR ra>50 OR ON_GROUND THEN
                lastcall=40             
                GOTO land_end
            ENDIF
            ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
        ENDWHILE
        ra1=GROUND_ALTITUDE+FTOM(gear)+4
        ap=(AUTOPILOT_ALTITUDE-ra1)/34
        vs=VELOCITY_Y/6.8
    ENDIF
    IF gpws>0 THEN
        PLAY "-30.wav"
    ENDIF
    AUTOPILOT_HEADING_HOLD=0
    AUTOPILOT_WING_LEVELER=1                          ;hold wings level
    WHILE ra>22
        AUTOPILOT_ALTITUDE=ra1+ra*(ap+vs)-5*VELOCITY_Y
        IF AUTOPILOT_MASTER=0 OR ra>40 OR ON_GROUND THEN
            lastcall=30             
            GOTO land_end
        ENDIF
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF dh!=20 AND gpws>0 THEN
        PLAY "-20.wav"
    ELSEIF gpws>0 THEN
        PLAY "-min.wav"
    ENDIF
    ra1=GROUND_ALTITUDE+FTOM(gear)+4
    WHILE ra>12
        AUTOPILOT_ALTITUDE=ra1+ra*(ap+vs)-5*VELOCITY_Y
        IF AUTOPILOT_MASTER=0 OR ra>30 OR ON_GROUND THEN
            lastcall=20             
            GOTO land_end
        ENDIF
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE
    IF gpws>0 THEN
        PLAY "-10.wav"
    ENDIF
    ra1=GROUND_ALTITUDE+FTOM(gear)+4
    WHILE NOT ON_GROUND
        AUTOPILOT_ALTITUDE=ra1+ra*(ap+vs)-5*VELOCITY_Y
        IF AUTOPILOT_MASTER=0 OR NOT INRANGE(ra,-30,20) THEN
            lastcall=10             
            GOTO land_end
        ENDIF
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
    ENDWHILE                                          ;touchdown:wing lvl off
    AUTOPILOT_WING_LEVELER=0                          ;   for manual steering
    ias=999
    ias0=999
    lastcall=0
    time=0
    time0=SECOND
    x1=1
    WHILE ias-ias0<1                                  ;check for go-around
        IF AUTOPILOT_MASTER=0 OR ra>20 OR NOT INRANGE(YOKE_Y_POSITION-x2,-5000,5000) THEN
            GOTO land_end
        ENDIF
        GOSUB on_gnd
        ra=MTOF(PLANE_ALT-GROUND_ALTITUDE)-gear
        GOSUB time
        IF time>x1 THEN                              
            AUTOPILOT_ALTITUDE=GROUND_ALTITUDE        ;after 2sec: nose down
            ias0=ias
            ias=VELOCITY_INDICATED
            x1=x1+2
        ENDIF
    ENDWHILE
land_end:
    PLAY "-apdisco.wav"
    AUTOPILOT_MASTER=0
    AUTOPILOT_ALTITUDE_HOLD=0
    AUTOPILOT_HEADING_HOLD=0                          
    AUTOPILOT_WING_LEVELER=0
    ap=0
    break=0
    ra1=0
    ON (50-lastcall) IDIV 10 GOTO forty,thirty,twenty,ten,zero
    ias0=0
    trim=ELEVATOR_TRIM_POSITION
    GOTO gpws_1
land_crs:
    IF VOR_1_RADIAL-x1>180 THEN
        x1=x1+360
    ELSEIF VOR_1_RADIAL-x1<-180 THEN
        x1=x1-360
    ENDIF
    x2=crs+PLANE_HEADING-COURSE+x2*(VOR_1_RADIAL-x1)
    IF x2>360 THEN
        crs=crs-360
    ELSEIF x2<0 THEN
        crs=crs+360
    ENDIF
RETURN

hdg:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    PLAY "-ss1.wav"
    PRECISION 3,0,0
    PRINT
    x0=60*MINUTE+SECOND+time
    IF x0<0 THEN
        x0=x0+3600
    ENDIF
    IF x0<prt*2 THEN                              
        PRINT "HDG ",crs,"  CRS"
        hdg=crs
        AUTOPILOT_HEADING=hdg
    ELSE
        hdg=INT(AUTOPILOT_HEADING+.5)
        AUTOPILOT_HEADING=hdg
        PRINT "HDG ",hdg
    ENDIF
    WAIT 0
    IF KEY=0 THEN
        WAIT .5,KEYPRESS
    ENDIF
    IF KEY=583 THEN
        WAIT 0,KEYPRESS
        PLAY "-ss1.wav"
        PRINT "HDG HOLD"
        hdg=INT(PLANE_HEADING+.5)
        AUTOPILOT_HEADING=hdg
        WAIT 0
        IF KEY=0 THEN
            WAIT .5,KEYPRESS
        ENDIF
        IF KEY=583 THEN
            PLAY "-ss1.wav"
            PRINT "HDG OFF"
            AUTOPILOT_HEADING_HOLD=0
            break=1
            roll=0
            roll0=0
            WAIT 0,KEYPRESS
            RETURN
        ENDIF
    ENDIF
    IF AUTOPILOT_HEADING_HOLD=0 THEN
        AUTOPILOT_HEADING_HOLD=1
    ENDIF
    break=1
    roll=1
    roll0=1
    WAIT 0
    IF KEY=585 THEN
        GOTO alt
    ENDIF
    WAIT 0,KEYPRESS
RETURN

hdg_l10:
     hdg=hdg-10
     IF hdg<1 THEN
         hdg=hdg+360
     ENDIF
     PRECISION 3,0,0
     PRINT "HDG ",hdg
     AUTOPILOT_HEADING=hdg
RETURN

hdg_r10:
     hdg=hdg+10
     IF hdg>360 THEN
         hdg=hdg-360
     ENDIF
     PRECISION 3,0,0
     PRINT "HDG ",hdg
     AUTOPILOT_HEADING=hdg
RETURN

hdg_l1:
     hdg=hdg-1
     IF hdg<1 THEN
         hdg=hdg+360
     ENDIF
     PRECISION 3,0,0
     PRINT "HDG ",hdg
     AUTOPILOT_HEADING=hdg
RETURN

hdg_r1:
     hdg=hdg+1
     IF hdg>360 THEN
         hdg=hdg-360
     ENDIF
     PRECISION 3,0,0
     PRINT "HDG ",hdg
     AUTOPILOT_HEADING=hdg
RETURN

alt:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    PLAY "-ss1.wav"
    PRECISION 3,0,0
    PRINT
    PRINT "ALT ",alt,"00"
    WAIT 0
    IF KEY=0 THEN
        WAIT .5,KEYPRESS
    ENDIF
    IF KEY=585 THEN
        WAIT 0,KEYPRESS
        PLAY "-ss1.wav"
        PRINT "ALT HOLD"
        alt=(MTOF(PLANE_ALT)+50) IDIV 100
        WAIT 0
        IF KEY=0 THEN
            WAIT .5,KEYPRESS
        ENDIF
        IF KEY=585 THEN
            PLAY "-ss1.wav"
            PRINT "ALT OFF"
            AUTOPILOT_ALTITUDE_HOLD=0
            break=1
            pitch=0
            pitch0=0
            WAIT 0,KEYPRESS
            RETURN
        ENDIF
    ENDIF
    AUTOPILOT_ALTITUDE=FTOM(alt)*100
    AUTOPILOT_ALTITUDE_HOLD=1
    break=1
    pitch=1
    pitch0=1
    WAIT 0
    IF KEY=583 THEN
        GOTO hdg
    ENDIF
    WAIT 0,KEYPRESS
RETURN

alt_dn:
    alt=((alt*2+9) IDIV 10)*5-5
    IF alt<0 THEN
        alt=0
    ENDIF
    PRECISION 3,0,0
    PRINT "ALT ",alt,"00"
    AUTOPILOT_ALTITUDE=FTOM(alt)*100
RETURN

alt_up:
    alt=((alt*2) IDIV 10)*5+5
    IF alt>999 THEN
        alt=999
    ENDIF
    PRECISION 3,0,0
    PRINT "ALT ",alt,"00"
    AUTOPILOT_ALTITUDE=FTOM(alt)*100
RETURN

nav_crs:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    PLAY "-ss1.wav"
    PRECISION 3,0,0
    PRINT
    PRINT "NAV1 CRS"
    PRINT_TIME prt*2
    WAIT 1,KEYPRESS
    IF KEY=588 THEN
        WAIT 0,KEYPRESS
        PLAY "-ss1.wav"
        WAIT 1,KEYPRESS
        IF KEY=588 THEN
            WAIT 0,KEYPRESS
            PRINT "NAV2 CRS"
            PLAY "-ss1.wav"
            WAIT 1,KEYPRESS
            IF VOR_2_ACTIVE=0 THEN
                PLAY "-ss2.wav"
                PRINT_TIME prt
                PRINT "NAV2 OFF"
            ELSEIF KEY=588 THEN        ;from2
                PLAY "-ss1.wav"
                crs=INT(VOR_2_RADIAL-MAGVAR+.5)
                GOSUB crs
                VOR_2_OBS=crs
                PRINT "NAV2 CRS ",crs,"  FROM"
                time=-60*MINUTE-SECOND
            ELSE                       ;to2
                crs=INT(VOR_2_RADIAL-MAGVAR+180.5)
                GOSUB crs
                VOR_2_OBS=crs
                PRINT "NAV2 CRS ",crs,"  TO"
                time=-60*MINUTE-SECOND
            ENDIF
        ELSE
            break=2
            GOTO nav1_crs
        ENDIF
    ELSE
        nav1_crs:
        IF VOR_1_ACTIVE=0 THEN
            PLAY "-ss2.wav"
            PRINT_TIME prt
            PRINT "NAV1 OFF"
        ELSEIF VOR_1_LOCALIZER_AVAIL THEN
            crs=INT(VOR_1_LOCALIZER-MAGVAR+.5)
            GOSUB crs
            VOR_1_OBS=crs
            IF VOR_1_GS_AVAIL THEN
                PRINT "NAV1 CRS ",crs,"  ILS"
            ELSE
                PRINT "NAV1 CRS ",crs,"  LOC"
            ENDIF
        ELSEIF break=2 THEN            ;from1
            crs=INT(VOR_1_RADIAL-MAGVAR+.5)
            GOSUB crs
            VOR_1_OBS=crs
            PRINT "NAV1 CRS ",crs,"  FROM"
            time=-60*MINUTE-SECOND
        ELSE                           ;to1
            crs=INT(VOR_1_RADIAL-MAGVAR+180.5)
            GOSUB crs
            VOR_1_OBS=crs
            PRINT "NAV1 CRS ",crs,"  TO"
            time=-60*MINUTE-SECOND
        ENDIF
    ENDIF
    PRINT_TIME prt
    break=1
    WAIT 0
    IF KEY=583 THEN
        GOTO hdg
    ENDIF
    WAIT 0,KEYPRESS
RETURN

nav1:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,83,259
    PRINT_TIME 20
    PRECISION 3,2,2
    keys=0
    x2=100
    x1=NAV1_FREQ
    PLAY "-ss1.wav"
    WAIT .3,KEYPRESS
    IF KEY=3 OR KEY=259 THEN                     ;(Shift)2
        WAIT 0,KEYPRESS
        x1=NAV2_FREQ
        GOTO n2
    ELSEIF KEY=shift+50 THEN                     ;(Shift)m
        PLAY "-ss1.wav"
        NAV1_FREQ = NAV2_FREQ
        NAV2_FREQ = x1
        crs = VOR_1_OBS
        VOR_1_OBS = VOR_2_OBS
        VOR_2_OBS = crs
        ADV_KEYS DELETE,259
        GOTO advkeys_reset
    ELSEIF KEY=shift+49 OR rdkeys=1 THEN         ;(Shift)n
        PLAY "-ss1.wav"
        NAV1_FREQ=nav1
        nav1=x1
        ADV_KEYS DELETE,259
        GOTO advkeys_reset
    ENDIF
    PRINT
    WHILE 1
        nav1_1:
        WAIT 0
        IF KEY=0 THEN
            PRINT "NAV1 >",x1,"   [",nav1,"]"
            WAIT 18,KEYPRESS
        ENDIF
        IF keys=0 AND (KEY=3 OR KEY=259) THEN    ;(Shift)2
            ADV_KEYS DELETE,259
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            keys=0
            x2=100
            x1=NAV2_FREQ
            PRINT
            GOTO n2
        ELSEIF INRANGE(KEY,2,10) THEN            ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x1=x1+(break-1)*x2
            x2=x2/10
            GOTO nav1_1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x2=x2/10
            GOTO nav1_1
        ELSEIF KEY=28 THEN             ;Enter
            WAIT 0,KEYPRESS
            IF INRANGE(x1,108,117.95) THEN
                NAV1_FREQ=x1
                ADV_KEYS DELETE,259
                GOTO crs1
            ENDIF
            PLAY "-ss2.wav"
            x1=0
            x2=100
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF x2<.005 OR keys=0 THEN
                keys=1
                x2=INT(x1*100+.05)/100
                x1=INT(x2*10+.05)/10
                IF x1=x2 THEN
                    x1=INT(x1)
                    x2=.1
                ELSE
                    x2=.01
                ENDIF
            ELSEIF x2<100 THEN
                x2=INT(x2*100+.05)
                x1=INT(x1/x2)*x2
                x2=x2/10
            ENDIF
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            x2=x1
            x1=nav1
            nav1=x2
            keys=0
            x2=100
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            keys=0
            x2=100
            x1=NAV1_FREQ
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            ADV_KEYS DELETE,259
            GOTO advkeys_reset
        ELSEIF KEY=shift+49 THEN       ;(Shift)n
            PLAY "-ss2.wav"
            PRINT
            NAV1_FREQ=nav1
            nav1=x1
            ADV_KEYS DELETE,259
            GOTO advkeys_reset
        ELSEIF KEY=shift+50 THEN       ;(Shift)m
            PLAY "-ss2.wav"
            PRINT
            IF NOT INRANGE(x1,108,117.95) THEN
                x1=NAV1_FREQ
            ENDIF
            NAV1_FREQ = NAV2_FREQ
            NAV2_FREQ = x1
            crs = VOR_1_OBS
            VOR_1_OBS = VOR_2_OBS
            VOR_2_OBS = crs
            ADV_KEYS DELETE,259
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
crs1:
    time=2
    keys=0
    x2=0
    x1=NAV1_FREQ
    crs=VOR_1_OBS
    PLAY "-ss1.wav"
    WHILE 1
        crs1_1:
        WAIT 0
        IF KEY=0 THEN
            PRECISION 3,2,2
            PRINT "NAV1 ",x1,
            PRECISION 3,0,0
            PRINT "   CRS ",crs,"<"
            crs1_2:                                  
            WAIT time,KEYPRESS
        ENDIF
        IF KEY=0 AND time=2 THEN                 ;NAV radio needs 2sec before 
            time=17                              ;it recieves a localizer crs
            IF keys=0 AND VOR_1_LOCALIZER_AVAIL THEN
                crs=INT(VOR_1_LOCALIZER-MAGVAR+.5)
                GOSUB crs
                VOR_1_OBS=crs
                PLAY "-ss1.wav"
                WHILE KEY=0
                    PRECISION 3,2,2
                    PRINT "NAV1 ",x1,
                    PRECISION 3,0,0
                    IF VOR_1_GS_AVAIL THEN
                        PRINT "   CRS ",crs,"<  ILS"
                    ELSE
                        PRINT "   CRS ",crs,"<  LOC"
                    ENDIF
                    WAIT 18,KEYPRESS
                ENDWHILE
                GOTO crs1_1
            ENDIF
            GOTO crs1_2
        ELSEIF INRANGE(KEY,2,10) THEN  ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                crs=0
                keys=1
            ENDIF
            crs=crs*10+break-1
            IF crs>360 THEN
               crs=0
               PLAY "-ss2.wav"
            ENDIF
            GOTO crs1_1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                crs=0
                keys=1
            ENDIF
            crs=crs*10
            IF crs>360 THEN
                crs=0
                PLAY "-ss2.wav"
            ENDIF
            GOTO crs1_1
        ELSEIF KEY=12 THEN             ;crs -
            WHILE KEY=12
                crs=crs-10
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_1_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs1_1
        ELSEIF KEY=13 THEN             ;crs +
            WHILE KEY=13
                crs=crs+10
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_1_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs1_1
        ELSEIF KEY=26 THEN             ;crs [
            WHILE KEY=26
                crs=crs-1
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_1_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs1_1
        ELSEIF KEY=27 THEN             ;crs ]
            WHILE KEY=27
                crs=crs+1
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_1_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs1_1
        ELSEIF KEY=28 THEN             ;Enter
            PLAY "-ss1.wav"
            VOR_1_OBS=crs
            PRINT_TIME prt/2
            PRECISION 3,2,2
            PRINT "NAV1 ",x1,
            PRECISION 3,0,0
            PRINT "   CRS ",crs
            GOTO advkeys_reset
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            keys=1
            crs=crs IDIV 10
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PRECISION 3,2,2
            IF VOR_1_ACTIVE THEN
                PLAY "-ss1.wav"
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                IF x2=0 THEN
                    crs=INT(VOR_1_RADIAL-MAGVAR+180.5)
                    GOSUB crs
                    VOR_1_OBS=crs
                    PRINT "   CRS ",crs,"<  TO"
                    x2=1
                ELSE
                    crs=INT(VOR_1_RADIAL-MAGVAR+.5)
                    GOSUB crs
                    VOR_1_OBS=crs
                    PRINT "   CRS ",crs,"<  FROM"
                    x2=0
                ENDIF
            ELSE
                PLAY "-ss2.wav"
                PRINT "NAV1 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<  OFF"
            ENDIF
            keys=0
            GOTO crs1_2
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            GOTO crs1
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY=shift+49 THEN       ;(Shift)n
            VOR_1_OBS=crs
            break=0
            GOTO nav1
        ELSEIF KEY=shift+50 THEN       ;(Shift)m
            VOR_1_OBS=crs
            break=0
            GOTO nav2
        ELSEIF KEY=583 THEN            ;hdg
            PLAY "-ss1.wav"
            VOR_1_OBS=crs
            hdg=crs
            PRINT_TIME prt
            PRINT "HDG ",hdg
            AUTOPILOT_HEADING=hdg
            IF AUTOPILOT_HEADING_HOLD=0 THEN
                AUTOPILOT_HEADING_HOLD=1
            ENDIF
            roll=1
            roll0=1
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
RETURN

nav2:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,83
    PRINT_TIME 20
    PRECISION 3,2,2
    keys=0
    x2=100
    x1=NAV2_FREQ
    PLAY "-ss1.wav"
    n2:
    WAIT .3,KEYPRESS
    IF KEY=shift+49 THEN                         ;(Shift)n
        PLAY "-ss1.wav"
        NAV2_FREQ = NAV1_FREQ
        NAV1_FREQ = x1
        crs = VOR_2_OBS
        VOR_2_OBS = VOR_1_OBS
        VOR_1_OBS = crs
        GOTO advkeys_reset
    ELSEIF KEY=shift+50 OR rdkeys=1 THEN         ;(Shift)m
        PLAY "-ss1.wav"
        NAV2_FREQ=nav2
        nav2=x1
        GOTO advkeys_reset
    ENDIF
    PRINT
    WHILE 1
        nav2_1:
        WAIT 0
        IF KEY=0 THEN
            PRINT "NAV2 >",x1,"   [",nav2,"]"
            WAIT 18,KEYPRESS
        ENDIF
        IF INRANGE(KEY,2,10) THEN      ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x1=x1+(break-1)*x2
            x2=x2/10
            GOTO nav2_1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x2=x2/10
            GOTO nav2_1
        ELSEIF KEY=28 THEN             ;Enter
            WAIT 0,KEYPRESS            
            IF INRANGE(x1,108,117.95) THEN
                NAV2_FREQ=x1
                GOTO crs2
            ENDIF
            PLAY "-ss2.wav"
            x1=0
            x2=100
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF x2<.005 OR keys=0 THEN
                keys=1
                x2=INT(x1*100+.05)/100
                x1=INT(x2*10+.05)/10
                IF x1=x2 THEN
                    x1=INT(x1)
                    x2=.1
                ELSE
                    x2=.01
                ENDIF
            ELSEIF x2<100 THEN
                x2=INT(x2*100+.05)
                x1=INT(x1/x2)*x2
                x2=x2/10
            ENDIF
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            x2=x1
            x1=nav2
            nav2=x2
            keys=0
            x2=100
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            keys=0
            x2=100
            x1=NAV2_FREQ
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY=shift+50 THEN       ;(Shift)m
            PLAY "-ss2.wav"
            PRINT
            NAV2_FREQ=nav2
            nav2=x1
            GOTO advkeys_reset
        ELSEIF KEY=shift+49 THEN       ;(Shift)n
            PLAY "-ss2.wav"
            PRINT
            IF NOT INRANGE(x1,108,117.95) THEN
                x1=NAV2_FREQ
            ENDIF
            NAV2_FREQ = NAV1_FREQ
            NAV1_FREQ = x1
            crs = VOR_2_OBS
            VOR_2_OBS = VOR_1_OBS
            VOR_1_OBS = crs
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
crs2:
    keys=0
    x2=0
    x1=NAV2_FREQ
    crs=VOR_2_OBS
    PLAY "-ss1.wav"
    WHILE 1
        crs2_1:
        WAIT 0
        IF KEY=0 THEN
            PRECISION 3,2,2
            PRINT "NAV2 ",x1,
            PRECISION 3,0,0
            PRINT "   CRS ",crs,"<"
            crs2_2:
            WAIT 18,KEYPRESS
        ENDIF
        IF INRANGE(KEY,2,10) THEN      ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                crs=0
                keys=1
            ENDIF
            crs=crs*10+break-1
            IF crs>360 THEN
               crs=0
               PLAY "-ss2.wav"
            ENDIF
            GOTO crs2_1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                crs=0
                keys=1
            ENDIF
            crs=crs*10
            IF crs>360 THEN
                crs=0
                PLAY "-ss2.wav"
            ENDIF
            GOTO crs2_1
        ELSEIF KEY=12 THEN             ;crs -
            WHILE KEY=12
                crs=crs-10
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_2_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs2_1
        ELSEIF KEY=13 THEN             ;crs +
            WHILE KEY=13
                crs=crs+10
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_2_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs2_1
        ELSEIF KEY=26 THEN             ;crs [
            WHILE KEY=26
                crs=crs-1
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_2_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs2_1
        ELSEIF KEY=27 THEN             ;crs ]
            WHILE KEY=27
                crs=crs+1
                GOSUB crs
                PRECISION 3,2,2
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<"
                VOR_2_OBS=crs
                WAIT 0
                WAIT 0,KEYPRESS
                WAIT 0,KEYPRESS
                WAIT .3,KEYPRESS
            ENDWHILE
            keys=2
            GOTO crs2_1
        ELSEIF KEY=28 THEN             ;Enter
            PLAY "-ss1.wav"
            VOR_2_OBS=crs
            PRINT_TIME prt/2
            PRECISION 3,2,2
            PRINT "NAV2 ",x1,
            PRECISION 3,0,0
            PRINT "   CRS ",crs
            GOTO advkeys_reset
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF keys=0 then
                keys=1
            ENDIF
            crs=crs IDIV 10
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PRECISION 3,2,2
            IF VOR_2_ACTIVE THEN
                PLAY "-ss1.wav"
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                IF x2=0 THEN
                    crs=INT(VOR_2_RADIAL-MAGVAR+180.5)
                    GOSUB crs
                    VOR_2_OBS=crs
                    PRINT "   CRS ",crs,"<  TO"
                    x2=1
                ELSE
                    crs=INT(VOR_2_RADIAL-MAGVAR+.5)
                    GOSUB crs
                    VOR_2_OBS=crs
                    PRINT "   CRS ",crs,"<  FROM"
                    x2=0
                ENDIF
            ELSE
                PLAY "-ss2.wav"
                PRINT "NAV2 ",x1,
                PRECISION 3,0,0
                PRINT "   CRS ",crs,"<  OFF"
            ENDIF
            keys=0
            GOTO crs2_2
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            GOTO crs2
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY=shift+50 THEN       ;(Shift)m
            VOR_2_OBS=crs
            break=0
            GOTO nav2
        ELSEIF KEY=shift+49 THEN       ;(Shift)n
            VOR_2_OBS=crs
            break=0
            GOTO nav1
        ELSEIF KEY=583 THEN            ;hdg
            PLAY "-ss1.wav"
            VOR_2_OBS=crs
            hdg=crs
            PRINT_TIME prt
            PRINT "HDG ",hdg
            AUTOPILOT_HEADING=hdg
            IF AUTOPILOT_HEADING_HOLD=0 THEN
                AUTOPILOT_HEADING_HOLD=1
            ENDIF
            roll=1
            roll0=1
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
RETURN

adf:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,83
    PRINT_TIME 20
    PRECISION 3,1,1
    keys=0
    x2=100
    x1=ADF_FREQ
    PLAY "-ss1.wav"
    WAIT .3,KEYPRESS
    IF KEY=shift+30 OR rdkeys=1 THEN             ;(Shift)a
        PLAY "-ss1.wav"
        ADF_FREQ=adf
        adf=x1
        GOTO advkeys_reset
    ENDIF
    PRINT
    WHILE 1
        adf1:
        WAIT 0
        IF KEY=0 THEN
            PRINT "ADF >",x1,"   [",adf,"]"
            WAIT 18,KEYPRESS
        ENDIF
        IF INRANGE(KEY,2,10) THEN      ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x1=x1+(break-1)*x2
            x2=x2/10
            GOTO adf1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x2=x2/10
            GOTO adf1
        ELSEIF KEY=28 THEN             ;Enter
            IF INRANGE(x1,200,1699.9) THEN
                PLAY "-ss1.wav"
                ADF_FREQ=x1
                PRINT_TIME prt/2
                PRINT "ADF ",x1
                GOTO advkeys_reset
            ENDIF
            WAIT 0,KEYPRESS            
            PLAY "-ss2.wav"
            x1=0
            x2=100
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF x2<.05 OR keys=0 THEN
                keys=1
                x2=INT(x1*10+.05)/10
                x1=INT(x2+.05)
                IF x1=x2 THEN
                    x1=INT(x1/10)*10
                    x2=1
                ELSE
                    x2=.1
                ENDIF
            ELSEIF x2<100 THEN
                x2=INT(x2*100+.05)
                x1=INT(x1/x2)*x2
                x2=x2/10
            ENDIF
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            x2=x1
            x1=adf
            adf=x2
            keys=0
            x2=100
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            keys=0
            x2=100
            x1=ADF_FREQ
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY=shift+30 THEN       ;(Shift)a
            PLAY "-ss2.wav"
            PRINT
            ADF_FREQ=adf
            adf=x1
            GOTO advkeys_reset
        ELSEIF KEY=583 THEN            ;hdg
            ADF_FREQ=x1
            WAIT 0,KEYPRESS
            IF INRANGE(x1,200,1699.9) THEN
                PLAY "-ss1.wav"
                PRINT "ADF ",x1,"  QDM"         
                break=0
                time=0
                time0=SECOND                     ;ADF needs 2sec before it
                WHILE time<2                     ; points to a new station
                    WAIT 0                       
                    IF KEY=15 AND break=0 THEN   ;Tab
                        WAIT 0,KEYPRESS
                        PLAY "-ss1.wav"
                        PRINT "ADF ",x1,"  QDR"
                        break=1
                    ELSEIF KEY!=0 THEN
                        WAIT 0,KEYPRESS
                        PLAY "-ss2.wav"
                    ENDIF
                    time=SECOND-time0
                    IF time<0 THEN
                        time=time+60
                    ENDIF
                ENDWHILE
                IF ADF_RADIAL!=0 THEN
                    IF break=0 THEN
                        crs=INT(ADF_RADIAL-MAGVAR+180.5)
                    ELSE
                        crs=INT(ADF_RADIAL-MAGVAR+.5)
                    ENDIF
                    GOSUB crs
                    hdg=crs
                    PRECISION 3,0,0
                    PLAY "-ss1.wav"
                    PRINT_TIME prt
                    PRINT "HDG ",hdg
                    AUTOPILOT_HEADING=hdg
                    IF AUTOPILOT_HEADING_HOLD=0 THEN
                        AUTOPILOT_HEADING_HOLD=1
                    ENDIF
                    roll=1
                    roll0=1
                    GOTO advkeys_reset
                ENDIF
            ELSE
                x1=0
            ENDIF
            PLAY "-ss2.wav"
            keys=0
            x2=100
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
RETURN

com:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,83
    PRINT_TIME 20
    PRECISION 3,2,2
    keys=0
    x2=100
    x1=COM_FREQ
    PLAY "-ss1.wav"
    WAIT .3,KEYPRESS
    IF rdkeys=1 AND KEY=302 THEN                 ;swap only: Shift-cc
        IF atc=1 THEN
            PRINT "ATC OFF"
            atc=0
        ELSE
            PRINT "ATC ON"
            atc=1
        ENDIF
        GOTO advkeys_reset
    ELSEIF KEY=shift+46 OR rdkeys=1 THEN         ;(Shift)c
        swap_com:
        PLAY "-ss1.wav"
        COM_FREQ=com
        com=x1
        GOTO advkeys_reset
    ENDIF
    PRINT
    WHILE 1
        com1:
        WAIT 0
        IF KEY=0 THEN
            PRINT "COM >",x1,"   [",com,"]"
            WAIT 18,KEYPRESS
        ENDIF
        IF INRANGE(KEY,2,10) THEN      ;entering numbers 1-9
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x1=x1+(break-1)*x2
            x2=x2/10
            GOTO com1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x2=x2/10
            GOTO com1
        ELSEIF KEY=28 THEN             ;Enter
            IF INRANGE(x1,118,136.975) THEN
                PLAY "-ss1.wav"
                COM_FREQ=x1
                PRINT_TIME prt/2
                PRINT "COM ",x1
                GOTO advkeys_reset
            ENDIF
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
            x1=0
            x2=100
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF x2<.005 OR keys=0 THEN
                keys=1
                x2=INT(x1*100+.05)/100
                x1=INT(x2*10+.05)/10
                IF x1=x2 THEN
                    x1=INT(x1)
                    x2=.1
                ELSE
                    x2=.01
                ENDIF
            ELSEIF x2<100 THEN
                x2=INT(x2*100+.05)
                x1=INT(x1/x2)*x2
                x2=x2/10
            ENDIF
        ELSEIF KEY=15 THEN             ;Tab
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            x2=x1
            x1=com
            com=x2
            keys=0
            x2=100
        ELSEIF KEY=83 THEN             ;Delete
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            keys=0
            x2=100
            x1=COM_FREQ
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY=shift+46 THEN       ;(Shift)c
            PLAY "-ss2.wav"
            PRINT
            COM_FREQ=com
            com=x1
            GOTO advkeys_reset
        ELSEIF KEY=12 OR KEY=13 OR KEY=26 OR KEY=27 THEN
            PLAY "-ss1.wav"
            PRINT "COM >",x1,"   [",com,"]    ",
            IF atc=1 THEN
                PRINT "ATC OFF"
                atc=0
            ELSE
                PRINT "ATC ON"
                atc=1
            ENDIF
            WAIT 18,KEYPRESS
            GOTO com1
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
RETURN

xpdr:
    WAIT 0,KEYPRESS
    IF break>1 OR rdkeys=1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28,83
    PRINT_TIME 20
    PRECISION 4,0,0
    xpdr0:
    keys=0
    x2=1000
    x1=TRANS_FREQ
    PLAY "-ss1.wav"
    PRINT
    WHILE 1
        xpdr1:
        WAIT 0
        IF KEY=0 THEN
            PRINT "XPDR >",x1
            WAIT 18,KEYPRESS
        ENDIF
        IF INRANGE(KEY,2,8) THEN       ;entering numbers 1-7
            break=KEY
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x1=x1+(break-1)*x2
            x2=x2/10
            GOTO xpdr1
        ELSEIF KEY=11 THEN             ;entering a 0
            WAIT 0,KEYPRESS
            IF keys=0 THEN
                x1=0
                keys=1
            ENDIF
            x2=x2/10
            GOTO xpdr1
        ELSEIF KEY=28 THEN             ;Enter
            PLAY "-ss1.wav"
            TRANS_FREQ=x1
            PRINT_TIME prt/2
            PRINT "XPDR ",x1
            GOTO advkeys_reset
        ELSEIF KEY=14 THEN             ;Backspace
            WAIT 0,KEYPRESS
            IF x2<.05 OR keys=0 THEN
                keys=1
                x2=.1
            ENDIF
            IF x2<1000 THEN
                x2=INT(x2*100+.05)
                x1=INT(x1/x2)*x2
                x2=x2/10
            ENDIF
        ELSEIF KEY=15 OR KEY=83 THEN   ;Tab/Delete
            WAIT 0,KEYPRESS
            GOTO xpdr0
        ELSEIF KEY=1 OR KEY=57 THEN    ;Esc/Space
            PRINT
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss2.wav"
        ENDIF
    ENDWHILE
RETURN

dh:
    IF break=2 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    PLAY "-ss1.wav"
    PRINT
    IF dh=0 THEN
        PRINT "DH 200"
        dh=200
    ELSEIF dh=200 THEN
        PRINT "DH 100"
        dh=100
    ELSEIF dh=100 THEN
        PRINT "DH 50"
        dh=50
    ELSEIF dh=50 THEN
        PRINT "DH 20"
        dh=20
    ELSE
        PRINT "DH OFF"
        dh=0
    ENDIF
    WAIT 0,KEYPRESS
RETURN

setup:
    WAIT 0,KEYPRESS
    IF break>1 THEN
        PLAY "-ss2.wav"
        RETURN
    ENDIF
    ADV_KEYS ADD,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,26,27,28
    PLAY "-ss1.wav"
    PRINT_TIME 20
    PRINT
    setup1:
    WHILE 1
        WAIT 0,KEYPRESS
        ON gpws GOSUB gpws0,gpws1,gpws2
        ON inh GOSUB inh0,inh1,inh2,inh3
        ON fma GOSUB fma0,fma1,fma2
        IF fk=0 THEN
            GOSUB fk0
        ELSEIF fk=57 THEN
            GOSUB fk1
        ELSE
            GOSUB fk2
        ENDIF
        WAIT 18,KEYPRESS
        IF KEY=2 THEN                  ;1
            gpws=gpws-1
            IF gpws<0 THEN
                gpws=2
                ra0=0
                ra1=0
            ENDIF
        ELSEIF KEY=3 THEN              ;2
            inh=inh+1
            IF inh>3 THEN
                inh=0
                ra0=0
                ra1=0
            ENDIF
        ELSEIF KEY=4 THEN              ;3
            fma=fma-1
            IF fma<0 THEN
                fma=2
            ENDIF
        ELSEIF KEY=5 THEN              ;4
            IF fk=57 THEN
                fk=83
            ELSEIF fk=83 THEN
                fk=0
            ELSE
                fk=57
            ENDIF
        ELSEIF KEY=1 THEN              ;Esc
            PRINT                      
            GOSUB advkeys
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            GOTO setup2
        ENDIF
        WAIT 0,KEYPRESS
    ENDWHILE
    setup2:
    WHILE 1
        ON rdkeys GOSUB rdkeys0,rdkeys1,rdkeys2,rdkeys3
        ON hdgalt GOSUB hdgalt0,hdgalt1
        ON land GOSUB land0,land1
        ON cat-1 GOSUB cat1,cat2,cat3,cat4
        WAIT 18,KEYPRESS
        IF KEY=2 THEN                  ;1
            rdkeys=rdkeys+1
            IF rdkeys>3 THEN
                rdkeys=0
            ENDIF
        ELSEIF KEY=3 THEN              ;2
            hdgalt=hdgalt-1
            IF hdgalt<0 THEN
                hdgalt=1
            ENDIF
        ELSEIF KEY=4 THEN              ;3
            land=land-1
            IF land<0 THEN
                land=1
            ENDIF
        ELSEIF KEY=5 THEN              ;4
            cat=cat+1
            IF cat>4 THEN
                cat=1
            ENDIF
        ELSEIF KEY=1 OR KEY=28 OR KEY=57 OR KEY=83 THEN  ;Esc/Enter/Space/Del
            PRINT                      
            GOSUB advkeys
            GOTO advkeys_reset
        ELSEIF KEY!=0 THEN
            WAIT 0,KEYPRESS
            PLAY "-ss1.wav"
            GOTO setup1
        ENDIF
        WAIT 0,KEYPRESS
    ENDWHILE
RETURN

roll0:
    PRINT "___ ___   ",
RETURN
roll1:
    PRECISION 3,0,0
    PRINT "HDG ",hdg,"   ",
RETURN
roll2:
    PRINT "ATT ROLL  ",
RETURN
roll3:
    PRINT "APP LOC   ",
RETURN                
roll4:
    PRINT "LOC       ",
RETURN
roll5:
    PRINT "LBC       ",
RETURN
roll6:
    PRINT "NAV1 VOR  ",
RETURN
roll7:
    PRINT "LVL       ",
RETURN

pitch0:
    PRINT "___ ___     ",
RETURN
pitch1:
    PRECISION 3,0,0
    PRINT "ALT ",alt,"00   ",
RETURN
pitch2:
    PRINT "ATT PITCH   ",
RETURN
pitch3:
    PRINT "APP G/S     ",
RETURN

armed0:
    PRINT
RETURN
armed1:
    PRINT "land armed"
RETURN
armed2:
    PRINT "g/s armed"
RETURN
armed3:
    PRINT "app armed"
RETURN
armed4:
    PRINT "loc armed"
RETURN
armed5:
    PRINT "lbc armed"
RETURN
armed6:
    PRINT "vor armed"
RETURN
armed7:
    PRINT "AP OFF"
RETURN

gpws0:
    PRINT "1.GPWS:off  ",
RETURN
gpws1:
    PRINT "1.GPWS:alt  ",
RETURN
gpws2:
    PRINT "1.GPWS:on  ",
RETURN
inh0:
    PRINT "2.GPWS:normal  ",
RETURN
inh1:
    PRINT "2.GPWS:g/s-inh  ",
RETURN
inh2:
    PRINT "2.GPWS:flap-inh  ",
RETURN
inh3:
    PRINT "2.GPWS:gear-inh  ",
RETURN
fma0:
    PRINT "3.FMA:manual  ",
RETURN
fma1:
    PRINT "3.FMA:auto  ",
RETURN
fma2:
    PRINT "3.FMA:auto+  ",
RETURN
fk0:
    PRINT "4.FMA-key:off"
RETURN
fk1:
    PRINT "4.FMA-key:Space"
RETURN
fk2:
    PRINT "4.FMA-key:Del"
RETURN

rdkeys0:
    PRINT "1.RD-keys:off  ",
RETURN
rdkeys1:
    PRINT "1.RD-keys:swap  ",
RETURN
rdkeys2:
    PRINT "1.RD-keys:Shift  ",
RETURN
rdkeys3:             
    PRINT "1.RD-keys:normal  ",
RETURN
hdgalt0:
    PRINT "2.HDG/ALT:off  ",
RETURN
hdgalt1:
    PRINT "2.HDG/ALT:keypad  ",
RETURN
land0:
    PRINT "3.LAND:off  ",
RETURN
land1:
    PRINT "3.LAND:on  ",
RETURN
cat1:
    PRINT "4.CAT-A"
RETURN
cat2:
    PRINT "4.CAT-B"
RETURN
cat3:
    PRINT "4.CAT-C"
RETURN
cat4:
    PRINT "4.CAT-D"
RETURN
