Skip to navigation

Elite on the BBC Micro and NES

List of all subroutines

[6502 Second Processor version]

This index contains every subroutine and entry point that appears in the source code for the 6502 Second Processor 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)

Copy protection
---------------

ChecksumChecksum the code from &1000 to &9FFF and check against S%-1
DEEORDecrypt bytes between &1300 and &9FFF by EOR'ing them with their page offset
do65C02 (I/O processor)Reverse the order of all bytes between the addresses in (1 0) and (3 2) and start the game
SOMEPROT (I/O processor)Implement the OSWORD 249 command (some copy protection)

Dashboard
---------

ABORTDisarm missiles and update the dashboard indicators
ABORT2Set/unset the lock target for a missile and update the dashboard
ADPARAMS (I/O processor)Implement the OSWRCH 137 command (add a dashboard parameter and update the dashboard when all are received)
BUMP2Bump up the value of the pitch or roll dashboard indicator
cntrApply damping to the pitch or roll dashboard indicator
COMPASUpdate the compass
DIALSUpdate the dashboard indicators and flight variables by sending a #RDPARAMS command to the I/O processor
DIALS (Part 1 of 4) (I/O processor)Update the dashboard: speed indicator
DIALS (Part 2 of 4) (I/O processor)Update the dashboard: pitch and roll indicators
DIALS (Part 3 of 4) (I/O processor)Update the dashboard: four energy banks
DIALS (Part 4 of 4) (I/O processor)Update the dashboard: shields, fuel, laser & cabin temp, altitude
DIL (I/O processor)The range of the indicator is 0-16 (for the energy banks)
DIL-1 (I/O processor)The range of the indicator is 0-32 (for the speed indicator)
DIL2 (I/O processor)Update the roll or pitch indicator on the dashboard
DILX (I/O processor)Update a bar-based indicator on the dashboard
DILX+2 (I/O processor)The range of the indicator is 0-64 (for the fuel indicator)
djd1Auto-recentre the value in X, if keyboard auto-recentre is configured
DOBULB (I/O processor)Implement the #DOBULB 0 command (draw the space station indicator bulb)
DOT (I/O processor)Implement the #DOdot command (draw a dash on the compass)
ECBLBLight up the E.C.M. indicator bulb ("E") on the dashboard by sending a #DOBULB 255 command to the I/O processor
ECBLB (I/O processor)Implement the #DOBULB 255 command (draw the E.C.M. indicator bulb)
ECBLB2Start up the E.C.M. (light up the indicator, start the countdown and make the E.C.M. sound)
MSBARDraw a specific indicator in the dashboard's missile bar by sending a #DOmsbar command to the I/O processor
MSBAR (I/O processor)Implement the #DOmsbar command (draw a specific indicator in the dashboard's missile bar)
msblobDisplay the dashboard's missile indicators in green
PZW (I/O processor)Fetch the current dashboard colours, to support flashing
PZW2 (I/O processor)Fetch the current dashboard colours for non-striped indicators, to support flashing
RDPARAMS (I/O processor)Implement the #RDPARAMS command (start receiving a new set of parameters for updating the dashboard)
RE2+2Restore A from T and return from the subroutine
REDU2Reduce the value of the pitch or roll dashboard indicator
SC48 (I/O processor)Implement the #onescan command (draw a ship on the 3D scanner)
SCANDisplay the current ship on the scanner
SCANcolThe colour of the ship on the scanner SCANx1 The screen x-coordinate of the dot on the scanner
SCANflgThe sign of the stick height (in bit 7) SCANlen The stick height for the ship on the scanner
SCANlenThe stick height for the ship on the scanner SCANcol The colour of the ship on the scanner
SCANx1The screen x-coordinate of the dot on the scanner SCANy1 The screen y-coordinate of the dot on the scanner
SCANy1The screen y-coordinate of the dot 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 by sending a #DOBULB 0 command to the I/O processor
WPSHPSClear the scanner, reset the ball line and sun line heaps

Demo
----

DEMONShow the demo
GRIDSETPopulate the line coordinate tables with the lines for the scroll text
GRS1Populate the line coordinate tables with the lines for a single scroll text character
SLIDEDisplay a Star Wars scroll text
TWISTPitch the current ship by a small angle in a positive direction
TWIST2Pitch in the direction given in A
ZZAAPDraw a vertical red laser line from (128, 67) to (128, 160)

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)
CIRCLE3Just add the circle segments to the existing ball line heap - do not send the send the ball line heap to the I/O processor for drawing on-screen
DOHFX (I/O processor)Implement the #DOHFX command (update the hyperspace effect flag)
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
LS2FLDraw the contents of the ball line heap by sending an OSWRCH 129 command to the I/O processor
TT128Draw a circle on a chart
TT14Draw a circle with crosshairs on a chart
WP1Contains an RTS

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

ADDBYT (I/O processor)Implement the OSWRCH 130 command (add a byte to a line and draw it when all bytes are received)
BEGINLIN (I/O processor)Implement the OSWRCH 129 command (start receiving a new line to draw)
EDGESDraw a horizontal line given a centre and a half-width
HBFLDraw the sun lines in the horizontal line buffer in orange by sending an OSWORD 247 command to the I/O processor
HBZEReset the horizontal line buffer
HLOINAdd a sun line to the horizontal line buffer
HLOIN (I/O processor)Implement the OSWORD 247 command (draw the sun lines in the horizontal line buffer in orange)
HLOIN2Remove a line from the sun line heap and draw it on-screen
HLOIN2 (I/O processor)Draw a horizontal line in a specific colour
HLOIN3 (I/O processor)Draw a line from (X1, Y1) to (X2, Y1) in the current colour (we need to set Q = Y2 + 1 before calling HLOIN3 so only one line is drawn)
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
LBFLDraw the lines in the multi-segment line buffer by sending an OSWRCH 129 command to the I/O processor
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 by sending an OSWRCH 129 command to the I/O processor
LOINAdd a line segment to the multi-segment line buffer
LOIN (Part 1 of 7) (I/O processor)Draw a line: Calculate the line gradient in the form of deltas
LOIN (Part 2 of 7) (I/O processor)Draw a line: Line has a shallow gradient, step right along x-axis
LOIN (Part 3 of 7) (I/O processor)Draw a shallow line going right and up or left and down
LOIN (Part 4 of 7) (I/O processor)Draw a shallow line going right and down or left and up
LOIN (Part 5 of 7) (I/O processor)Draw a line: Line has a steep gradient, step up along y-axis
LOIN (Part 6 of 7) (I/O processor)Draw a steep line going up and left or down and right
LOIN (Part 7 of 7) (I/O processor)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
NLIN3Print a title and draw 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
TT15bDraw the crosshairs in the current colour

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

CPIX2 (I/O processor)Draw a single-height dash on the dashboard
CPIX4 (I/O processor)Draw a double-height dot on the dashboard
DOTDraw a dash on the compass by sending a #DOdot command to the I/O processor
PBFLDraw the pixel in the pixel buffer by sending an OSWORD 241 command to the I/O processor
PBZEReset the pixel buffer
PIX (Loader 1)Draw a single pixel at a specific coordinate
pixblPoints to the first byte of the PBUF block, which is where the OSWORD transmission size goes
PIXELAdd a white dot at a specific distance to the pixel buffer (2-pixel dash or 4-pixel square)
PIXEL (I/O processor)Implement the OSWORD 241 command (draw space view pixels)
PIXEL2Draw a stardust particle relative to the screen centre
PIXEL3Add a coloured dot at a specific distance to the pixel buffer (1-pixel dot, 2-pixel dash or 4-pixel square)
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 (Part 1 of 3) (Loader 1)Draw Saturn on the loading screen (draw the planet)
PLL1 (Part 2 of 3) (Loader 1)Draw Saturn on the loading screen (draw the stars)
PLL1 (Part 3 of 3) (Loader 1)Draw Saturn on the loading screen (draw the rings)
PLS1Calculate (Y A) = nosev_x / z
PLS2Draw a half-ellipse
PLS22Draw an ellipse or half-ellipse
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)

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
LL66A re-entry point into the ship-drawing routine, used by the LL62 routine to store 128 - (U R) on the XX3 heap
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
LL9 (Part 11 of 12)Draw ship: Add all visible edges to the ship line heap
LL9 (Part 12 of 12)Draw ship: Draw all the visible edges from the ship line heap
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 to draw the sun
SUN (Part 2 of 4)Draw the sun: Start from the bottom of the screen and erase the old sun line by line
SUN (Part 3 of 4)Draw the sun: Continue to move up the screen, drawing the new sun line by line
SUN (Part 4 of 4)Draw the sun: Continue to the top of the screen, erasing the old sun line by line
WPLSRemove the sun from the screen

Drawing the screen
------------------

BOXJust draw the border and (if this is a space view) the view name. This can be used to remove the border and view name, as it is drawn using EOR logic
BOX (I/O processor)Just draw the white border along the top and sides
cls (I/O processor)Clear the top part of the screen and draw a white border
CLYNSClear the bottom three text rows of the mode 1 screen by sending a #clyns command to the I/O processor
CLYNS (I/O processor)Implement the #clyns command (clear the bottom of the screen)
DET1Show or hide the dashboard (for when we die) by sending a #DODIALS command to the I/O processor
DODIALS (I/O processor)Implement the #DODIALS command (show or hide the dashboard)
DOVDU19Change the mode 1 palette by sending a #SETVDU19 command to the I/O processor
IRQ1 (I/O processor)The main screen-mode interrupt handler (IRQ1V points here)
SC5Contains an RTS
SETVDU19 (I/O processor)Implement the #SETVDU19 command (change mode 1 palette)
TRADEMODEClear the screen and set up a printable trading screen
TT66Clear the screen and set the current view type
TTX66Send control code 11 to the I/O processor to clear the top part of the screen and draw a white border
TTX66 (I/O processor)Clear the top part of the screen and draw a white border
VNT3+1 (I/O processor)Changing this byte modifies the palette-loading instruction at VNT3, to support the #SETVDU19 command for changing the mode 1 palette
WSCANAsk the I/O processor to wait for the vertical sync by sending a #wscn command to the I/O processor
WSCAN (I/O processor)Implement the #wscn command (wait for the vertical sync)

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
dockEdPrint a message to say there is no hyperspacing allowed inside the station
DOCKITApply docking manoeuvres to the ship in INWK
DOENTRYDock at the space station, show the ship hangar and work out any mission progression
DOFE21 (I/O processor)Implement the #DOFE21 command (show the energy bomb effect)
ee3Print the hyperspace countdown in the top-left of the screen
ESCAPELaunch our escape pod
GhyPerform a galactic hyperspace jump
hypStart the hyperspace process
LO2Contains an RTS
LOOK1Initialise the space view
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
MJPProcess a mis-jump into witchspace
OOPSTake some damage
ou2Display "E.C.M.SYSTEM DESTROYED" as an in-flight message
ou3Display "FUEL SCOOPS DESTROYED" as an in-flight message
OUCHPotentially lose cargo or equipment following damage
PLUTFlip the coordinate axes for the four different views
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
TT147Print an error when a system is out of hyperspace range
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

Keyboard
--------

autonGet the docking computer to "press" the flight keys to dock the ship
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
DK4Scan for pause, configuration and secondary flight keys
DKJ1Read joystick and flight controls
DKS2Read the joystick position
DKS3Toggle a configuration setting and emit a beep
DKS4Scan for a particular key press by sending a #DODKS4 command to the I/O processor
DODKS4 (I/O processor)Implement the #DODKS4 command (scan the keyboard to see if a specific key is being pressed)
DOKEYScan for the seven primary flight controls and apply the docking computer manoeuvring code
DOVIAE (I/O processor)Implement the #VIAE command (enable/disable interrupts)
FLKBFlush the keyboard buffer
FREEZERejoin the pause routine after processing a screen save
KEYBOARD (I/O processor)Implement the OSWORD 240 command (scan the keyboard and joystick and log the results)
KYTBContains an RTS
outContains an RTS t As TT217 but don't preserve Y, set it to YSAV instead
PAUSE2Wait until a key is pressed, ignoring any existing key press
RDKEYScan the keyboard for key presses by sending an OSWORD 240 command to the I/O processor
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
TT214Ask a question with a "Y/N?" prompt and return the response
TT217Scan the keyboard until a key is pressed
U%Clear the key logger
ZEKTRANReset the key logger buffer at KTRAN

Loader
------

BEGINInitialise the configuration variables and start the game
COLDCopy the recursive tokens and ship blueprints to their correct locations
Elite loader (Loader 1)Check for a 6502 Second Processor, perform a number of OS calls, set up sound and run the second loader
Elite loader (Part 1 of 2) (Loader 2)Move loading screen binaries into screen memory and load and run the main game code
Elite loader (Part 2 of 2) (Loader 2)Include binaries for loading screen and dashboard images
S%Checksum, decrypt and unscramble the main game code, and start the game
STARTUP (I/O processor)Set the various vectors, interrupts and timers, and terminate the loading process so the vector handlers can take over

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)
dnPrint the amount of money we have left in the cash pot, then make a short, high beep and delay for 1 second
gnumGet a number from the keyboard
NWDAV4Print an "ITEM?" error, make a beep and rejoin the TT210 routine
NWDAVxxUsed to rejoin this routine from the call to NWDAV4
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)
TT210Show a list of current cargo in our hold, optionally to sell
TT213Show the Inventory screen (red key f9)
TT219Show the Buy Cargo screen (red key f1)
varCalculate QQ19+3 = economy * |economic_factor|

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

ADDCalculate (A X) = (A P) + (S R)
ADD (I/O processor)Calculate (A X) = (A P) + (S R)
DORNDGenerate random numbers
DORND (Loader 1)Generate random numbers
DORND2Make sure the C flag doesn't affect the outcome
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 (I/O processor)Calculate (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 flag
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
MUT3An unused routine that does the same as MUT2
PIX1Calculate (YY+1 SYL+Y) = (A P) + (S R) and draw stardust particle
ROOT (Loader 1)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 1)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)
----------------

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
PROJProject the current ship or planet onto the screen
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
PAS1Display a rotating ship at space coordinates (0, 112, 256) and scan the keyboard
PAUSEDisplay a rotating ship, waiting until a key is pressed, then remove the ship from the screen
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
CATCatalogue a disc, wait for a key press and display the disc access menu
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
DOCATF (I/O processor)Implement the #DOCATF command (update the disc catalogue flag)
DODOSVNSet the SVN ("save in progress") flag by sending a #DOsvn command to the I/O processor
DOSVN (I/O processor)Implement the #DOSVN command (update the "save in progress" flag)
GTDRVGet an ASCII disc drive number from the keyboard
GTNMEWFetch the name of a commander file to save or load
LODLoad a commander file
LORSet the C flag and return from the subroutine
MEBRKThe BRKV handler for disc access operations
QUS1Save or load the commander file
retryScan the keyboard until a key is pressed and display the disc access menu
savscrSave a screenshot if CTRL-D is pressed when the game is paused
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%

Ship hangar
-----------

HA1Contains an RTS
HA3 (I/O processor)Contains an RTS
HAL3 (I/O processor)Draw a hangar background line from left to right, stopping when it bumps into existing on-screen content
HALLDraw the ships in the ship hangar, then draw the hangar by sending an OSWORD 248 command to the I/O processor
HANGER (I/O processor)Implement the OSWORD 248 command (display the ship hangar)
HAS1Draw a ship in the ship hangar
HAS2 (I/O processor)Draw a hangar background line from left to right
HAS3 (I/O processor)Draw a hangar background line from right to left
UNWISESwitch the main line-drawing routine between EOR and OR logic

Sound
-----

BEEPMake a short, high beep
BELLMake a standard system beep
ECMOFSwitch off the E.C.M.
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
EXNO3Make an explosion sound
NO3Make a sound from a prepared sound block
NOISEMake the sound whose number is in A
NOS1Prepare a sound block
TALKSpeak using the Watford Electronics Beeb Speech Synthesiser

Stardust
--------

FLIPReflect the stardust particles in the screen diagonal and redraw the stardust field
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)Show the "Load New Commander (Y/N)?" screen and start the game
BR1 (Part 2 of 2)Show the "Press Fire or Space, Commander" screen and start the game
DEATHDisplay the death screen
DEATH2Reset most of the game and restart from the title screen
DFAULTReset the current commander data block to the last saved commander
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)
cmnPrint the commander's name
cmn-1Contains an RTS
cshPrint the current amount of cash
EXNO2Process us making a kill
fwlPrint fuel and cash levels
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 TA9-1 Contains an RTS
TA9-1Contains an RTS
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
CHPRSend a character to the I/O processor for printing or processing
CHPRDMake a beep even if speech is enabled (Executive version only)
crlfTab to column 21 and print a colon
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
dn2Make a short, high beep and delay for 1 second
DOCOLSet the text colour by sending a #SETCOL command to the I/O processor
DOCOL (I/O processor)Implement the #SETCOL command (set the current colour)
DOXCMove the text cursor to a specified column by sending a #SETXC command to the I/O processor
DOYCMove the text cursor to a specified row by sending a #SETYC command to the I/O processor
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
exPrint a recursive token
FEEDPrint a newline
INCYCMove the text cursor to the next row
labelSend a two-byte OSWRCH command to the I/O processor
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
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
plfPrint a text token followed by a newline
plf2Print text followed by a newline and indent of 6 characters
POSWRCH (I/O processor)Print a character on the printer only
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
prilf (I/O processor)Implement the #prilf command (print a blank line on the printer)
printer (I/O processor)Implement the #printcode command (print a character on the printer and screen)
prqPrint a text token followed by a question mark
qwPrint a recursive token in the range 128-145
RR4 (I/O processor)Restore the registers and return from the subroutine
rT9Contains an RTS
sent (I/O processor)Turn the printer off and restore the USOSWRCH handler, returning from the subroutine using a tail call
SETXC (I/O processor)Implement the #SETXC command (move the text cursor to a specific column)
SETYC (I/O processor)Implement the #SETYC command (move the text cursor to a specific row)
spcPrint a text token followed by a space
tosend (I/O processor)Print a printable character and return to the printer routine
TT11Print a 16-bit number, left-padded to n digits, and optional point
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
TT26 (I/O processor)Print a character at the text cursor by poking into screen memory
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 (I/O processor)Print a newline
TT68Print a text token followed by a colon
TT69Set Sentence Case and print a newline
TT73Print a colon
TT74Print a character
TTX69Print a paragraph break
VOWELTest whether a character is a vowel
WHITETEXTSwitch to white text

Tube
----

newosrdch (I/O processor)The custom OSRDCH routine for reading characters
NWOSWD (I/O processor)The custom OSWORD routine
PUTBACK (I/O processor)Reset the OSWRCH vector in WRCHV to point to USOSWRCH
SAFE (I/O processor)Contains an RTS
USOSWRCH (I/O processor)The custom OSWRCH routine for writing characters and implementing jump table commands

Universe
--------

cplPrint the selected system name
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 line 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
PDESCPrint the system's extended description or a mission 1 directive
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
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
STORECopy the ship data block at INWK back to the K% workspace
talPrint the current galaxy number
TT111Set the current system to the nearest system to a point
TT111-1Contains an RTS
TT146Print the distance to the selected system in light years
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
TT70Display "MAINLY " and jump to TT72
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
yplPrint the current system name
ypl-1Contains an RTS
ZeInitialise the INWK workspace to a hostile ship
ZINFReset the INWK workspace and orientation vectors
ZINF2Reset the INWK workspace and orientation vectors

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

backtonormalDisable the keyboard, set the SVN flag to 0, and return with A = 0
BRBRThe standard BRKV handler for the game
CLDELAYDelay by iterating through 5 * 256 (1280) empty loops
DELAYWait for a specified time, in 1/50s of a second
DOBRK (I/O processor)Implement the OSWRCH 145 command (execute a BRK instruction)
FX200Set the behaviour of the ESCAPE and BREAK keys
MVBL (Loader 2)Move a multi-page block of memory from one location to another
OSB (Loader 1)A convenience routine for calling OSBYTE with Y = 0
SCLI2Execute an OS command, setting the SVN flag while it's running
ZEBCZero-fill pages &B and &C
ZEROReset the local bubble of universe and ship status
ZES1Zero-fill the page whose number is in X
ZES1 (I/O processor)Zero-fill the page whose number is in X
ZES2Zero-fill a specific page
ZES2 (I/O processor)Zero-fill a specific page
ZEVBZero-fill the Y1VB variable

Workspaces
----------

TINA+4 (I/O processor)The code to run if the TINA hook is enabled