Skip to navigation

Elite on the BBC Micro and NES

Main loop: Main flight loop (Part 3 of 16)

[Elite-A, Flight]

Name: Main flight loop (Part 3 of 16) [Show more] Type: Subroutine Category: Main loop Summary: Scan for flight keys and process the results Deep dive: Program flow of the main game loop The key logger
Context: See this subroutine in context in the source code References: No direct references to this subroutine in this source file

The main flight loop covers most of the flight-specific aspects of Elite. This section covers the following: * Scan for flight keys and process the results Flight keys are logged in the key logger at location KY1 onwards, with a non-zero value in the relevant location indicating a key press. See the deep dive on "The key logger" for more details. The key presses that are processed are as follows: * Space and "?" to speed up and slow down * "U", "T" and "M" to disarm, arm and fire missiles * TAB to activate the hyperspace unit * ESCAPE to launch an escape pod * "J" to initiate an in-system jump * "E" to deploy E.C.M. anti-missile countermeasures * "C" to use the docking computer * "A" to fire lasers
\ --- Mod: Code removed for Elite-A: ------------------> \.BS2 \ --- End of removed code -----------------------------> LDA KY2 \ If Space is being pressed, keep going, otherwise jump BEQ MA17 \ down to MA17 to skip the following \ --- Mod: Code removed for Elite-A: ------------------> \ LDA DELTA \ The "go faster" key is being pressed, so first we \ CMP #40 \ fetch the current speed from DELTA into A, and if \ BCS MA17 \ A >= 40, we are already going at full pelt, so jump \ \ down to MA17 to skip the following \ \ INC DELTA \ We can go a bit faster, so increment the speed in \ \ location DELTA \ --- And replaced by: --------------------------------> LDA DELTA \ The "go faster" key is being pressed, so first we CMP new_speed \ fetch the current speed from DELTA into A, and if BCC speed_up \ A < new_speed (the maximum speed of our current ship), \ then we can go a bit faster, so jump to speed_up to \ accelerate \ --- End of replacement ------------------------------> .MA17 LDA KY1 \ If "?" is being pressed, keep going, otherwise jump BEQ MA4 \ down to MA4 to skip the following DEC DELTA \ The "slow down" key is being pressed, so we decrement \ the current ship speed in DELTA BNE MA4 \ If the speed is still greater than zero, jump to MA4 \ --- Mod: Code added for Elite-A: --------------------> .speed_up \ --- End of added code -------------------------------> INC DELTA \ Otherwise we just braked a little too hard, so bump \ the speed back up to the minimum value of 1 .MA4 LDA KY15 \ If "U" is being pressed and the number of missiles AND NOMSL \ in NOMSL is non-zero, keep going, otherwise jump down BEQ MA20 \ to MA20 to skip the following LDY #&EE \ The "disarm missiles" key is being pressed, so call JSR ABORT \ ABORT to disarm the missile and update the missile \ indicators on the dashboard to green/cyan (Y = &EE) \ --- Mod: Code removed for Elite-A: ------------------> \ LDA #40 \ Call the NOISE routine with A = 40 to make a low, \ JSR NOISE \ long beep to indicate the missile is now disarmed \ \.MA31 \ --- And replaced by: --------------------------------> JSR WA1 \ Call the WA1 routine to make a low, long beep to \ indicate the missile is now disarmed \ --- End of replacement ------------------------------> LDA #0 \ Set MSAR to 0 to indicate that no missiles are STA MSAR \ currently armed .MA20 LDA MSTG \ If MSTG is positive (i.e. it does not have bit 7 set), BPL MA25 \ then it indicates we already have a missile locked on \ a target (in which case MSTG contains the ship number \ of the target), so jump to MA25 to skip targeting. Or \ to put it another way, if MSTG = &FF, which means \ there is no current target lock, keep going LDA KY14 \ If "T" is being pressed, keep going, otherwise jump BEQ MA25 \ down to MA25 to skip the following LDX NOMSL \ If the number of missiles in NOMSL is zero, jump down BEQ MA25 \ to MA25 to skip the following STA MSAR \ The "target missile" key is being pressed and we have \ at least one missile, so set MSAR = &FF to denote that \ our missile is currently armed (we know A has the \ value &FF, as we just loaded it from MSTG and checked \ that it was negative) \ --- Mod: Code removed for Elite-A: ------------------> \ LDY #&E0 \ Change the leftmost missile indicator to yellow/white \ JSR MSBAR \ on the missile bar (this call changes the leftmost \ \ indicator because we set X to the number of missiles \ \ in NOMSL above, and the indicators are numbered from \ \ right to left, so X is the number of the leftmost \ \ indicator) \ --- And replaced by: --------------------------------> LDY #&E0 \ Change the leftmost missile indicator to yellow/white DEX \ on the missile bar (this call changes the leftmost JSR MSBAR \ indicator because we set X to the number of missiles \ in NOMSL above, and the indicators are numbered from \ right to left, starting at 0, so X - 1 is the number \ of the leftmost indicator) \ --- End of replacement ------------------------------> .MA25 LDA KY16 \ If "M" is being pressed, keep going, otherwise jump BEQ MA24 \ down to MA24 to skip the following LDA MSTG \ If MSTG = &FF then there is no target lock, so jump to BMI MA64 \ MA64 to skip the following (also skipping the checks \ for TAB, ESCAPE, "J" and "E") JSR FRMIS \ The "fire missile" key is being pressed and we have \ a missile lock, so call the FRMIS routine to fire \ the missile .MA24 \ --- Mod: Code removed for Elite-A: ------------------> \ LDA KY12 \ If TAB is being pressed, keep going, otherwise jump \ BEQ MA76 \ down to MA76 to skip the following \ \ ASL BOMB \ The "energy bomb" key is being pressed, so double \ \ the value in BOMB. If we have an energy bomb fitted, \ \ BOMB will contain &7F (%01111111) before this shift \ \ and will contain &FE (%11111110) after the shift; if \ \ we don't have an energy bomb fitted, BOMB will still \ \ contain 0. The bomb explosion is dealt with in the \ \ MAL1 routine below - this just registers the fact that \ \ we've set the bomb ticking \ --- And replaced by: --------------------------------> LDA KY12 \ If TAB is not being pressed (i.e. KY12 = 0) and we do AND BOMB \ not have a hyperspace unit fitted (i.e. BOMB = 0), BEQ MA76 \ jump down to MA76 to skip the following INC BOMB \ The "hyperspace unit" key is being pressed and we have \ a hyperspace unit fitted, so increment BOMB from &FF \ (hyperspace unit fitted) to 0 (hyperspace unit not \ fitted), as it is a single-use item and we are now \ using it INC new_hold \ Free up one tonne of space in the hold, as we have \ just used up the hyperspace unit JSR DORND \ Set A and X to random numbers STA QQ9 \ Set (QQ9, QQ10) to (A, X), so we jump to a random STX QQ10 \ point in the galaxy JSR TT111 \ Select the system closest to galactic coordinates \ (QQ9, QQ10) JSR hyper_snap \ Call hyper_snap to perform a hyperspace, but without \ using up any fuel \ --- End of replacement ------------------------------> .MA76 \ --- Mod: Code removed for Elite-A: ------------------> \ LDA KY20 \ If "P" is being pressed, keep going, otherwise skip \ BEQ MA78 \ the next two instructions \ \ LDA #0 \ The "cancel docking computer" key is bring pressed, \ STA auto \ so turn it off by setting auto to 0 \ --- And replaced by: --------------------------------> LDA KY19 \ If "C" is being pressed, and we have a docking AND DKCMP \ computer fitted, then KY19 and DKCMP will both be &FF, BNE dock_toggle \ so jump down to dock_toggle with A set to &FF LDA KY20 \ If "P" is being pressed, keep going, otherwise skip BEQ MA78 \ the next two instructions LDA #0 \ The "cancel docking computer" key is bring pressed, \ so turn it off by setting A to 0, so we set auto to 0 \ in the next instruction .dock_toggle STA auto \ Set auto to the value in A, which will be &FF if we \ just turned on the docking computer, or 0 if we just \ turned it off \ --- End of replacement ------------------------------> .MA78 LDA KY13 \ If ESCAPE is being pressed and we have an escape pod AND ESCP \ fitted, keep going, otherwise jump to noescp to skip BEQ noescp \ the following instructions JMP ESCAPE \ The button is being pressed to launch an escape pod \ and we have an escape pod fitted, so jump to ESCAPE to \ launch it, and exit the main flight loop using a tail \ call .noescp LDA KY18 \ If "J" is being pressed, keep going, otherwise skip BEQ P%+5 \ the next instruction JSR WARP \ Call the WARP routine to do an in-system jump LDA KY17 \ If "E" is being pressed and we have an E.C.M. fitted, AND ECM \ keep going, otherwise jump down to MA64 to skip the BEQ MA64 \ following LDA ECMA \ If ECMA is non-zero, that means an E.C.M. is already BNE MA64 \ operating and is counting down (this can be either \ our E.C.M. or an opponent's), so jump down to MA64 to \ skip the following (as we can't have two E.C.M. \ systems operating at the same time) DEC ECMP \ The E.C.M. button is being pressed and nobody else \ is operating their E.C.M., so decrease the value of \ ECMP to make it non-zero, to denote that our E.C.M. \ is now on JSR ECBLB2 \ Call ECBLB2 to light up the E.C.M. indicator bulb on \ the dashboard, set the E.C.M. countdown timer to 32, \ and start making the E.C.M. sound .MA64 \ --- Mod: Code removed for Elite-A: ------------------> \ LDA KY19 \ If "C" is being pressed, and we have a docking \ AND DKCMP \ computer fitted, keep going, otherwise jump down to \ BEQ MA68 \ MA68 to skip the following \ \ STA auto \ Set auto to the non-zero value of A, so the docking \ \ computer is activated \ --- End of removed code -----------------------------> .MA68 LDA #0 \ Set LAS = 0, to switch the laser off while we do the STA LAS \ following logic STA DELT4 \ Take the 16-bit value (DELTA 0) - i.e. a two-byte LDA DELTA \ number with DELTA as the high byte and 0 as the low LSR A \ byte - and divide it by 4, storing the 16-bit result ROR DELT4 \ in DELT4(1 0). This has the effect of storing the LSR A \ current speed * 64 in the 16-bit location DELT4(1 0) ROR DELT4 STA DELT4+1 LDA LASCT \ If LASCT is zero, keep going, otherwise the laser is BNE MA3 \ a pulse laser that is between pulses, so jump down to \ MA3 to skip the following LDA KY7 \ If "A" is being pressed, keep going, otherwise jump BEQ MA3 \ down to MA3 to skip the following LDA GNTMP \ If the laser temperature >= 242 then the laser has CMP #242 \ overheated, so jump down to MA3 to skip the following BCS MA3 LDX VIEW \ If the current space view has a laser fitted (i.e. the LDA LASER,X \ laser power for this view is greater than zero), then BEQ MA3 \ keep going, otherwise jump down to MA3 to skip the \ following \ If we get here, then the "fire" button is being \ pressed, our laser hasn't overheated and isn't already \ being fired, and we actually have a laser fitted to \ the current space view, so it's time to hit me with \ those laser beams PHA \ Store the current view's laser power on the stack \ --- Mod: Code removed for Elite-A: ------------------> \ AND #%01111111 \ Set LAS and LAS2 to bits 0-6 of the laser power \ STA LAS \ STA LAS2 \ --- And replaced by: --------------------------------> AND #%01111111 \ Set LAS and LAS2 to bits 0-6 of the laser power STA LAS2 STA LAS \ --- End of replacement ------------------------------> LDA #0 \ Call the NOISE routine with A = 0 to make the sound JSR NOISE \ of our laser firing JSR LASLI \ Call LASLI to draw the laser lines PLA \ Restore the current view's laser power into A BPL ma1 \ If the laser power has bit 7 set, then it's an "always \ on" laser rather than a pulsing laser, so keep going, \ otherwise jump down to ma1 to skip the following \ instruction LDA #0 \ This is an "always on" laser (i.e. a beam laser or a \ military laser), so set A = 0, which will be stored in \ LASCT to denote that this is not a pulsing laser .ma1 \ --- Mod: Code removed for Elite-A: ------------------> \ AND #%11111010 \ LASCT will be set to 0 for beam lasers, and to the \ STA LASCT \ laser power AND %11111010 for pulse lasers, which \ \ comes to 10 (as pulse lasers have a power of 15). See \ \ MA23 below for more on laser pulsing and LASCT \ --- And replaced by: --------------------------------> STA LASCT \ LASCT will be set to 0 for beam lasers, and to the \ laser power (15) for pulse lasers. See MS23 below \ for more on laser pulsing and LASCT \ --- End of replacement ------------------------------>