Skip to navigation


Flight: Ghy

[NES version, Bank 0]

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 References: This subroutine is called as follows: * GalacticHyperdrive calls Ghy

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 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 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 UpdateIconBar_b3 ; Update the icon bar to remove the galactic hyperdrive ; button as we no longer have one LDA #1 ; Call wW2 with A = 1 to start the hyperspace countdown, JSR wW2 ; but starting the countdown from 1 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 ; Clear bit 3 of GCNT, so we jump from galaxy 7 back AND #%11110111 ; to galaxy 0 (shown in-game as going from galaxy 8 back STA GCNT ; to the starting point in galaxy 1). We also retain any ; set bits in the high nibble, so if the galaxy number ; is manually set to 16 or higher, it will stay high ; (though the high nibble doesn't seem to get set by ; the game at any point, so it isn't clear what this is ; for, though Lave in galaxy 16 does show a unique ; system description override, so something is going on ; here...) .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 .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 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 call fixes 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 we are ; low on fuel, it is possible to get stuck in the ; middle of nowhere when changing galaxy ; ; This call sets the current system correctly, so we ; always arrive at the nearest system to (96, 96) LDX #5 ; We now want to copy those seeds into safehouse, so we ; so set a counter in X to copy 6 bytes .dumdeedum LDA QQ15,X ; Copy the X-th byte of QQ15 into the X-th byte of STA safehouse,X ; safehouse DEX ; Decrement the loop counter BPL dumdeedum ; Loop back to copy the next byte until we have copied ; all six seed bytes LDX #0 ; Set the distance to the selected system in QQ8(1 0) STX QQ8 ; to 0 STX QQ8+1 LDY #22 ; Call the NOISE routine with Y = 22 to make the JSR NOISE ; galactic hyperspace sound ; Fall through into jmp to set the system to the ; current system and return from the subroutine there