Skip to navigation

Elite on the BBC Micro

List of all subroutines [Master version]

This index contains every subroutine and entry point that appears in the source code for the BBC Master version of Elite, grouped by category. An entry points is a label within a subroutine that is called from outside the subroutine, which typically implements a subset or variation of the functionality of the parent subroutine.

Charts
------

hmSelect the closest system and redraw the chart crosshairs
HME2Search the galaxy for a system
TT103Draw a small set of crosshairs on a chart
TT105Draw crosshairs on the Short-range Chart, with clipping
TT114Display either the Long-range or Short-range Chart
TT123Move galactic coordinates by a signed delta
TT16Move the crosshairs on a chart
TT180Contains an RTS
TT22Show the Long-range Chart (red key f4)
TT23Show the Short-range Chart (red key f5)

Dashboard
---------

ABORTDisarm missiles and update the dashboard indicators
ABORT2Set/unset the lock target for a missile and update the dashboard
BULB2Switch main memory back into &3000-&7FFF and return from the subroutine
BUMP2Bump up the value of the pitch or roll dashboard indicator
cntrApply damping to the pitch or roll dashboard indicator
COMPASUpdate the compass
DIALS (Part 1 of 4)Update the dashboard: speed indicator
DIALS (Part 2 of 4)Update the dashboard: pitch and roll indicators
DIALS (Part 3 of 4)Update the dashboard: four energy banks
DIALS (Part 4 of 4)Update the dashboard: shields, fuel, laser & cabin temp, altitude
DILThe range of the indicator is 0-16 (for the energy banks)
DIL-1The range of the indicator is 0-32 (for the speed indicator)
DIL2Update the roll or pitch indicator on the dashboard
DILXUpdate a bar-based indicator on the dashboard
DILX+2The range of the indicator is 0-64 (for the fuel indicator)
DOTDraw a dash on the compass
ECBLBLight up the E.C.M. indicator bulb ("E") on the dashboard
ECBLB2Start up the E.C.M. (indicator, start countdown and make sound)
MSBARDraw a specific indicator in the dashboard's missile bar
msblobDisplay the dashboard's missile indicators in green
PZWFetch the current dashboard colours, to support flashing
PZW2Fetch the current dashboard colours for non-striped indicators, to support flashing
RE2+2Restore A from T and return from the subroutine
REDU2Reduce the value of the pitch or roll dashboard indicator
SCANDisplay the current ship on the scanner
SP1Draw the space station on the compass
SP2Draw a dot on the compass, given the planet/station vector
SPBLBLight up the space station indicator ("S") on the dashboard
WPSHPSClear the scanner, reset the ball line and sun line heaps

Drawing circles
---------------

BLINEDraw a circle segment and add it to the ball line heap
CHKONCheck whether any part of a circle appears on the extended screen
CIRCLEDraw a circle for the planet
CIRCLE2Draw a circle (for the planet or chart)
HFS1Don't clear the screen, and draw 8 concentric rings with the step size in STP
HFS2Draw the launch or hyperspace tunnel
LAUNMake the launch sound and draw the launch tunnel
LL164Make the hyperspace sound and draw the hyperspace tunnel
TT128Draw a circle on a chart
TT14Draw a circle with crosshairs on a chart

Drawing lines
-------------

BOMBFXErase the energy bomb zig-zag lightning bolt, make the sound of the energy bomb going off, draw a new bolt and repeat four times
BOMBINITRandomise and draw the energy bomb's zig-zag lightning bolt lines
BOMBLINESDraw the zig-zag lightning bolt for the energy bomb
DVLOINDraw a horizontal line from (A, 24) to (A, 152)
EDGESDraw a horizontal line given a centre and a half-width
HLOINDraw a horizontal line from (X1, Y1) to (X2, Y1)
HLOIN2Remove a line from the sun line heap and draw it on-screen
HLOIN3Draw a line from (X, Y1) to (X2, Y1) in the colour given in A
LASLIDraw the laser lines for when we fire our lasers
LASLI-1Contains an RTS
LASLI2Just draw the current laser lines without moving the centre point, draining energy or heating up. This has the effect of removing the lines from the screen
LL118Move a point along a line until it is on-screen
LL118-1Contains an RTS
LL145 (Part 1 of 4)Clip line: Work out which end-points are on-screen, if any
LL145 (Part 2 of 4)Clip line: Work out if any part of the line is on-screen
LL145 (Part 3 of 4)Clip line: Calculate the line's gradient
LL145 (Part 4 of 4)Clip line: Call the routine in LL188 to do the actual clipping
LL147Don't initialise the values in SWAP or A
LL30Draw a one-segment line
LLX30Draw a ship line using flicker-free animation
LOIN (Part 1 of 7)Draw a line: Calculate the line gradient in the form of deltas
LOIN (Part 2 of 7)Draw a line: Line has a shallow gradient, step right along x-axis
LOIN (Part 3 of 7)Draw a shallow line going right and up or left and down
LOIN (Part 4 of 7)Draw a shallow line going right and down or left and up
LOIN (Part 5 of 7)Draw a line: Line has a steep gradient, step up along y-axis
LOIN (Part 6 of 7)Draw a steep line going up and left or down and right
LOIN (Part 7 of 7)Draw a steep line going up and right or down and left
NLINDraw a horizontal line at pixel row 23 to box in a title
NLIN2Draw a screen-wide horizontal line at the pixel row in A
NLIN2-2Move the text cursor down one line before drawing the line
NLIN3Print a title and a horizontal line at row 19 to box it in
NLIN4Draw a horizontal line at pixel row 19 to box in a title
TT15Draw a set of crosshairs

Drawing pixels
--------------

CPIX2Draw a single-height dash on the dashboard
PIX (Loader)Draw a single pixel at a specific coordinate
PIXELDraw a 1-pixel dot, 2-pixel dash or 4-pixel square
PIXEL2Draw a stardust particle relative to the screen centre
PX4Contains an RTS

Drawing planets
---------------

PL2Remove the planet or sun from the screen
PL2-1Contains an RTS
PL21Return from a planet/sun-drawing routine with a failure flag
PL44Clear the C flag and return from the subroutine
PL9 (Part 1 of 3)Draw the planet, with either an equator and meridian, or a crater
PL9 (Part 2 of 3)Draw the planet's equator and meridian
PL9 (Part 3 of 3)Draw the planet's crater
PLANETDraw the planet or sun
PLL1 (Loader)Draw Saturn on the loading screen
PLS1Calculate (Y A) = nosev_x / z
PLS2Draw a half-circle
PLS22Draw a circle or half-circle
PLS3Calculate (Y A P) = 222 * roofv_x / z
PLS4Calculate CNT2 = arctan(P / A) / 4
PLS5Calculate roofv_x / z and roofv_y / z
PLS6Calculate (X K) = (A P) / (z_sign z_hi z_lo)
WP1Reset the ball line heap
WPLS2Remove the planet from the screen

Drawing ships
-------------

DOEXPDraw an exploding ship
EE51Remove the current ship from the screen, called from SHPPT before drawing the ship as a point
LL10-1Contains an RTS
LL70+1Contains an RTS (as the first byte of an LDA instruction)
LL81+2Draw the contents of the ship line heap, used to draw the ship as a dot from SHPPT
LL9 (Part 1 of 12)Draw ship: Check if ship is exploding, check if ship is in front
LL9 (Part 2 of 12)Draw ship: Check if ship is in field of view, close enough to draw
LL9 (Part 3 of 12)Draw ship: Set up orientation vector, ship coordinate variables
LL9 (Part 4 of 12)Draw ship: Set visibility for exploding ship (all faces visible)
LL9 (Part 5 of 12)Draw ship: Calculate the visibility of each of the ship's faces
LL9 (Part 6 of 12)Draw ship: Calculate the visibility of each of the ship's vertices
LL9 (Part 7 of 12)Draw ship: Calculate the visibility of each of the ship's vertices
LL9 (Part 8 of 12)Draw ship: Calculate the screen coordinates of visible vertices
LL9 (Part 9 of 12)Draw ship: Draw laser beams if the ship is firing its laser at us
LL9 (Part 10 of 12)Draw ship: Calculate the visibility of each of the ship's edges and draw the visible ones using flicker-free animation
LL9 (Part 11 of 12)Draw ship: Loop back for the next edge
LL9 (Part 12 of 12)Draw ship: Draw all the visible edges from the ship line heap
PROJProject the current ship onto the screen
SHPPTDraw a distant ship as a point rather than a full wireframe

Drawing suns
------------

FLFLLSReset the sun line heap
RTS2Contains an RTS
SUN (Part 1 of 4)Draw the sun: Set up all the variables needed
SUN (Part 2 of 4)Draw the sun: Start from bottom of screen and erase the old sun
SUN (Part 3 of 4)Draw the sun: Continue to move up the screen, drawing the new sun
SUN (Part 4 of 4)Draw the sun: Continue to the top of the screen, erasing old sun
WPLSRemove the sun from the screen
WPLS-1Contains an RTS

Equipment
---------

cContains an RTS
eqSubtract the price of equipment from the cash pot
EQSHPShow the Equip Ship screen (red key f3)
errBeep, pause and go to the docking bay (i.e. show the Status Mode screen)
presGiven an item number A with the item name in recursive token Y, show an error to say that the item is already present, refund the cost of the item, and then beep and exit to the docking bay (i.e. show the Status Mode screen)
prxReturn the price of a piece of equipment
prx-3Return the price of the item with number A - 1 c Contains an RTS
qvPrint a menu of the four space views, for buying lasers
refundInstall a new laser, processing a refund if applicable

Flight
------

DCS1Calculate the vector from the ideal docking position to the ship
DENGYDrain some energy from the energy banks
DOCKITApply docking manoeuvres to the ship in INWK
DOENTRYDock at the space station, show the ship hanger and work out any mission progression
ESCAPELaunch our escape pod
GhyPerform a galactic hyperspace jump
hypStart the hyperspace process
LO2Contains an RTS
LOOK1Initialise the space view
MJPProcess a mis-jump into witchspace
OOPSTake some damage
OUCHPotentially lose cargo or equipment following damage
ptgCalled when the user manually forces a mis-jump RTS111 Contains an RTS
RTS111Contains an RTS
SESCPSpawn an escape pod from the current (parent) ship
SHDCharge a shield and drain some energy from the energy banks
SIGHTDraw the laser crosshairs
TT110Launch from a station or show the front space view
TT18Try to initiate a jump into hyperspace
TTX110Set the current system to the nearest system and return to hyp
TTX111Used to rejoin this routine from the call to TTX110
WARPPerform an in-system jump
wWStart a hyperspace countdown
wW2Start the hyperspace countdown, starting the countdown from the value in A
zZ+1Contains an RTS

Inventory
---------

NWDAVxxUsed to rejoin this routine from the call to NWDAV4
TT210Show a list of current cargo in our hold, optionally to sell
TT213Show the Inventory screen (red key f9)
TT214Ask a question with a "Y/N?" prompt and return the response

Keyboard
--------

bufThe two OSWORD size bytes for transmitting the key logger from the I/O processor to the parasite
CTRLScan the keyboard to see if CTRL is currently pressed
CTRLmcScan the Master Compact keyboard to see if CTRL is currently pressed
DJOYScan the keyboard for cursor key or digital joystick movement
DK4Scan for pause, configuration and secondary flight keys
DKS3Toggle a configuration setting and emit a beep
DKS4Scan the keyboard to see if a specific key is being pressed
DKS4mcScan the Master Compact keyboard to see if a specific key is being pressed
DOKEYScan for the seven primary flight controls
FLKBFlush the keyboard buffer
GETYNWait until either "Y" or "N" is pressed
outContains an RTS t As TT217 but don't preserve Y, set it to YSAV instead
PAS1Display a rotating ship at space coordinates (0, 120, 256) and scan the keyboard
PAUSEDisplay a rotating ship, waiting until a key is pressed, then remove the ship from the screen
PAUSE2Wait until a key is pressed, ignoring any existing key press
RDFIRERead the fire button on either the analogue or digital joystick
RDJOYRead from either the analogue or digital joystick
RDKEYScan the keyboard for key presses
RDKEY-1Only scan the keyboard for valid BCD key numbers
RDKEY2Scan the keyboard for a flight key and update the key logger
RETURNScan the keyboard to see if RETURN is currently pressed
SHIFTScan the keyboard to see if SHIFT is currently pressed
tAs TT217 but don't preserve Y, set it to YSAV instead
T95Print the distance to the selected system
TT102Process function key, save key, hyperspace and chart key presses and update the hyperspace counter
TT17Scan the keyboard for cursor key or joystick movement
TT17XScan the digital joystick for movement
TT217Scan the keyboard until a key is pressed
U%Clear the key logger

Loader
------

BEGINInitialise the configuration variables and start the game
Elite loader (Loader)Perform a number of OS calls, check for sideways RAM, load and move the main game data, and load and run the main game code
S%Move code, set up break handler and start the game
STARTUPSet the various vectors, interrupts and timers

Main loop
---------

FRCEThe entry point for the main game loop if we want to jump straight to a specific screen, by pretending to "press" a key, in which case A contains the internal key number of the key we want to "press"
GOINWe jump here from part 3 of the main flight loop if the docking computer is activated by pressing "C"
M%The entry point for the main flight loop
Main flight loop (Part 1 of 16)Seed the random number generator
Main flight loop (Part 2 of 16)Calculate the alpha and beta angles from the current pitch and roll of our ship
Main flight loop (Part 3 of 16)Scan for flight keys and process the results
Main flight loop (Part 4 of 16)For each nearby ship: Copy the ship's data block from K% to the zero-page workspace at INWK
Main flight loop (Part 5 of 16)For each nearby ship: If an energy bomb has been set off, potentially kill this ship
Main flight loop (Part 6 of 16)For each nearby ship: Move the ship in space and copy the updated INWK data block back to K%
Main flight loop (Part 7 of 16)For each nearby ship: Check whether we are docking, scooping or colliding with it
Main flight loop (Part 8 of 16)For each nearby ship: Process us potentially scooping this item
Main flight loop (Part 9 of 16)For each nearby ship: If it is a space station, check whether we are successfully docking with it
Main flight loop (Part 10 of 16)For each nearby ship: Remove if scooped, or process collisions
Main flight loop (Part 11 of 16)For each nearby ship: Process missile lock and firing our laser
Main flight loop (Part 12 of 16)For each nearby ship: Draw the ship, remove if killed, loop back
Main flight loop (Part 13 of 16)Show energy bomb effect, charge shields and energy banks
Main flight loop (Part 14 of 16)Spawn a space station if we are close enough to the planet
Main flight loop (Part 15 of 16)Perform altitude checks with the planet and sun and process fuel scooping if appropriate
Main flight loop (Part 16 of 16)Process laser pulsing, E.C.M. energy drain, call stardust routine
Main game loop (Part 1 of 6)Spawn a trader (a Cobra Mk III, Python, Boa or Anaconda)
Main game loop (Part 2 of 6)Call the main flight loop, and potentially spawn a trader, an asteroid, or a cargo canister
Main game loop (Part 3 of 6)Potentially spawn a cop, particularly if we've been bad
Main game loop (Part 4 of 6)Potentially spawn a lone bounty hunter, a Thargoid, or up to four pirates
Main game loop (Part 5 of 6)Cool down lasers, make calls to update the dashboard
Main game loop (Part 6 of 6)Process non-flight key presses (red function keys, docked keys)
MAL1Marks the beginning of the ship analysis loop, so we can jump back here from part 12 of the main flight loop to work our way through each ship in the local bubble. We also jump back here when a ship is removed from the bubble, so we can continue processing from the next ship
me3Used by me2 to jump back into the main game loop after printing an in-flight message
MLOOPThe entry point for the main game loop. This entry point comes after the call to the main flight loop and spawning routines, so it marks the start of the main game loop for when we are docked (as we don't need to call the main flight loop or spawning routines if we aren't in space)
TT100The entry point for the start of the main game loop, which calls the main flight loop and the moves into the spawning routine

Market
------

BAY2Jump into the main loop at FRCE, setting the key "pressed" to red key f9 (so we show the Inventory screen)
gnumGet a number from the keyboard
NWDAV4Print an "ITEM?" error, make a beep and rejoin the TT210 routine
OUTThe OUTX routine jumps back here after printing the key that was just pressed
tnprWork out if we have space for a specific amount of cargo
tnpr1Work out if we have space for one tonne of cargo
TT151Print the name, price and availability of a market item
TT152Print the unit ("t", "kg" or "g") for a market item
TT160Print "t" (for tonne) and a space
TT161Print "kg" (for kilograms)
TT163Print the headers for the table of market prices
TT167Show the Market Price screen (red key f7)
TT16aPrint "g" (for grams)
TT208Show the Sell Cargo screen (red key f2)
TT219Show the Buy Cargo screen (red key f1)
varCalculate QQ19+3 = economy * |economic_factor|

Maths (Arithmetic)
------------------

ADDCalculate (A X) = (A P) + (S R)
ADD_DUPLICATECalculate (A X) = (A P) + (S R)
DV41Calculate (P R) = 256 * DELTA / A
DV42Calculate (P R) = 256 * DELTA / z_hi
DVID3B2Calculate K(3 2 1 0) = (A P+1 P) / (z_sign z_hi z_lo)
DVID4Calculate (P R) = 256 * A / Q
DVID4_DUPLICATECalculate (P R) = 256 * A / Q
DVIDTCalculate (P+1 A) = (A P) / Q
FMLTUCalculate A = A * Q / 256
FMLTU2Calculate A = K * sin(A)
GC2Calculate (Y X) = (A P) * 4
GCASHCalculate (Y X) = P * Q * 4
LCASHSubtract an amount of cash from the cash pot
LL120Calculate (Y X) = (S x1_lo) * XX12+2 or (S x1_lo) / XX12+2
LL121Calculate (Y X) = (S R) / Q and set the sign to the opposite of the top byte on the stack
LL122Calculate (Y X) = (S R) * Q and set the sign to the opposite of the top byte on the stack
LL123Calculate (Y X) = (S R) / XX12+2 or (S R) * XX12+2
LL128Contains an RTS
LL129Calculate Q = XX12+2, A = S EOR XX12+3 and (S R) = |S R|
LL133Negate (Y X) and return from the subroutine LL128 Contains an RTS
LL28Calculate R = 256 * A / Q
LL28+4Skips the A >= Q check and always returns with C flag cleared, so this can be called if we know the division will work
LL31Skips the A >= Q check and does not set the R counter, so this can be used for jumping straight into the division loop if R is already set to 254 and we know the division will work
LL38Calculate (S A) = (S R) + (A Q)
LL5Calculate Q = SQRT(R Q)
LL61Calculate (U R) = 256 * A / Q
LL62Calculate 128 - (U R)
MADCalculate (A X) = Q * A + (S R)
MAS3Calculate A = x_hi^2 + y_hi^2 + z_hi^2 in the K% block
MCASHAdd an amount of cash to the cash pot
MLS1Calculate (A P) = ALP1 * A
MLS2Calculate (S R) = XX(1 0) and (A P) = A * ALP1
MLTU2Calculate (A P+1 P) = (A ~P) * Q
MLTU2-2Set Q to X, so this calculates (A P+1 P) = (A ~P) * X
MLU1Calculate Y1 = y_hi and (A P) = |y_hi| * Q for Y-th stardust
MLU2Calculate (A P) = |A| * Q
MU1Copy X into P and A, and clear the C flag
MU11Calculate (A P) = P * X
MU5Set K(3 2 1 0) = (A A A A) and clear the C flGag
MU6Set P(1 0) = (A A)
MULT1Calculate (A P) = Q * A
MULT12Calculate (S R) = Q * A
MULT3Calculate K(3 2 1 0) = (A P+1 P) * Q
MULTS-2Calculate (A P) = X * A
MULTUCalculate (A P) = P * Q
MUT1Calculate R = XX and (A P) = Q * A
MUT2Calculate (S R) = XX(1 0) and (A P) = Q * A
MUT3Unused routine that does the same as MUT2
PIX1Calculate (YY+1 SYL+Y) = (A P) + (S R) and draw stardust particle
ROOT (Loader)Calculate ZP = SQRT(ZP(1 0))
SPS2Calculate (Y X) = A / 10
SQUAClear bit 7 of A and calculate (A P) = A * A
SQUA2Calculate (A P) = A * A
SQUA2 (Loader)Calculate (A P) = A * A
TAS1Calculate K3 = (x_sign x_hi x_lo) - V(1 0)
TIS1Calculate (A ?) = (-X * A + (S R)) / 96
TIS2Calculate A = A / Q
TIS3Calculate -(nosev_1 * roofv_1 + nosev_2 * roofv_2) / nosev_3
TT113Contains an RTS
VCSU1Calculate vector K3(8 0) = [x y z] - coordinates of the sun or space station
VCSUBCalculate vector K3(8 0) = [x y z] - coordinates in (A V)

Maths (Geometry)
----------------

ARCRTSContains an RTS
ARCTANCalculate A = arctan(P / Q)
FAROFCompare x_hi, y_hi and z_hi with 224
FAROF2Compare x_hi, y_hi and z_hi with A
LL51Calculate the dot product of XX15 and XX16
mDo not include A in the calculation
MA9Contains an RTS
MAS1Add an orientation vector coordinate to an INWK coordinate
MAS2Calculate a cap on the maximum distance to the planet or sun
MAS4Calculate a cap on the maximum distance to a ship
NO1Contains an RTS
NORMNormalise the three-coordinate vector in XX15
SPS1Calculate the vector to the planet and store it in XX15
SPS1+1A BRK instruction
SPS3Copy a space coordinate from the K% block into K3
SPS4Calculate the vector to the space station
TA2Calculate the length of the vector in XX15 (ignoring the low coordinates), returning it in Q
TAS2Normalise the three-coordinate vector in K3
TAS3Calculate the dot product of XX15 and an orientation vector
TAS4Calculate the dot product of XX15 and one of the space station's orientation vectors
TAS6Negate the vector in XX15 so it points in the opposite direction
TIDYOrthonormalise the orientation vectors for a ship

Missions
--------

BRIEFStart mission 1 and show the mission briefing
BRIEF2Start mission 2
BRIEF3Receive the briefing and plans for mission 2
BRISClear the screen, display "INCOMING MESSAGE" and wait for 2 seconds
BRPPrint an extended token and show the Status Mode screen
BRPSPrint the extended token in A, show the Status Mode screen and return from the subroutine
DEBRIEFFinish mission 1
DEBRIEF2Finish mission 2
THERECheck whether we are in the Constrictor's system in mission 1

Moving
------

MV40Rotate the planet or sun's location in space by the amount of pitch and roll of our ship
MV45Rejoin the MVEIT routine after the rotation, tactics and scanner code
MVEIT (Part 1 of 9)Move current ship: Tidy the orientation vectors
MVEIT (Part 2 of 9)Move current ship: Call tactics routine, remove ship from scanner
MVEIT (Part 3 of 9)Move current ship: Move ship forward according to its speed
MVEIT (Part 4 of 9)Move current ship: Apply acceleration to ship's speed as a one-off
MVEIT (Part 5 of 9)Move current ship: Rotate ship's location by our pitch and roll
MVEIT (Part 6 of 9)Move current ship: Move the ship in space according to our speed
MVEIT (Part 7 of 9)Move current ship: Rotate ship's orientation vectors by pitch/roll
MVEIT (Part 8 of 9)Move current ship: Rotate ship about itself by its own pitch/roll
MVEIT (Part 9 of 9)Move current ship: Redraw on scanner, if it hasn't been destroyed
MVS4Apply pitch and roll to an orientation vector
MVS5Apply a 3.6 degree pitch or roll to an orientation vector
MVT1Calculate (x_sign x_hi x_lo) = (x_sign x_hi x_lo) + (A R)
MVT1-2Clear bits 0-6 of A before entering MVT1
MVT3Calculate K(3 2 1) = (x_sign x_hi x_lo) + K(3 2 1)
MVT6Calculate (A P+2 P+1) = (x_sign x_hi x_lo) + (A P+2 P+1)
SFS2Move a ship in space along one of the coordinate axes

Save and load
-------------

BRKBKSet the standard BRKV handler for the game
CATSAsk for a disc drive number and print a catalogue of that drive
CHECKCalculate the checksum for the last saved commander data block
DELTCatalogue a disc, ask for a filename to delete, and delete the file
DELT-1Contains an RTS
GTDIRFetch the name of an ADFS directory on the Master Compact and change to that directory
GTDRVGet an ASCII disc drive drive number from the keyboard
GTNMEWFetch the name of a commander file to save or load
JAMESONRestore the default JAMESON commander
LOADLoad the commander file
LODLoad a commander file
LORSet the C flag and return from the subroutine
SAVESave the commander file
SVEDisplay the disc access menu and process saving of commander files
TR1Copy the last saved commander's name from NA% to INWK
TRNMECopy the last saved commander's name from INWK to NA%

Screen mode
-----------

DET1Show or hide the dashboard (for when we die)
DOVDU19Change the mode 1 palette
IRQ1The main screen-mode interrupt handler (IRQ1V points here)
WSCANImplement the #wscn command (wait for the vertical sync)

Ship hanger
-----------

HA3Contains an RTS
HALLDraw the ships in the ship hanger, then draw the hanger
HANGERDisplay the ship hanger
HAS1Draw a ship in the ship hanger
HAS2Draw a hanger background line from left to right
HAS3Draw a hanger background line from right to left

Sound
-----

BEEPMake a short, high beep
BELLMake a standard system beep
ECMOFSwitch off the E.C.M.
ECMOF-1Contains an RTS
EXNOMake the sound of a laser strike or ship explosion
EXNO-2Set X = 7 and fall through into EXNO to make the sound of a ship exploding
EXNO2Process us making a kill
EXNO3Make an explosion sound
LOWBEEPMake a long, low beep
NOISEMake the sound whose number is in Y by populating the sound buffer
NOISE2Process the contents of the sound buffer and send it to the sound chip
NOISEHITMake the sound of us being hit
NOISELASERMake the sound of our laser firing
SOUNDWrite sound data directly to the 76489 sound chip
SRESETReset the sound buffer and turn off all sound channels
SRTSContains an RTS

Stardust
--------

FLIPReflect the stardust particles in the screen diagonal
nWqCreate a random cloud of stardust
NWSTARSInitialise the stardust field
STARSThe main routine for processing the stardust
STARS1Process the stardust for the front view
STARS2Process the stardust for the left or right view
STARS6Process the stardust for the rear view

Start and end
-------------

BR1 (Part 1 of 2)Start or restart the game
BR1 (Part 2 of 2)Show the "Load New Commander (Y/N)?" screen and start the game
DEATHDisplay the death screen
DEATH2Reset most of the game and restart from the title screen
QU5Restart the game using the last saved commander without asking whether to load a new commander file
RES2Reset a number of flight variables and workspaces
RESETReset most variables
TITLEDisplay a title screen with a rotating ship and prompt
TT170Main entry point for the Elite game code

Status
------

BADCalculate how bad we have been
BAYGo to the docking bay (i.e. show the Status Mode screen)
STATUSShow the Status Mode screen (red key f8)

Tactics
-------

ANGRYMake a ship hostile
fq1Used to add a cargo canister to the universe
FR1Display the "missile jammed" message
FR1-2Clear the C flag and return from the subroutine
FRMISFire a missile from our ship
FRS1Launch a ship straight ahead of us, below the laser sights
GOPLMake the ship head towards the planet
HI1Contains an RTS
HITCHWork out if the ship in INWK is in our crosshairs
SFRMISAdd an enemy missile to our local bubble of universe
TA151Make the ship head towards the planet
TACTICS (Part 1 of 7)Apply tactics: Process missiles, both enemy missiles and our own
TACTICS (Part 2 of 7)Apply tactics: Escape pod, station, lone Thargon, safe-zone pirate
TACTICS (Part 3 of 7)Apply tactics: Calculate dot product to determine ship's aim
TACTICS (Part 4 of 7)Apply tactics: Check energy levels, maybe launch escape pod if low
TACTICS (Part 5 of 7)Apply tactics: Consider whether to launch a missile at us
TACTICS (Part 6 of 7)Apply tactics: Consider firing a laser at us, if aim is true
TACTICS (Part 7 of 7)Apply tactics: Set pitch, roll, and acceleration

Text
----

BPRNTPrint a 32-bit number, left-padded to a specific number of digits, with an optional decimal point
CHPRPrint a character at the text cursor by poking into screen memory
cmnPrint the commander's name
cmn-1Contains an RTS
cplPrint the selected system name
crlfTab to column 21 and print a colon
cshPrint the current amount of cash
DASCDASC does exactly the same as TT26 and prints a character at the text cursor, with support for verified text in extended tokens
DETOKPrint an extended recursive token from the TKN1 token table
DETOK2Print an extended text token (1-255)
DETOK3Print an extended recursive token from the RUTOK token table
dnPrint the amount of cash and beep
dn2Make a short, high beep and delay for 0.5 seconds
DOXCMove the text cursor to a specific column
DOYCMove the text cursor to a specific row
DTENPrint recursive token number X from the token table pointed to by (A V), used to print tokens from the RUTOK table via calls to DETOK3
DTSPrint a single letter in the correct case
ee3Print the hyperspace countdown in the top-left of the screen
exPrint a recursive token
FEEDPrint a newline
fwlPrint fuel and cash levels
HEXPRNTPrint a number in hexadecimal (unused)
INCYCMove the text cursor to the next row
me1Erase an old in-flight message and display a new one
me2Remove an in-flight message from the space view
mes9Print a text token, possibly followed by " DESTROYED"
MESSDisplay an in-flight message
MT1Switch to ALL CAPS when printing extended tokens
MT13Switch to lower case when printing extended tokens
MT14Switch to justified text when printing extended tokens
MT15Switch to left-aligned text when printing extended tokens
MT16Print the character in variable DTW7
MT17Print the selected system's adjective, e.g. Lavian for Lave
MT18Print a random 1-8 letter word in Sentence Case
MT19Capitalise the next letter
MT2Switch to Sentence Case when printing extended tokens
MT23Move to row 10, switch to white text, and switch to lower case when printing extended tokens
MT26Fetch a line of text from the keyboard
MT27Print the captain's name during mission briefings
MT28Print the location hint during the mission 1 briefing
MT29Move to row 6, switch to white text, and switch to lower case when printing extended tokens
MT30Display the currently selected media (disc or tape)
MT31Display the non-selected media (disc or tape)
MT5Switch to extended tokens
MT6Switch to standard tokens in Sentence Case
MT8Tab to column 6 and start a new word when printing extended tokens
MT9Clear the screen and set the current view type to 1
ou2Display "E.C.M.SYSTEM DESTROYED" as an in-flight message
ou3Display "FUEL SCOOPS DESTROYED" as an in-flight message
OUTXPrint the character in Q before returning to gnum
PDESCPrint the system's extended description or a mission 1 directive
plfPrint a text token followed by a newline
plf2Print text followed by a newline and indent of 6 characters
pr2Print an 8-bit number, left-padded to 3 digits, and optional point
pr2+2Print the 8-bit number in X to the number of digits in A
pr5Print a 16-bit number, left-padded to 5 digits, and optional point
pr6Print 16-bit number, left-padded to 5 digits, no point
prqPrint a text token followed by a question mark
qwPrint a recursive token in the range 128-145
RR4Restore the registers and return from the subroutine
rT9Contains an RTS
spcPrint a text token followed by a space
talPrint the current galaxy number
TT11Print a 16-bit number, left-padded to n digits, and optional point
TT146Print the distance to the selected system in light years
TT147Print an error when a system is out of hyperspace range
TT162Print a space
TT162+2Jump to TT27 to print the text token in A
TT26Print a character at the text cursor, with support for verified text in extended tokens
TT27Print a text token
TT41Print a letter according to Sentence Case
TT42Print a letter in lower case
TT43Print a two-letter token or recursive token 0-95
TT44Jumps to TT26 to print the character in A (used to enable us to use a branch instruction to jump to TT26)
TT45Print a letter in lower case
TT46Print a character and switch to capitals
TT48Contains an RTS
TT60Print a text token and a paragraph break
TT67Print a newline
TT67_DUPLICATEPrint a newline
TT68Print a text token followed by a colon
TT69Set Sentence Case and print a newline
TT70Display "MAINLY " and jump to TT72
TT73Print a colon
TT74Print a character
TTX69Print a paragraph break
VOWELTest whether a character is a vowel
yplPrint the current system name
ypl-1Contains an RTS

Universe
--------

DISTCalculate the distance between the system with galactic coordinates (A, QQ15+1) and the system at (QQ0, QQ1), returning the result in QQ8(1 0)
GINFFetch the address of a ship's data block into INF
GTHGSpawn a Thargoid ship and a Thargon companion
GVLCalculate the availability of market items
hy5Contains an RTS
hyp1Process a jump to the system closest to (QQ9, QQ10)
hyp1+3Jump straight to the system at (QQ9, QQ10) without first calculating which system is closest. We do this if we already know that (QQ9, QQ10) points to a system
hyRContains an RTS
jmpSet the current system to the selected system
KILLSHPRemove a ship from our local bubble of universe
KS1Remove the current ship from our local bubble of universe
KS2Check the local bubble for missiles with target lock
KS3Set the SLSP ship heap pointer after shuffling ship slots
KS4Remove the space station and replace it with the sun
NwS1Flip the sign and double an INWK byte
NWSHPAdd a new ship to our local bubble of universe
NWSPSAdd a new space station to our local bubble of universe
ohContains an RTS SPIN2 Remove any randomness: spawn cargo of a specific type (given in X), and always spawn the number given in A
pingSet the selected system to the current system
SFS1Spawn a child ship from the current (parent) ship
SFS1-2Add a missile to the local bubble that has AI enabled, is hostile, but has no E.C.M.
SOLARSet up various aspects of arriving in a new system
SOLARXSet up various aspects of arriving in a new system, including Trumble breeding
SOS1Update the missile indicators, set up the planet data block
SPINRandomly spawn cargo from a destroyed ship
SPIN2Remove any randomness: spawn cargo of a specific type (given in X), and always spawn the number given in A
TT111Set the current system to the nearest system to a point
TT111-1Contains an RTS DIST Calculate the distance between the system with galactic coordinates (A, QQ15+1) and the system at (QQ0, QQ1), returning the result in QQ8(1 0)
TT20Twist the selected system's seeds four times
TT24Calculate system data from the system seeds
TT25Show the Data on System screen (red key f6)
TT54Twist the selected system's seeds
TT72Used by TT70 to re-enter the routine after displaying "MAINLY" for the economy type
TT81Set the selected system's seeds to those of system 0
ZeInitialise the INWK workspace to a hostile ship

Utility routines
----------------

BRBRThe standard BRKV handler for the game
clsClear the top part of the screen and draw a white border
CLYNSClear the bottom three text rows of the mode 4 screen
DECRYPTDecrypt a multi-page block of memory
DELAYWait for a specified time, in 1/50s of a second
DORNDGenerate random numbers
DORND (Loader)Generate random numbers
DORND2Make sure the C flag doesn't affect the outcome
NMICLAIMClaim the NMI workspace (&00A0 to &00A7)
NMIRELEASERelease the NMI workspace (&00A0 to &00A7)
OSB (Loader)A convenience routine for calling OSBYTE with Y = 0
SAVEZPSave zero page (&0090 to &00FF) into the buffer at &3000
SCALEXScale the x-coordinate in A
SCALEYScale the y-coordinate in A
SCALEY2Scale the y-coordinate in A
scrambleUnscramble the main code
SWAPZPSwap zero page (&0090 to &00EF) with the buffer at &3000
SWAPZP2An unused placeholder routine for swapping zero page bytes
TRADESet the palette for trading screens and switch the current colour to white
TRADEMODEClear the screen and set up a trading screen
TT66Clear the screen and set the current view type
TTX66Clear the top part of the screen and draw a white border
TTX662Clear the top part of the screen and draw a white border
ZEROReset the local bubble of universe and ship status
ZES1Zero-fill the page whose number is in X
ZES2Zero-fill a specific page
ZINFReset the INWK workspace and orientation vectors