Skip to navigation

Elite on the BBC Micro and NES

Flight: Ghy

[BBC Micro cassette version]

Name: Ghy [Show more] Type: Subroutine Category: Flight Summary: Perform a galactic hyperspace jump Deep dive: Twisting the system seeds Galaxy and system seeds
Context: See this subroutine in context in the source code Variations: See code variations for this subroutine in the different versions References: This subroutine is called as follows: * hyp calls Ghy * hyp calls via zZ+1

Engage the galactic hyperdrive. Called from the hyp routine above if CTRL-H is being pressed. This routine also updates the galaxy seeds to point to the next galaxy. Using a galactic hyperdrive rotates each seed byte to the left, rolling each byte left within itself like this: 01234567 -> 12345670 to get the seeds for the next galaxy. So after 8 galactic jumps, the seeds roll round to those of the first galaxy again. We always arrive in a new galaxy at galactic coordinates (96, 96), and then find the nearest system and set that as our location.
Other entry points: zZ+1 Contains an RTS
.Ghy IF _TEXT_SOURCES JSR TT111 \ Call TT111 to set the current system to the nearest \ system to (QQ9, QQ10), and put the seeds of the \ nearest system into QQ15 to QQ15+5 \ \ This appears to be a failed attempt to fix a bug in \ the cassette version, where the galactic hyperdrive \ will take us to coordinates (96, 96) in the new \ galaxy, even if there isn't actually a system there, \ so if we jump when you are low on fuel, it is \ possible to get stuck in the middle of nowhere when \ changing galaxy \ \ All the other versions contain a fix for this bug that \ involves adding an extra JSR TT111 instruction after \ the coordinates are set to (96, 96) below, which finds \ the nearest system to those coordinates and sets that \ as the current system \ \ The cassette version on the original source disc \ doesn't contain this instruction, and although the \ text sources do, it's in the wrong place at the start \ of the Ghy routine, as the fix only works if it's done \ after the new coordinates are set, not before ENDIF LDX GHYP \ Fetch GHYP, which tells us whether we own a galactic BEQ hy5 \ hyperdrive, and if it is zero, which means we don't, \ return from the subroutine (as hy5 contains an RTS) INX \ We own a galactic hyperdrive, so X is &FF, so this \ instruction sets X = 0 STX QQ8 \ Set the distance to the selected system in QQ8(1 0) STX QQ8+1 \ to 0 STX GHYP \ The galactic hyperdrive is a one-use item, so set GHYP \ to 0 so we no longer have one fitted STX FIST \ Changing galaxy also clears our criminal record, so \ set our legal status in FIST to 0 ("clean") JSR wW \ Call wW to start the hyperspace countdown LDX #5 \ To move galaxy, we rotate the galaxy's seeds left, so \ set a counter in X for the 6 seed bytes INC GCNT \ Increment the current galaxy number in GCNT LDA GCNT \ Set GCNT = GCNT mod 8, so we jump from galaxy 7 back AND #7 \ to galaxy 0 (shown in-game as going from galaxy 8 back STA GCNT \ to the starting point in galaxy 1) .G1 LDA QQ21,X \ Load the X-th seed byte into A ASL A \ Set the C flag to bit 7 of the seed ROL QQ21,X \ Rotate the seed in memory, which will add bit 7 back \ in as bit 0, so this rolls the seed around on itself DEX \ Decrement the counter BPL G1 \ Loop back for the next seed byte, until we have \ rotated them all \JSR DORND \ This instruction is commented out in the original \ source, and would set A and X to random numbers, so \ perhaps the original plan was to arrive in each new \ galaxy in a random place? .zZ LDA #96 \ Set (QQ9, QQ10) to (96, 96), which is where we always STA QQ9 \ arrive in a new galaxy (the selected system will be STA QQ10 \ set to the nearest actual system later on) JSR TT110 \ Call TT110 to show the front space view LDA #116 \ Print recursive token 116 (GALACTIC HYPERSPACE ") JSR MESS \ as an in-flight message \ Fall through into jmp to set the system to the \ current system and return from the subroutine there