Skip to navigation

BBC Micro Elite

Workspaces

ELITE GAME SOURCE Elite was written by Ian Bell and David Braben and is copyright Acornsoft 1984 The code on this site is identical to the version released on Ian Bell's personal website at http://www.elitehomepage.org/ The commentary is copyright Mark Moxon, and any misunderstandings or mistakes in the documentation are entirely my fault The terminology used in this commentary is explained at the start of the elite-loader.asm file
This source file produces the following binary files: * output/ELTA.bin * output/ELTB.bin * output/ELTC.bin * output/ELTD.bin * output/ELTE.bin * output/ELTF.bin * output/ELTG.bin * output/PYTHON.bin * output/SHIPS.bin * output/WORDS9.bin
INCLUDE "sources/elite-header.h.asm" _REMOVE_COMMANDER_CHECK = TRUE AND _REMOVE_CHECKSUMS _ENABLE_MAX_COMMANDER = TRUE AND _REMOVE_CHECKSUMS GUARD &6000 \ Screen memory starts here GUARD &8000 \ Paged ROMS start here
Configuration variables
NOST = 18 \ The number of stardust particles in normal space (this \ goes down to 3 in witchspace) NOSH = 12 \ The maximum number of ships in our local bubble of \ universe (counting from 0, so there are actually 13 \ ship slots) COPS = 2 \ Ship type for a Viper MAM = 3 \ Ship type for a Mamba THG = 6 \ Ship type for a Thargoid CYL = 7 \ Ship type for a Cobra Mk III (trader) SST = 8 \ Ship type for the space station MSL = 9 \ Ship type for a missile AST = 10 \ Ship type for an asteroid OIL = 11 \ Ship type for a cargo canister TGL = 12 \ Ship type for a Thargon ESC = 13 \ Ship type for an escape pod POW = 15 \ Pulse laser power NI% = 36 \ The number of bytes in each ship's data block (as \ stored in INWK and K%) OSBYTE = &FFF4 \ The address for the OSBYTE routine, which is used \ three times in the main game code OSWORD = &FFF1 \ The address for the OSWORD routine, which is used \ twice in the main game code OSFILE = &FFDD \ The address for the OSFILE routine, which is used \ once in the main game code SHEILA = &FE00 \ Memory-mapped space for accessing internal hardware, \ such as the video ULA, 6845 CRTC and 6522 VIAs VSCAN = 57 \ Defines the split position in the split-screen mode X = 128 \ The centre x-coordinate of the 256 x 192 space view Y = 96 \ The centre y-coordinate of the 256 x 192 space view f0 = &20 \ Internal key number for red key f0 (Launch, Front) f1 = &71 \ Internal key number for red key f1 (Buy Cargo, Rear) f2 = &72 \ Internal key number for red key f2 (Sell Cargo, Left) f3 = &73 \ Internal key number for red key f3 (Equip Ship, Right) f4 = &14 \ Internal key number for red key f4 (Long-range Chart) f5 = &74 \ Internal key number for red key f5 (Short-range Chart) f6 = &75 \ Internal key number for red key f6 (Data on System) f7 = &16 \ Internal key number for red key f7 (Market Price) f8 = &76 \ Internal key number for red key f8 (Status Mode) f9 = &77 \ Internal key number for red key f9 (Inventory)
Name: ZP [View individually] Type: Workspace Address: &0000 to &00B0 Category: Workspaces Summary: Lots of important variables are stored in the zero page workspace as it is quicker and more space-efficient to access memory here
ORG &0000 .ZP SKIP 0 \ The start of the zero page workspace .RAND SKIP 4 \ Four 8-bit seeds for the random number generation \ system implemented in the DORND routine .TRTB% SKIP 2 \ This is set by elite-loader.asm to point to the MOS \ keyboard translation table, which is used by the TT217 \ routine to translate internal key values to ASCII .T1 SKIP 1 \ Temporary storage, used in a number of places .SC SKIP 1 \ Screen address (low byte) \ \ Elite draws on-screen by poking bytes directly into \ screen memory, and SC(1 0) is typically set to the \ address of the character block containing the pixel \ we want to draw (see the deep dive on "Drawing \ monochrome pixels in mode 4" for more details) .SCH SKIP 1 \ Screen address (high byte) .XX16 SKIP 18 \ Temporary storage for a block of values, used in a \ number of places .P SKIP 3 \ Temporary storage, used in a number of places .XX0 SKIP 2 \ Temporary storage, used to store the address of a ship \ blueprint. For example, it is used when we add a new \ ship to the local bubble in routine NWSHP, and it \ contains the address of the current ship's blueprint \ as we loop through all the nearby ships in the main \ flight loop .INF SKIP 2 \ Temporary storage, typically used for storing the \ address of a ship's data block, so it can be copied \ to and from the internal workspace at INWK .V SKIP 2 \ Temporary storage, typically used for storing an \ address pointer .XX SKIP 2 \ Temporary storage, typically used for storing a 16-bit \ x-coordinate .YY SKIP 2 \ Temporary storage, typically used for storing a 16-bit \ y-coordinate .SUNX SKIP 2 \ The 16-bit x-coordinate of the vertical centre axis \ of the sun (which might be off-screen) .BETA SKIP 1 \ The current pitch angle beta, which is reduced from \ JSTY to a sign-magnitude value between -8 and +8 \ \ This describes how fast we are pitching our ship, and \ determines how fast the universe pitches around us \ \ The sign bit is also stored in BET2, while the \ opposite sign is stored in BET2+1 .BET1 SKIP 1 \ The magnitude of the pitch angle beta, i.e. |beta|, \ which is a positive value between 0 and 8 .XC SKIP 1 \ The x-coordinate of the text cursor (i.e. the text \ column), which can be from 0 to 32 \ \ A value of 0 denotes the leftmost column and 32 the \ rightmost column, but because the top part of the \ screen (the mode 4 part) has a white border that \ clashes with columns 0 and 32, text is only shown \ in columns 1-31 .YC SKIP 1 \ The y-coordinate of the text cursor (i.e. the text \ row), which can be from 0 to 23 \ \ The screen actually has 31 character rows if you \ include the mode 5 dashboard, but the text printing \ routines only work on the mode 4 part (the space \ view), so the text cursor only goes up to a maximum of \ 23, the row just before the screen split \ \ A value of 0 denotes the top row, but because the \ top part of the screen has a white border that clashes \ with row 0, text is always shown at row 1 or greater .QQ22 SKIP 2 \ The two hyperspace countdown counters \ \ Before a hyperspace jump, both QQ22 and QQ22+1 are \ set to 15 \ \ QQ22 is an internal counter that counts down by 1 \ each time TT102 is called, which happens every \ iteration of the main game loop. When it reaches \ zero, the on-screen counter in QQ22+1 gets \ decremented, and QQ22 gets set to 5 and the countdown \ continues (so the first tick of the hyperspace counter \ takes 15 iterations to happen, but subsequent ticks \ take 5 iterations each) \ \ QQ22+1 contains the number that's shown on-screen \ during the countdown. It counts down from 15 to 1, and \ when it hits 0, the hyperspace engines kick in .ECMA SKIP 1 \ The E.C.M. countdown timer, which determines whether \ an E.C.M. system is currently operating: \ \ * 0 = E.C.M. is off \ \ * Non-zero = E.C.M. is on and is counting down \ \ The counter starts at 32 when an E.C.M. is activated, \ either by us or by an opponent, and it decreases by 1 \ in each iteration of the main flight loop until it \ reaches zero, at which point the E.C.M. switches off. \ Only one E.C.M. can be active at any one time, so \ there is only one counter .XX15 SKIP 0 \ Temporary storage, typically used for storing screen \ coordinates in line-drawing routines \ \ There are six bytes of storage, from XX15 TO XX15+5. \ The first four bytes have the following aliases: \ \ X1 = XX15 \ Y1 = XX15+1 \ X2 = XX15+2 \ Y2 = XX15+3 \ \ These are typically used for describing lines in terms \ of screen coordinates, i.e. (X1, Y1) to (X2, Y2) \ \ The last two bytes of XX15 do not have aliases .X1 SKIP 1 \ Temporary storage, typically used for x-coordinates in \ line-drawing routines .Y1 SKIP 1 \ Temporary storage, typically used for y-coordinates in \ line-drawing routines .X2 SKIP 1 \ Temporary storage, typically used for x-coordinates in \ line-drawing routines .Y2 SKIP 1 \ Temporary storage, typically used for y-coordinates in \ line-drawing routines SKIP 2 \ The last 2 bytes of the XX15 block .XX12 SKIP 6 \ Temporary storage for a block of values, used in a \ number of places .K SKIP 4 \ Temporary storage, used in a number of places .KL SKIP 1 \ The following bytes implement a key logger that \ enables Elite to scan for concurrent key presses of \ the primary flight keys, plus a secondary flight key \ \ See the deep dive on "The key logger" for more details \ \ If a key is being pressed that is not in the keyboard \ table at KYTB, it can be stored here (as seen in \ routine DK4, for example) .KY1 SKIP 1 \ "?" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY2 SKIP 1 \ Space has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY3 SKIP 1 \ "<" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY4 SKIP 1 \ ">" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY5 SKIP 1 \ "X" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY6 SKIP 1 \ "S" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY7 SKIP 1 \ "A" has been pressed \ \ * 0 = no \ \ * Non-zero = yes \ \ This is also set when the joystick fire button has \ been pressed .KY12 SKIP 1 \ Tab key has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY13 SKIP 1 \ Escape key has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY14 SKIP 1 \ "T" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY15 SKIP 1 \ "U" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY16 SKIP 1 \ "M" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY17 SKIP 1 \ "E" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY18 SKIP 1 \ "J" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .KY19 SKIP 1 \ "C" has been pressed \ \ * 0 = no \ \ * Non-zero = yes .LAS SKIP 1 \ Contains the laser power of the laser fitted to the \ current space view (or 0 if there is no laser fitted \ to the current view) \ \ This gets set to bits 0-6 of the laser power byte from \ the commander data block, which contains the laser's \ power (bit 7 doesn't denote laser power, just whether \ or not the laser pulses, so that is not stored here) .MSTG SKIP 1 \ The current missile lock target \ \ * &FF = no target \ \ * 1-13 = the slot number of the ship that our \ missile is locked onto .XX1 SKIP 0 \ This is an alias for INWK that is used in the main \ ship-drawing routine at LL9 .INWK SKIP 33 \ The zero-page internal workspace for the current ship \ data block \ \ As operations on zero page locations are faster and \ have smaller opcodes than operations on the rest of \ the addressable memory, Elite tends to store oft-used \ data here. A lot of the routines in Elite need to \ access and manipulate ship data, so to make this an \ efficient exercise, the ship data is first copied from \ the ship data blocks at K% into INWK (or, when new \ ships are spawned, from the blueprints at XX21). See \ the deep dive on "Ship data blocks" for details of \ what each of the bytes in the INWK data block \ represents .XX19 SKIP NI% - 33 \ XX19(1 0) shares its location with INWK(34 33), which \ contains the address of the ship line heap .LSP SKIP 1 \ The ball line heap pointer, which contains the number \ of the first free byte after the end of the LSX2 and \ LSY2 heaps (see the deep dive on "The ball line heap" \ for details) .QQ15 SKIP 6 \ The three 16-bit seeds for the selected system, i.e. \ the one in the crosshairs in the Short-range Chart \ \ See the deep dives on "Galaxy and system seeds" and \ "Twisting the system seeds" for more details .K5 SKIP 0 \ Temporary storage used to store segment coordinates \ across successive calls to BLINE, the ball line \ routine .XX18 SKIP 0 \ Temporary storage used to store coordinates in the \ LL9 ship-drawing routine .QQ17 SKIP 1 \ Contains a number of flags that affect how text tokens \ are printed, particularly capitalisation: \ \ * If all bits are set (255) then text printing is \ disabled \ \ * Bit 7: 0 = ALL CAPS \ 1 = Sentence Case, bit 6 determines the \ case of the next letter to print \ \ * Bit 6: 0 = print the next letter in upper case \ 1 = print the next letter in lower case \ \ * Bits 0-5: If any of bits 0-5 are set, print in \ lower case \ \ So: \ \ * QQ17 = 0 means case is set to ALL CAPS \ \ * QQ17 = %10000000 means Sentence Case, currently \ printing upper case \ \ * QQ17 = %11000000 means Sentence Case, currently \ printing lower case \ \ * QQ17 = %11111111 means printing is disabled .QQ19 SKIP 3 \ Temporary storage, used in a number of places .K6 SKIP 5 \ Temporary storage, typically used for storing \ coordinates during vector calculations .ALP1 SKIP 1 \ Magnitude of the roll angle alpha, i.e. |alpha|, \ which is a positive value between 0 and 31 .ALP2 SKIP 2 \ Bit 7 of ALP2 = sign of the roll angle in ALPHA \ \ Bit 7 of ALP2+1 = opposite sign to ALP2 and ALPHA .BET2 SKIP 2 \ Bit 7 of BET2 = sign of the pitch angle in BETA \ \ Bit 7 of BET2+1 = opposite sign to BET2 and BETA .DELTA SKIP 1 \ Our current speed, in the range 1-40 .DELT4 SKIP 2 \ Our current speed * 64 as a 16-bit value \ \ This is stored as DELT4(1 0), so the high byte in \ DELT4+1 therefore contains our current speed / 4 .U SKIP 1 \ Temporary storage, used in a number of places .Q SKIP 1 \ Temporary storage, used in a number of places .R SKIP 1 \ Temporary storage, used in a number of places .S SKIP 1 \ Temporary storage, used in a number of places .XSAV SKIP 1 \ Temporary storage for saving the value of the X \ register, used in a number of places .YSAV SKIP 1 \ Temporary storage for saving the value of the Y \ register, used in a number of places .XX17 SKIP 1 \ Temporary storage, used in BPRNT to store the number \ of characters to print, and as the edge counter in the \ main ship-drawing routine .QQ11 SKIP 1 \ The number of the current view: \ \ 0 = Space view \ 1 = Title screen \ Buy Cargo screen (red key f1) \ Data on System screen (red key f6) \ Get commander name ("@", save/load commander) \ In-system jump just arrived ("J") \ Mis-jump just arrived (witchspace) \ 4 = Sell Cargo screen (red key f2) \ 6 = Death screen \ 8 = Status Mode screen (red key f8) \ Inventory screen (red key f9) \ 16 = Market Price screen (red key f7) \ 32 = Equip Ship screen (red key f3) \ 64 = Long-range Chart (red key f4) \ 128 = Short-range Chart (red key f5) \ \ This value is typically set by calling routine TT66 .ZZ SKIP 1 \ Temporary storage, typically used for distance values .XX13 SKIP 1 \ Temporary storage, typically used in the line-drawing \ routines .MCNT SKIP 1 \ The main loop counter \ \ This counter determines how often certain actions are \ performed within the main loop. See the deep dive on \ "Scheduling tasks with the main loop counter" for more \ details .DL SKIP 1 \ Vertical sync flag \ \ DL gets set to 30 every time we reach vertical sync on \ the video system, which happens 50 times a second \ (50Hz). The WSCAN routine uses this to pause until the \ vertical sync, by setting DL to 0 and then monitoring \ its value until it changes to 30 .TYPE SKIP 1 \ The current ship type \ \ This is where we store the current ship type for when \ we are iterating through the ships in the local bubble \ as part of the main flight loop. See the table at XX21 \ for information about ship types .JSTX SKIP 1 \ Our current roll rate \ \ This value is shown in the dashboard's RL indicator, \ and determines the rate at which we are rolling \ \ The value ranges from from 1 to 255 with 128 as the \ centre point, so 1 means roll is decreasing at the \ maximum rate, 128 means roll is not changing, and \ 255 means roll is increasing at the maximum rate \ \ This value is updated by "<" and ">" key presses, or \ if joysticks are enabled, from the joystick. If \ keyboard damping is enabled (which it is by default), \ the value is slowly moved towards the centre value of \ 128 (no roll) if there are no key presses or joystick \ movement .JSTY SKIP 1 \ Our current pitch rate \ \ This value is shown in the dashboard's DC indicator, \ and determines the rate at which we are pitching \ \ The value ranges from from 1 to 255 with 128 as the \ centre point, so 1 means pitch is decreasing at the \ maximum rate, 128 means pitch is not changing, and \ 255 means pitch is increasing at the maximum rate \ \ This value is updated by "S" and "X" key presses, or \ if joysticks are enabled, from the joystick. If \ keyboard damping is enabled (which it is by default), \ the value is slowly moved towards the centre value of \ 128 (no pitch) if there are no key presses or joystick \ movement .ALPHA SKIP 1 \ The current roll angle alpha, which is reduced from \ JSTX to a sign-magnitude value between -31 and +31 \ \ This describes how fast we are rolling our ship, and \ determines how fast the universe rolls around us \ \ The sign bit is also stored in ALP2, while the \ opposite sign is stored in ALP2+1 .QQ12 SKIP 1 \ Our "docked" status \ \ * 0 = we are not docked \ \ * &FF = we are docked .TGT SKIP 1 \ Temporary storage, typically used as a target value \ for counters when drawing explosion clouds and partial \ circles .SWAP SKIP 1 \ Temporary storage, used to store a flag that records \ whether or not we had to swap a line's start and end \ coordinates around when clipping the line in routine \ LL145 (the flag is used in places like BLINE to swap \ them back) .COL SKIP 1 \ Temporary storage, used to store colour information \ when drawing pixels in the mode 5 dashboard screen .FLAG SKIP 1 \ A flag that's used to define whether this is the first \ call to the ball line routine in BLINE, so it knows \ whether to wait for the second call before storing \ segment data in the ball line heap .CNT SKIP 1 \ Temporary storage, typically used for storing the \ number of iterations required when looping .CNT2 SKIP 1 \ Temporary storage, used in the planet-drawing routine \ to store the segment number where the arc of a partial \ circle should start .STP SKIP 1 \ The step size for drawing circles \ \ Circles in Elite are split up into 64 points, and the \ step size determines how many points to skip with each \ straight-line segment, so the smaller the step size, \ the smoother the circle. The values used are: \ \ * 2 for big planets and the circles on the charts \ * 4 for medium planets and the launch tunnel \ * 8 for small planets and the hyperspace tunnel \ \ As the step size increases we move from smoother \ circles at the top to more polygonal at the bottom. \ See the CIRCLE2 routine for more details .XX4 SKIP 1 \ Temporary storage, used in a number of places .XX20 SKIP 1 \ Temporary storage, used in a number of places .XX14 SKIP 1 \ This byte is unused .RAT SKIP 1 \ Used to store different signs depending on the current \ space view, for use in calculating stardust movement .RAT2 SKIP 1 \ Temporary storage, used to store the pitch and roll \ signs when moving objects and stardust .K2 SKIP 4 \ Temporary storage, used in a number of places ORG &D1 .T SKIP 1 \ Temporary storage, used in a number of places .K3 SKIP 0 \ Temporary storage, used in a number of places .XX2 SKIP 14 \ Temporary storage, used to store the visibility of the \ ship's faces during the ship-drawing routine at LL9 .K4 SKIP 2 \ Temporary storage, used in a number of places PRINT "Zero page variables from ", ~ZP, " to ", ~P%
Name: XX3 [View individually] Type: Workspace Address: &0100 to the top of the descending stack Category: Workspaces Summary: Temporary storage space for complex calculations
Used as heap space for storing temporary data during calculations. Shared with the descending 6502 stack, which works down from &01FF.
ORG &0100 .XX3 SKIP 0 \ Temporary storage, typically used for storing tables \ of values such as screen coordinates or ship data
Name: T% [View individually] Type: Workspace Address: &0300 to &035F Category: Workspaces Summary: Current commander data and stardust data blocks
Contains the current commander data (NT% bytes at location TP), and the stardust data blocks (NOST bytes at location SX)
ORG &0300 .T% SKIP 0 \ The start of the T% workspace .TP SKIP 1 \ The current mission status, which is always 0 for the \ cassette version of Elite as there are no missions .QQ0 SKIP 1 \ The current system's galactic x-coordinate (0-256) .QQ1 SKIP 1 \ The current system's galactic y-coordinate (0-256) .QQ21 SKIP 6 \ The three 16-bit seeds for the current galaxy \ \ These seeds define system 0 in the current galaxy, so \ they can be used as a starting point to generate all \ 256 systems in the galaxy \ \ Using a galactic hyperdrive rotates each byte to the \ left (rolling each byte within itself) to get the \ seeds for the next galaxy, so after eight galactic \ jumps, the seeds roll around to the first galaxy again \ \ See the deep dives on "Galaxy and system seeds" and \ "Twisting the system seeds" for more details .CASH SKIP 4 \ Our current cash pot \ \ The cash stash is stored as a 32-bit unsigned integer, \ with the most significant byte in CASH and the least \ significant in CASH+3. This is big-endian, which is \ the opposite way round to most of the numbers used in \ Elite - to use our notation for multi-byte numbers, \ the amount of cash is CASH(0 1 2 3) .QQ14 SKIP 1 \ Our current fuel level (0-70) \ \ The fuel level is stored as the number of light years \ multiplied by 10, so QQ14 = 1 represents 0.1 light \ years, and the maximum possible value is 70, for 7.0 \ light years .COK SKIP 1 \ Flags used to generate the competition code \ \ See the deep dive on "The competition code" for \ details of these flags and how they are used in \ generating and decoding the competition code .GCNT SKIP 1 \ The number of the current galaxy (0-7) \ \ When this is displayed in-game, 1 is added to the \ number, so we start in galaxy 1 in-game, but it's \ stored as galaxy 0 internally \ \ The galaxy number increases by one every time a \ galactic hyperdrive is used, and wraps back round to \ the start after eight galaxies .LASER SKIP 4 \ The specifications of the lasers fitted to each of the \ four space views: \ \ * Byte #0 = front view (red key f0) \ * Byte #1 = rear view (red key f1) \ * Byte #2 = left view (red key f2) \ * Byte #3 = right view (red key f3) \ \ For each of the views: \ \ * 0 = no laser is fitted to this view \ \ * Non-zero = a laser is fitted to this view, with \ the following specification: \ \ * Bits 0-6 contain the laser's power \ \ * Bit 7 determines whether or not the laser pulses \ (pulse laser) or is always on (beam laser) SKIP 2 \ These bytes are unused (they were originally used for \ up/down lasers, but they were dropped) .CRGO SKIP 1 \ Our ship's cargo capacity \ \ * 22 = standard cargo bay of 20 tonnes \ \ * 37 = large cargo bay of 35 tonnes \ \ The value is two greater than the actual capacity to \ male the maths in tnpr slightly more efficient .QQ20 SKIP 17 \ The contents of our cargo hold \ \ The amount of market item X that we have in our hold \ can be found in the X-th byte of QQ20. For example: \ \ * QQ20 contains the amount of food (item 0) \ \ * QQ20+7 contains the amount of computers (item 7) \ \ See QQ23 for a list of market item numbers and their \ storage units .ECM SKIP 1 \ E.C.M. system \ \ * 0 = not fitted \ \ * &FF = fitted .BST SKIP 1 \ Fuel scoops (BST stands for "barrel status") \ \ * 0 = not fitted \ \ * &FF = fitted .BOMB SKIP 1 \ Energy bomb \ \ * 0 = not fitted \ \ * &7F = fitted .ENGY SKIP 1 \ Energy unit \ \ * 0 = not fitted \ \ * 1 = fitted .DKCMP SKIP 1 \ Docking computer \ \ * 0 = not fitted \ \ * &FF = fitted .GHYP SKIP 1 \ Galactic hyperdrive \ \ * 0 = not fitted \ \ * &FF = fitted .ESCP SKIP 1 \ Escape pod \ \ * 0 = not fitted \ \ * &FF = fitted SKIP 4 \ These bytes are unused .NOMSL SKIP 1 \ The number of missiles we have fitted (0-4) .FIST SKIP 1 \ Our legal status (FIST stands for "fugitive/innocent \ status"): \ \ * 0 = Clean \ \ * 1-49 = Offender \ \ * 50+ = Fugitive \ \ You get 64 points if you kill a cop, so that's a fast \ ticket to fugitive status .AVL SKIP 17 \ Market availability in the current system \ \ The available amount of market item X is stored in \ the X-th byte of AVL, so for example: \ \ * AVL contains the amount of food (item 0) \ \ * AVL+7 contains the amount of computers (item 7) \ \ See QQ23 for a list of market item numbers and their \ storage units, and the deep dive on "Market item \ prices and availability" for details of the algorithm \ used for calculating each item's availability .QQ26 SKIP 1 \ A random value used to randomise market data \ \ This value is set to a new random number for each \ change of system, so we can add a random factor into \ the calculations for market prices (for details of how \ this is used, see the deep dive on "Market prices") .TALLY SKIP 2 \ Our combat rank \ \ The combat rank is stored as the number of kills, in a \ 16-bit number TALLY(1 0) - so the high byte is in \ TALLY+1 and the low byte in TALLY \ \ If the high byte in TALLY+1 is 0 then we have between \ 0 and 255 kills, so our rank is Harmless, Mostly \ Harmless, Poor, Average or Above Average, according to \ the value of the low byte in TALLY: \ \ Harmless = %00000000 to %00000011 = 0 to 3 \ Mostly Harmless = %00000100 to %00000111 = 4 to 7 \ Poor = %00001000 to %00001111 = 8 to 15 \ Average = %00010000 to %00011111 = 16 to 31 \ Above Average = %00100000 to %11111111 = 32 to 255 \ \ If the high byte in TALLY+1 is non-zero then we are \ Competent, Dangerous, Deadly or Elite, according to \ the high byte in TALLY+1: \ \ Competent = 1 = 256 to 511 kills \ Dangerous = 2 to 9 = 512 to 2559 kills \ Deadly = 10 to 24 = 2560 to 6399 kills \ Elite = 25 and up = 6400 kills and up \ \ You can see the rating calculation in STATUS .SVC SKIP 1 \ The save count \ \ When a new commander is created, the save count gets \ set to 128. This value gets halved each time the \ commander file is saved, but it is otherwise unused. \ It is presumably part of the security system for the \ competition, possibly another flag to catch out \ entries with manually altered commander files SKIP 2 \ The commander file checksum \ \ These two bytes are reserved for the commander file \ checksum, so when the current commander block is \ copied from here to the last saved commander block at \ NA%, CHK and CHK2 get overwritten NT% = SVC + 2 - TP \ This sets the variable NT% to the size of the current \ commander data block, which starts at TP and ends at \ SVC+2 (inclusive) .SX SKIP NOST + 1 \ This is where we store the x_hi coordinates for all \ the stardust particles .SXL SKIP NOST + 1 \ This is where we store the x_lo coordinates for all \ the stardust particles PRINT "T% workspace from ", ~T%, " to ", ~P%
Name: K% [View individually] Type: Workspace Address: &0900 to &0D40 Category: Workspaces Summary: Ship data blocks and ship line heaps
Contains ship data for all the ships, planets, suns and space stations in our local bubble of universe, along with their corresponding ship line heaps. The blocks are pointed to by the lookup table at location UNIV. The first 468 bytes of the K% workspace hold ship data on up to 13 ships, with 36 (NI%) bytes per ship, and the ship line heap grows downwards from WP at the end of the K% workspace. See the deep dive on "Ship data blocks" for details on ship data blocks, and the deep dive on "The local bubble of universe" for details of how Elite stores the local universe in K%, FRIN and UNIV.
ORG &0900 .K% SKIP 0 \ Ship data blocks and ship line heap
Name: WP [View individually] Type: Workspace Address: &0D40 to &0F34 Category: Workspaces Summary: Ship slots, variables
ORG &0D40 .WP SKIP 0 \ The start of the WP workspace .FRIN SKIP NOSH + 1 \ Slots for the 13 ships in the local bubble of universe \ \ See the deep dive on "The local bubble of universe" \ for details of how Elite stores the local universe in \ FRIN, UNIV and K% .CABTMP SKIP 0 \ Cabin temperature \ \ The ambient cabin temperature in deep space is 30, \ which is displayed as one notch on the dashboard bar \ \ We get higher temperatures closer to the sun \ \ CABTMP shares a location with MANY, but that's OK as \ MANY+0 would contain the number of ships of type 0, \ but as there is no ship type 0 (they start at 1), MANY \ is unused .MANY SKIP SST \ The number of ships of each type in the local bubble \ of universe \ \ The number of ships of type X in the local bubble is \ stored at MANY+X, so the number of Sidewinders is at \ MANY+1, the number of Mambas is at MANY+2, and so on \ \ See the deep dive on "Ship blueprints" for a list of \ ship types .SSPR SKIP 14 - SST \ "Space station present" flag \ \ * Non-zero if we are inside the space station's safe \ zone \ \ * 0 if we aren't (in which case we can show the sun) \ \ This flag is at MANY+SST, which is no coincidence, as \ MANY+SST is a count of how many space stations there \ are in our local bubble, which is the same as saying \ "space station present" .ECMP SKIP 1 \ Our E.C.M. status \ \ * 0 = E.C.M. is off \ \ * Non-zero = E.C.M. is on .MJ SKIP 1 \ Are we in witchspace (i.e. have we mis-jumped)? \ \ * 0 = no, we are in normal space \ \ * &FF = yes, we are in witchspace .LAS2 SKIP 1 \ Laser power for the current laser \ \ * Bits 0-6 contain the laser power of the current \ space view \ \ * Bit 7 denotes whether or not the laser pulses: \ \ * 0 = pulsing laser \ \ * 1 = beam laser (i.e. always on) .MSAR SKIP 1 \ The targeting state of our leftmost missile \ \ * 0 = missile is not looking for a target, or it \ already has a target lock (indicator is not \ yellow/white) \ \ * Non-zero = missile is currently looking for a \ target (indicator is yellow/white) .VIEW SKIP 1 \ The number of the current space view \ \ * 0 = front \ * 1 = rear \ * 2 = left \ * 3 = right .LASCT SKIP 1 \ The laser pulse count for the current laser \ \ This is a counter that defines the gap between the \ pulses of a pulse laser. It is set as follows: \ \ * 0 for a beam laser \ \ * 10 for a pulse laser \ \ It gets decremented every vertical sync (in the LINSCN \ routine, which is called 50 times a second) and is set \ to a non-zero value for pulse lasers only \ \ The laser only fires when the value of LASCT hits \ zero, so for pulse lasers with a value of 10, that \ means the laser fires once every 10 vertical syncs (or \ 5 times a second) \ \ In comparison, beam lasers fire continuously as the \ value of LASCT is always 0 .GNTMP SKIP 1 \ Laser temperature (or "gun temperature") \ \ If the laser temperature exceeds 242 then the laser \ overheats and cannot be fired again until it has \ cooled down .HFX SKIP 1 \ A flag that toggles the hyperspace colour effect \ \ * 0 = no colour effect \ \ * Non-zero = hyperspace colour effect enabled \ \ When HFS is set to 1, the mode 4 screen that makes \ up the top part of the display is temporarily switched \ to mode 5 (the same screen mode as the dashboard), \ which has the effect of blurring and colouring the \ hyperspace rings in the top part of the screen. The \ code to do this is in the LINSCN routine, which is \ called as part of the screen mode routine at IRQ1. \ It's in LINSCN that HFX is checked, and if it is \ non-zero, the top part of the screen is not switched \ to mode 4, thus leaving the top part of the screen in \ the more colourful mode 5 .EV SKIP 1 \ The "extra vessels" spawning counter \ \ This counter is set to 0 on arrival in a system and \ following an in-system jump, and is bumped up when we \ spawn bounty hunters or pirates (i.e. "extra vessels") \ \ It decreases by 1 each time we consider spawning more \ "extra vessels" in part 4 of the main game loop, so \ increasing the value of EV has the effect of delaying \ the spawning of more vessels \ \ In other words, this counter stops bounty hunters and \ pirates from continually appearing, and ensures that \ there's a delay between spawnings .DLY SKIP 1 \ In-flight message delay \ \ This counter is used to keep an in-flight message up \ for a specified time before it gets removed. The value \ in DLY is decremented each time we start another \ iteration of the main game loop at TT100 .de SKIP 1 \ Equipment destruction flag \ \ * Bit 1 denotes whether or not the in-flight message \ about to be shown by the MESS routine is about \ destroyed equipment: \ \ * 0 = the message is shown normally \ \ * 1 = the string " DESTROYED" gets added to the \ end of the message .LSX SKIP 0 \ LSX is an alias that points to the first byte of the \ sun line heap at LSO \ \ * &FF indicates the sun line heap is empty \ \ * Otherwise the LSO heap contains the line data for \ the sun, starting with this byte .LSO SKIP 192 \ This space has two uses: \ \ * The ship line heap for the space station (see \ NWSPS for details) \ \ * The sun line heap (see SUN for details) \ \ The spaces can be shared as our local bubble of \ universe can support either the sun or a space \ station, but not both .LSX2 SKIP 78 \ The ball line heap for storing x-coordinates (see the \ deep dive on "The ball line heap" for details) .LSY2 SKIP 78 \ The ball line heap for storing y-coordinates (see the \ deep dive on "The ball line heap" for details) .SY SKIP NOST + 1 \ This is where we store the y_hi coordinates for all \ the stardust particles .SYL SKIP NOST + 1 \ This is where we store the y_lo coordinates for all \ the stardust particles .SZ SKIP NOST + 1 \ This is where we store the z_hi coordinates for all \ the stardust particles .SZL SKIP NOST + 1 \ This is where we store the z_lo coordinates for all \ the stardust particles .XSAV2 SKIP 1 \ Temporary storage, used for storing the value of the X \ register in the TT26 routine .YSAV2 SKIP 1 \ Temporary storage, used for storing the value of the Y \ register in the TT26 routine .MCH SKIP 1 \ The text token number of the in-flight message that is \ currently being shown, and which will be removed by \ the me2 routine when the counter in DLY reaches zero .FSH SKIP 1 \ Forward shield status \ \ * 0 = empty \ \ * &FF = full .ASH SKIP 1 \ Aft shield status \ \ * 0 = empty \ \ * &FF = full .ENERGY SKIP 1 \ Energy bank status \ \ * 0 = empty \ \ * &FF = full .LASX SKIP 1 \ The x-coordinate of the tip of the laser line .LASY SKIP 1 \ The y-coordinate of the tip of the laser line .COMX SKIP 1 \ The x-coordinate of the compass dot .COMY SKIP 1 \ The y-coordinate of the compass dot .QQ24 SKIP 1 \ Temporary storage, used to store the current market \ item's price in routine TT151 .QQ25 SKIP 1 \ Temporary storage, used to store the current market \ item's availability in routine TT151 .QQ28 SKIP 1 \ Temporary storage, used to store the economy byte of \ the current system in routine var .QQ29 SKIP 1 \ Temporary storage, used in a number of places .gov SKIP 1 \ The current system's government type (0-7) \ \ See the deep dive on "Generating system data" for \ details of the various government types .tek SKIP 1 \ The current system's tech level (0-14) \ \ See the deep dive on "Generating system data" for more \ information on tech levels .SLSP SKIP 2 \ The address of the bottom of the ship line heap \ \ The ship line heap is a descending block of memory \ that starts at WP and descends down to SLSP. It can be \ extended downwards by the NWSHP routine when adding \ new ships (and their associated ship line heaps), in \ which case SLSP is lowered to provide more heap space, \ assuming there is enough free memory to do so .XX24 SKIP 1 \ This byte is unused .ALTIT SKIP 1 \ Our altitude above the surface of the planet or sun \ \ * 255 = we are a long way above the surface \ \ * 1-254 = our altitude as the square root of: \ \ x_hi^2 + y_hi^2 + z_hi^2 - 6^2 \ \ where our ship is at the origin, the centre of the \ planet/sun is at (x_hi, y_hi, z_hi), and the \ radius of the planet is 6 \ \ * 0 = we have crashed into the surface .QQ2 SKIP 6 \ The three 16-bit seeds for the current system, i.e. \ the one we are currently in \ \ See the deep dives on "Galaxy and system seeds" and \ "Twisting the system seeds" for more details .QQ3 SKIP 1 \ The selected system's economy (0-7) \ \ See the deep dive on "Generating system data" for more \ information on economies .QQ4 SKIP 1 \ The selected system's government (0-7) \ \ See the deep dive on "Generating system data" for more \ details of the various government types .QQ5 SKIP 1 \ The selected system's tech level (0-14) \ \ See the deep dive on "Generating system data" for more \ information on tech levels .QQ6 SKIP 2 \ The selected system's population in billions * 10 \ (1-71), so the maximum population is 7.1 billion \ \ See the deep dive on "Generating system data" for more \ details on population levels .QQ7 SKIP 2 \ The selected system's productivity in M CR (96-62480) \ \ See the deep dive on "Generating system data" for more \ details about productivity levels .QQ8 SKIP 2 \ The distance from the current system to the selected \ system in light years * 10, stored as a 16-bit number \ \ The distance will be 0 if the selected sysyem is the \ current system \ \ The galaxy chart is 102.4 light years wide and 51.2 \ light years tall (see the intra-system distance \ calculations in routine TT111 for details), which \ equates to 1024 x 512 in terms of QQ8 .QQ9 SKIP 1 \ The galactic x-coordinate of the crosshairs in the \ galaxy chart (and, most of the time, the selected \ system's galactic x-coordinate) .QQ10 SKIP 1 \ The galactic y-coordinate of the crosshairs in the \ galaxy chart (and, most of the time, the selected \ system's galactic y-coordinate) .NOSTM SKIP 1 \ The number of stardust particles shown on screen, \ which is 18 (#NOST) for normal space, and 3 for \ witchspace PRINT "WP workspace from ", ~WP," to ", ~P%