Elite on the BBC Micro

# Elite D parasite source [Elite-A]

ELITE D FILE
Name: tnpr Type: Subroutine Category: Market Summary: Work out if we have space for a specific amount of cargo
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT219 calls tnpr * EQSHP calls entry point Tml

Given a market item and an amount, work out whether there is room in the cargo hold for this item. For standard tonne canisters, the limit is given by size of the cargo hold of our current ship. For items measured in kg (gold, platinum), g (gem-stones) and alien items, there is no limit. Arguments: A The number of units of this market item QQ29 The type of market item (see QQ23 for a list of market item numbers) Returns: C flag Returns the result: * Set if there is no room for this item * Clear if there is room for this item Other entry points: Tml Calculate the sum of the following, returning the C flag according to whether this all fits into the hold: * The total tonnage of the first X items of cargo * The value in A * Plus one more tonne if the C flag is set on entry This is called with X = 12, A = the number of alien items in the hold, and the C flag set, to see if there is room for one more tonne in the hold
Name: TT20 Type: Subroutine Category: Universe Summary: Twist the selected system's seeds four times Deep dive: Twisting the system seeds Galaxy and system seeds
Context: See this subroutine on its own page References: This subroutine is called as follows: * HME2 calls TT20 * TT111 calls TT20 * TT22 calls TT20 * TT23 calls TT20 * cour_count calls TT20

Twist the three 16-bit seeds in QQ15 (selected system) four times, to generate the next system.
.TT20 JSR P%+3 \ This line calls the line below as a subroutine, which \ does two twists before returning here, and then we \ fall through to the line below for another two \ twists, so the net effect of these two consecutive \ JSR calls is four twists, not counting the ones \ inside your head as you try to follow this process JSR P%+3 \ This line calls TT54 as a subroutine to do a twist, \ and then falls through into TT54 to do another twist \ before returning from the subroutine
Name: TT54 Type: Subroutine Category: Universe Summary: Twist the selected system's seeds Deep dive: Twisting the system seeds Galaxy and system seeds
Context: See this subroutine on its own page References: This subroutine is called as follows: * cpl calls TT54

This routine twists the three 16-bit seeds in QQ15 once.
.TT54 LDA QQ15 \ X = tmp_lo = s0_lo + s1_lo CLC ADC QQ15+2 TAX LDA QQ15+1 \ Y = tmp_hi = s1_hi + s1_hi + C ADC QQ15+3 TAY LDA QQ15+2 \ s0_lo = s1_lo STA QQ15 LDA QQ15+3 \ s0_hi = s1_hi STA QQ15+1 LDA QQ15+5 \ s1_hi = s2_hi STA QQ15+3 LDA QQ15+4 \ s1_lo = s2_lo STA QQ15+2 CLC \ s2_lo = X + s1_lo TXA ADC QQ15+2 STA QQ15+4 TYA \ s2_hi = Y + s1_hi + C ADC QQ15+3 STA QQ15+5 RTS \ The twist is complete so return from the subroutine
Name: TT146 Type: Subroutine Category: Text Summary: Print the distance to the selected system in light years
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT146 * TT25 calls TT146

If it is non-zero, print the distance to the selected system in light years. If it is zero, just move the text cursor down a line. Specifically, if the distance in QQ8 is non-zero, print token 31 ("DISTANCE"), then a colon, then the distance to one decimal place, then token 35 ("LIGHT YEARS"). If the distance is zero, move the cursor down one line.
.TT146 LDA QQ8 \ Take the two bytes of the 16-bit value in QQ8 and ORA QQ8+1 \ OR them together to check whether there are any BNE TT63 \ non-zero bits, and if so, jump to TT63 to print the \ distance INC YC \ The distance is zero, so we just move the text cursor RTS \ in YC down by one line and return from the subroutine .TT63 LDA #191 \ Print recursive token 31 ("DISTANCE") followed by JSR TT68 \ a colon LDX QQ8 \ Load (Y X) from QQ8, which contains the 16-bit LDY QQ8+1 \ distance we want to show SEC \ Set the C flag so that the call to pr5 will include a \ decimal point, and display the value as (Y X) / 10 JSR pr5 \ Print (Y X) to 5 digits, including a decimal point LDA #195 \ Set A to the recursive token 35 (" LIGHT YEARS") and \ fall through into TT60 to print the token followed \ by a paragraph break
Name: TT60 Type: Subroutine Category: Text Summary: Print a text token and a paragraph break
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT213 calls TT60 * TT25 calls TT60

Print a text token (i.e. a character, control code, two-letter token or recursive token). Then print a paragraph break (a blank line between paragraphs) by moving the cursor down a line, setting Sentence Case, and then printing a newline. Arguments: A The text token to be printed
.TT60 JSR TT27 \ Print the text token in A and fall through into TTX69 \ to print the paragraph break
Name: TTX69 Type: Subroutine Category: Text Summary: Print a paragraph break
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT25 calls TTX69

Print a paragraph break (a blank line between paragraphs) by moving the cursor down a line, setting Sentence Case, and then printing a newline.
.TTX69 INC YC \ Move the text cursor down a line \ Fall through into TT69 to set Sentence Case and print \ a newline
Name: TT69 Type: Subroutine Category: Text Summary: Set Sentence Case and print a newline
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT210 calls TT69 * sell_jump calls TT69
.TT69 LDA #%10000000 \ Set bit 7 of QQ17 to switch to Sentence Case STA QQ17 \ Fall through into TT67 to print a newline
Name: TT67 Type: Subroutine Category: Text Summary: Print a newline
Context: See this subroutine on its own page References: This subroutine is called as follows: * CLYNS calls TT67 * EQSHP calls TT67 * NWDAV4 calls TT67 * STATUS calls TT67 * TT208 calls TT67 * TT219 calls TT67 * confirm calls TT67 * menu calls TT67 * n_buyship calls TT67 * plf calls TT67 * sell_jump calls TT67
.TT67 LDA #12 \ Load a newline character into A JMP TT27 \ Print the text token in A and return from the \ subroutine using a tail call
Name: TT70 Type: Subroutine Category: Text Summary: Display "MAINLY " and jump to TT72
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT25 calls TT70

This subroutine is called by TT25 when displaying a system's economy.
.TT70 LDA #173 \ Print recursive token 13 ("MAINLY ") JSR TT27 JMP TT72 \ Jump to TT72 to continue printing system data as part \ of routine TT25
Name: spc Type: Subroutine Category: Text Summary: Print a text token followed by a space
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls spc * STATUS calls spc * TT25 calls spc * dn calls spc * qv calls spc

Print a text token (i.e. a character, control code, two-letter token or recursive token) followed by a space. Arguments: A The text token to be printed
.spc JSR TT27 \ Print the text token in A JMP TT162 \ Print a space and return from the subroutine using a \ tail call
Name: TT25 Type: Subroutine Category: Universe Summary: Show the Data on System screen (red key f6) or Encyclopedia screen (CTRL-f6) Deep dive: Generating system data Galaxy and system seeds
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT25 * TT70 calls entry point TT72

Other entry points: TT72 Used by TT70 to re-enter the routine after displaying "MAINLY" for the economy type
Name: TT24 Type: Subroutine Category: Universe Summary: Calculate system data from the system seeds Deep dive: Generating system data Galaxy and system seeds
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT111 calls TT24

Calculate system data from the seeds in QQ15 and store them in the relevant locations. Specifically, this routine calculates the following from the three 16-bit seeds in QQ15 (using only s0_hi, s1_hi and s1_lo): QQ3 = economy (0-7) QQ4 = government (0-7) QQ5 = technology level (0-14) QQ6 = population * 10 (1-71) QQ7 = productivity (96-62480) The ranges of the various values are shown in brackets. Note that the radius and type of inhabitant are calculated on-the-fly in the TT25 routine when the system data gets displayed, so they aren't calculated here.
Name: TT22 Type: Subroutine Category: Charts Summary: Show the Long-range Chart (red key f4)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT22 * TT114 calls TT22
.TT22 LDA #64 \ Clear the top part of the screen, draw a white border, JSR TT66 \ and set the current view type in QQ11 to 32 (Long- \ range Chart) LDA #7 \ Move the text cursor to column 7 STA XC JSR TT81 \ Set the seeds in QQ15 to those of system 0 in the \ current galaxy (i.e. copy the seeds from QQ21 to QQ15) LDA #199 \ Print recursive token 39 ("GALACTIC CHART{galaxy JSR TT27 \ number right-aligned to width 3}") JSR NLIN \ Draw a horizontal line at pixel row 23 to box in the \ title and act as the top frame of the chart, and move \ the text cursor down one line LDA #152 \ Draw a screen-wide horizontal line at pixel row 152 JSR NLIN2 \ for the bottom edge of the chart, so the chart itself \ is 128 pixels high, starting on row 24 and ending on \ row 151 JSR TT14 \ Call TT14 to draw a circle with crosshairs at the \ current system's galactic coordinates LDX #0 \ We're now going to plot each of the galaxy's systems, \ so set up a counter in X for each system, starting at \ 0 and looping through to 255 .TT83 STX XSAV \ Store the counter in XSAV LDX QQ15+3 \ Fetch the s1_hi seed into X, which gives us the \ galactic x-coordinate of this system LDY QQ15+4 \ Fetch the s2_lo seed and set bits 4 and 6, storing the TYA \ result in ZZ to give a random number between 80 and ORA #%01010000 \ (but which will always be the same for this system). STA ZZ \ We use this value to determine the size of the point \ for this system on the chart by passing it as the \ distance argument to the PIXEL routine below LDA QQ15+1 \ Fetch the s0_hi seed into A, which gives us the \ galactic y-coordinate of this system LSR A \ We halve the y-coordinate because the galaxy in \ in Elite is rectangular rather than square, and is \ twice as wide (x-axis) as it is high (y-axis), so the \ chart is 256 pixels wide and 128 high CLC \ Add 24 to the halved y-coordinate and store in XX15+1 ADC #24 \ (as the top of the chart is on pixel row 24, just STA XX15+1 \ below the line we drew on row 23 above) JSR PIXEL \ Call PIXEL to draw a point at (X, A), with the size of \ the point dependent on the distance specified in ZZ \ (so a high value of ZZ will produce a 1-pixel point, \ a medium value will produce a 2-pixel dash, and a \ small value will produce a 4-pixel square) JSR TT20 \ We want to move on to the next system, so call TT20 \ to twist the three 16-bit seeds in QQ15 LDX XSAV \ Restore the loop counter from XSAV INX \ Increment the counter BNE TT83 \ If X > 0 then we haven't done all 256 systems yet, so \ loop back up to TT83 LDA QQ9 \ Set QQ19 to the selected system's x-coordinate STA QQ19 LDA QQ10 \ Set QQ19+1 to the selected system's y-coordinate, LSR A \ halved to fit it into the chart STA QQ19+1 LDA #4 \ Set QQ19+2 to size 4 for the crosshairs size STA QQ19+2 \ Fall through into TT15 to draw crosshairs of size 4 at \ the selected system's coordinates
Name: TT15 Type: Subroutine Category: Drawing lines Summary: Draw a set of crosshairs
Context: See this subroutine on its own page References: This subroutine is called as follows: * SIGHT calls TT15 * TT103 calls TT15 * TT105 calls TT15 * TT14 calls TT15

For all views except the Short-range Chart, the centre is drawn 24 pixels to the right of the y-coordinate given. Arguments: QQ19 The pixel x-coordinate of the centre of the crosshairs QQ19+1 The pixel y-coordinate of the centre of the crosshairs QQ19+2 The size of the crosshairs
.TT15 LDA #24 \ Set A to 24, which we will use as the minimum \ screen indent for the crosshairs (i.e. the minimum \ distance from the top-left corner of the screen) LDX QQ11 \ If the current view is not the Short-range Chart, BPL P%+4 \ which is the only view with bit 7 set, then skip the \ following instruction LDA #0 \ This is the Short-range Chart, so set A to 0, so the \ crosshairs can go right up against the screen edges STA QQ19+5 \ Set QQ19+5 to A, which now contains the correct indent \ for this view LDA QQ19 \ Set A = crosshairs x-coordinate - crosshairs size SEC \ to get the x-coordinate of the left edge of the SBC QQ19+2 \ crosshairs BCS TT84 \ If the above subtraction didn't underflow, then A is \ positive, so skip the next instruction LDA #0 \ The subtraction underflowed, so set A to 0 so the \ crosshairs don't spill out of the left of the screen .TT84 \ In the following, the authors have used XX15 for \ temporary storage. XX15 shares location with X1, Y1, \ X2 and Y2, so in the following, you can consider \ the variables like this: \ \ XX15 is the same as X1 \ XX15+1 is the same as Y1 \ XX15+2 is the same as X2 \ XX15+3 is the same as Y2 \ \ Presumably this routine was written at a different \ time to the line-drawing routine, before the two \ workspaces were merged to save space STA XX15 \ Set XX15 (X1) = A (the x-coordinate of the left edge \ of the crosshairs) LDA QQ19 \ Set A = crosshairs x-coordinate + crosshairs size CLC \ to get the x-coordinate of the right edge of the ADC QQ19+2 \ crosshairs BCC P%+4 \ If the above addition didn't overflow, then A is \ correct, so skip the next instruction LDA #255 \ The addition overflowed, so set A to 255 so the \ crosshairs don't spill out of the right of the screen \ (as 255 is the x-coordinate of the rightmost pixel \ on-screen) STA XX15+2 \ Set XX15+2 (X2) = A (the x-coordinate of the right \ edge of the crosshairs) LDA QQ19+1 \ Set XX15+1 (Y1) = crosshairs y-coordinate + indent CLC \ to get the y-coordinate of the centre of the ADC QQ19+5 \ crosshairs STA XX15+1 JSR HLOIN \ Draw a horizontal line from (X1, Y1) to (X2, Y1), \ which will draw from the left edge of the crosshairs \ to the right edge, through the centre of the \ crosshairs LDA QQ19+1 \ Set A = crosshairs y-coordinate - crosshairs size SEC \ to get the y-coordinate of the top edge of the SBC QQ19+2 \ crosshairs BCS TT86 \ If the above subtraction didn't underflow, then A is \ correct, so skip the next instruction LDA #0 \ The subtraction underflowed, so set A to 0 so the \ crosshairs don't spill out of the top of the screen .TT86 CLC \ Set XX15+1 (Y1) = A + indent to get the y-coordinate ADC QQ19+5 \ of the top edge of the indented crosshairs STA XX15+1 LDA QQ19+1 \ Set A = crosshairs y-coordinate + crosshairs size CLC \ + indent to get the y-coordinate of the bottom edge ADC QQ19+2 \ of the indented crosshairs ADC QQ19+5 CMP #152 \ If A < 152 then skip the following, as the crosshairs BCC TT87 \ won't spill out of the bottom of the screen LDX QQ11 \ A >= 152, so we need to check whether this will fit in \ this view, so fetch the view number BMI TT87 \ If this is the Short-range Chart then the y-coordinate \ is fine, so skip to TT87 LDA #151 \ Otherwise this is the Long-range Chart, so we need to \ clip the crosshairs at a maximum y-coordinate of 151 .TT87 STA XX15+3 \ Set XX15+3 (Y2) = A (the y-coordinate of the bottom \ edge of the crosshairs) LDA QQ19 \ Set XX15 (X1) = the x-coordinate of the centre of the STA XX15 \ crosshairs STA XX15+2 \ Set XX15+2 (X2) = the x-coordinate of the centre of \ the crosshairs JMP LL30 \ Draw a vertical line (X1, Y1) to (X2, Y2), which will \ draw from the top edge of the crosshairs to the bottom \ edge, through the centre of the crosshairs, returning \ from the subroutine using a tail call
Name: TT14 Type: Subroutine Category: Drawing circles Summary: Draw a circle with crosshairs on a chart
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT22 calls TT14 * TT23 calls TT14

Draw a circle with crosshairs at the current system's galactic coordinates.
.TT126 LDA #104 \ Set QQ19 = 104, for the x-coordinate of the centre of STA QQ19 \ the fixed circle on the Short-range Chart LDA #90 \ Set QQ19+1 = 90, for the y-coordinate of the centre of STA QQ19+1 \ the fixed circle on the Short-range Chart LDA #16 \ Set QQ19+2 = 16, the size of the crosshairs on the STA QQ19+2 \ Short-range Chart JSR TT15 \ Draw the set of crosshairs defined in QQ19, at the \ exact coordinates as this is the Short-range Chart LDA QQ14 \ Set K to the fuel level from QQ14, so this can act as STA K \ the circle's radius (70 being a full tank) JMP TT128 \ Jump to TT128 to draw a circle with the centre at the \ same coordinates as the crosshairs, (QQ19, QQ19+1), \ and radius K that reflects the current fuel levels, \ returning from the subroutine using a tail call .TT14 LDA QQ11 \ If the current view is the Short-range Chart, which BMI TT126 \ is the only view with bit 7 set, then jump up to TT126 \ to draw the crosshairs and circle for that view \ Otherwise this is the Long-range Chart, so we draw the \ crosshairs and circle for that view instead LDA QQ14 \ Set K to the fuel level from QQ14 divided by 4, so LSR A \ this can act as the circle's radius (70 being a full LSR A \ tank, which divides down to a radius of 17) STA K LDA QQ0 \ Set QQ19 to the x-coordinate of the current system, STA QQ19 \ which will be the centre of the circle and crosshairs \ we draw LDA QQ1 \ Set QQ19+1 to the y-coordinate of the current system, LSR A \ halved because the galactic chart is half as high as STA QQ19+1 \ it is wide, which will again be the centre of the \ circle and crosshairs we draw LDA #7 \ Set QQ19+2 = 7, the size of the crosshairs on the STA QQ19+2 \ Long-range Chart JSR TT15 \ Draw the set of crosshairs defined in QQ19, which will \ be drawn 24 pixels to the right of QQ19+1 LDA QQ19+1 \ Add 24 to the y-coordinate of the crosshairs in QQ19+1 CLC \ so that the centre of the circle matches the centre ADC #24 \ of the crosshairs STA QQ19+1 \ Fall through into TT128 to draw a circle with the \ centre at the same coordinates as the crosshairs, \ (QQ19, QQ19+1), and radius K that reflects the \ current fuel levels
Name: TT128 Type: Subroutine Category: Drawing circles Summary: Draw a circle on a chart Deep dive: Drawing circles
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT14 calls TT128

Draw a circle with the centre at (QQ19, QQ19+1) and radius K. Arguments: QQ19 The x-coordinate of the centre of the circle QQ19+1 The y-coordinate of the centre of the circle K The radius of the circle
.TT128 LDA QQ19 \ Set K3 = the x-coordinate of the centre STA K3 LDA QQ19+1 \ Set K4 = the y-coordinate of the centre STA K4 LDX #0 \ Set the high bytes of K3(1 0) and K4(1 0) to 0 STX K4+1 STX K3+1 INX \ Set LSP = 1 to reset the ball line heap STX LSP INX \ Set STP = 2, the step size for the circle STX STP JMP CIRCLE2 \ Jump to CIRCLE2 to draw a circle with the centre at \ (K3(1 0), K4(1 0)) and radius K, returning from the \ subroutine using a tail call
Name: TT219 Type: Subroutine Category: Market Summary: Show the Buy Cargo screen (red key f1) or Special Cargo screen (CTRL-f1)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT219 * TT210 calls entry point BAY2 * gnum calls entry point BAY2

Other entry points: BAY2 Jump into the main loop at FRCE, setting the key "pressed" to red key f9 (so we show the Inventory screen)
Name: sell_yn Type: Subroutine Category: Text Summary: Print a "Sell(Y/N)?" prompt and get a number from the keyboard
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT210 calls sell_yn * status_equip calls sell_yn

The arguments and results for this routine are the same as for gnum. Arguments: QQ25 The maximum number allowed Returns: A The number entered R Also contains the number entered C flag Set if the number is too large (> QQ25), clear otherwise
.sell_yn LDA #205 \ Print recursive token 45 ("SELL") JSR TT27 LDA #206 \ Print extended token 206 ("{all caps}(Y/N)?") JSR DETOK \ Fall through into gnum to get a number from the \ keyboard
Name: gnum Type: Subroutine Category: Market Summary: Get a number from the keyboard
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls gnum * TT219 calls gnum * cour_buy calls gnum * menu calls gnum * n_buyship calls gnum

Get a number from the keyboard, up to the maximum number in QQ25, for the buying and selling of cargo and equipment. Pressing "Y" will return the maximum number (i.e. buy/sell all items), while pressing "N" will abort the sale and return a 0. Pressing a key with an ASCII code less than ASCII "0" will return a 0 in A (so that includes pressing Space or Return), while pressing a key with an ASCII code greater than ASCII "9" will jump to the Inventory screen (so that includes all letters and most punctuation). Arguments: QQ25 The maximum number allowed Returns: A The number entered R Also contains the number entered C flag Set if the number is too large (> QQ25), clear otherwise
Name: sell_jump Type: Subroutine Category: Equipment Summary: Show the Sell Equipment screen (CTRL-f2)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT208 calls sell_jump
.sell_jump INC XC \ Move the text cursor down one line LDA #207 \ Print recursive token 47 ("EQUIP") and draw a JSR NLIN3 \ horizontal line at pixel row 19 to box in the title JSR TT69 \ Call TT69 to set Sentence Case and print a newline JSR TT67 \ Print a newline JSR sell_equip \ Call sell_equip to show the Sell Equipment screen, \ which will run through all the equipment apart from \ the escape pod LDA ESCP \ If we do not have an escape pod fitted, in which case BEQ sell_escape \ ESCP will be 0, jump to sell_escape LDA #112 \ We do have an E.C.M. fitted, so print recursive token LDX #30 \ 112 ("ESCAPE POD"), and as this is the Sell Equipment JSR status_equip \ screen, show and process a sell prompt for the piece \ of equipment at LASER+X = LASER+30 = ESCP before \ printing a newline .sell_escape JMP BAY \ Go to the docking bay (i.e. show the Status Mode \ screen) and return from the subroutine with a tail \ call
Name: NWDAV4 Type: Subroutine Category: Market Summary: Print an "ITEM?" error, make a beep and rejoin the TT210 routine
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT210 calls NWDAV4
.NWDAV4 JSR TT67 \ Print a newline LDA #176 \ Print recursive token 127 ("ITEM") followed by a JSR prq \ question mark JSR dn2 \ Call dn2 to make a short, high beep and delay for 1 \ second LDY QQ29 \ Fetch the item number we are selling from QQ29 JMP NWDAVxx \ Jump back into the TT210 routine that called NWDAV4
Name: TT208 Type: Subroutine Category: Market Summary: Show the Sell Cargo screen (red key f2) or Sell Equipment screen (CTRL-f2)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT208
.TT208 LDA #4 \ Clear the top part of the screen, draw a white border, JSR TT66 \ and set the current view type in QQ11 to 4 (Sell \ Cargo screen) LDA #10 \ Move the text cursor to column 10 STA XC JSR FLKB \ Flush the keyboard buffer LDA #205 \ Print recursive token 45 ("SELL") JSR TT27 JSR CTRL \ Scan the keyboard to see if CTRL is currently pressed, \ returning a negative value in A if it is BMI sell_jump \ If CTRL is being pressed, jump to sell_jump to show \ the Sell Equipment screen (CTRL-f2) LDA #206 \ Print recursive token 46 (" CARGO{sentence case}") JSR NLIN3 \ draw a horizontal line at pixel row 19 to box in the \ title JSR TT67 \ Print a newline \ Fall through into TT210 to show the Inventory screen \ with the option to sell
Name: TT210 Type: Subroutine Category: Inventory Summary: Show a list of current cargo in our hold, optionally to sell
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT213 calls TT210 * NWDAV4 calls entry point NWDAVxx

Show a list of current cargo in our hold, either with the ability to sell (the Sell Cargo screen) or without (the Inventory screen), depending on the current view. Arguments: QQ11 The current view: * 4 = Sell Cargo * 8 = Inventory Other entry points: NWDAVxx Used to rejoin this routine from the call to NWDAV4
Name: TT213 Type: Subroutine Category: Inventory Summary: Show the Inventory screen (red key f9)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT213
.TT213 LDA #8 \ Clear the top part of the screen, draw a white border, JSR TT66 \ and set the current view type in QQ11 to 8 (Inventory \ screen) LDA #11 \ Move the text cursor to column 11 to print the screen STA XC \ title LDA #164 \ Print recursive token 4 ("INVENTORY{crlf}") followed JSR TT60 \ by a paragraph break and Sentence Case JSR NLIN4 \ Draw a horizontal line at pixel row 19 to box in the \ title. The authors could have used a call to NLIN3 \ instead and saved the above call to TT60, but you \ just can't optimise everything JSR fwl \ Call fwl to print the fuel and cash levels on two \ separate lines LDA #14 \ Print recursive token 128 ("SPACE") followed by a JSR TT68 \ colon LDX new_hold \ Set X to the amount of free space in our current DEX \ ship's hold, minus 1 as new_hold contains the amount \ of free space plus 1 CLC \ Call pr2 to print the amount of free space as a JSR pr2 \ 3-digit number without a decimal point (by clearing \ the C flag) JSR TT160 \ Print "t" (for tonne) and a space JMP TT210 \ Jump to TT210 to print the contents of our cargo bay \ and return from the subroutine using a tail call
Name: TT16 Type: Subroutine Category: Charts Summary: Move the crosshairs on a chart
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT16

Move the chart crosshairs by the amount in X and Y. Arguments: X The amount to move the crosshairs in the x-axis Y The amount to move the crosshairs in the y-axis
.TT16 TXA \ Push the change in X onto the stack (let's call this PHA \ the x-delta) DEY \ Negate the change in Y and push it onto the stack TYA \ (let's call this the y-delta) EOR #&FF PHA JSR TT103 \ Draw small crosshairs at coordinates (QQ9, QQ10), \ which will erase the crosshairs currently there PLA \ Store the y-delta in QQ19+3 and fetch the current STA QQ19+3 \ y-coordinate of the crosshairs from QQ10 into A, ready LDA QQ10 \ for the call to TT123 JSR TT123 \ Call TT123 to move the selected system's galactic \ y-coordinate by the y-delta, putting the new value in \ QQ19+4 LDA QQ19+4 \ Store the updated y-coordinate in QQ10 (the current STA QQ10 \ y-coordinate of the crosshairs) STA QQ19+1 \ This instruction has no effect, as QQ19+1 is \ overwritten below, both in TT103 and TT105 PLA \ Store the x-delta in QQ19+3 and fetch the current STA QQ19+3 \ x-coordinate of the crosshairs from QQ10 into A, ready LDA QQ9 \ for the call to TT123 JSR TT123 \ Call TT123 to move the selected system's galactic \ x-coordinate by the x-delta, putting the new value in \ QQ19+4 LDA QQ19+4 \ Store the updated x-coordinate in QQ9 (the current STA QQ9 \ x-coordinate of the crosshairs) STA QQ19 \ This instruction has no effect, as QQ19 is overwritten \ below, both in TT103 and TT105 \ Now we've updated the coordinates of the crosshairs, \ fall through into TT103 to redraw them at their new \ location
Name: TT103 Type: Subroutine Category: Charts Summary: Draw a small set of crosshairs on a chart
Context: See this subroutine on its own page References: This subroutine is called as follows: * HME2 calls TT103 * TT102 calls TT103 * TT16 calls TT103 * TT23 calls TT103 * hm calls TT103

Draw a small set of crosshairs on a galactic chart at the coordinates in (QQ9, QQ10).
.TT103 LDA QQ11 \ Fetch the current view type into A BMI TT105 \ If this is the Short-range Chart screen, jump to TT105 LDA QQ9 \ Store the crosshairs x-coordinate in QQ19 STA QQ19 LDA QQ10 \ Halve the crosshairs y-coordinate and store it in QQ19 LSR A \ (we halve it because the Long-range Chart is half as STA QQ19+1 \ high as it is wide) LDA #4 \ Set QQ19+2 to 4 denote crosshairs of size 4 STA QQ19+2 JMP TT15 \ Jump to TT15 to draw crosshairs of size 4 at the \ crosshairs coordinates, returning from the subroutine \ using a tail call
Name: TT123 Type: Subroutine Category: Charts Summary: Move galactic coordinates by a signed delta
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT16 calls TT123 * TT105 calls entry point TT180

Move an 8-bit galactic coordinate by a certain distance in either direction (i.e. a signed 8-bit delta), but only if it doesn't cause the coordinate to overflow. The coordinate is in a single axis, so it's either an x-coordinate or a y-coordinate. Arguments: A The galactic coordinate to update QQ19+3 The delta (can be positive or negative) Returns: QQ19+4 The updated coordinate after moving by the delta (this will be the same as A if moving by the delta overflows) Other entry points: TT180 Contains an RTS
.TT123 STA QQ19+4 \ Store the original coordinate in temporary storage at \ QQ19+4 CLC \ Set A = A + QQ19+3, so A now contains the original ADC QQ19+3 \ coordinate, moved by the delta LDX QQ19+3 \ If the delta is negative, jump to TT124 BMI TT124 BCC TT125 \ If the C flag is clear, then the above addition didn't \ overflow, so jump to TT125 to return the updated value RTS \ Otherwise the C flag is set and the above addition \ overflowed, so do not update the return value .TT124 BCC TT180 \ If the C flag is clear, then because the delta is \ negative, this indicates the addition (which is \ effectively a subtraction) underflowed, so jump to \ TT180 to return from the subroutine without updating \ the return value .TT125 STA QQ19+4 \ Store the updated coordinate in QQ19+4 .TT180 RTS \ Return from the subroutine
Name: TT105 Type: Subroutine Category: Charts Summary: Draw crosshairs on the Short-range Chart, with clipping
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT103 calls TT105

Check whether the crosshairs are close enough to the current system to appear on the Short-range Chart, and if so, draw them.
.TT105 LDA QQ9 \ Set A = QQ9 - QQ0, the horizontal distance between the SEC \ crosshairs (QQ9) and the current system (QQ0) SBC QQ0 CMP #38 \ If the horizontal distance in A < 38, then the BCC TT179 \ crosshairs are close enough to the current system to \ appear in the Short-range Chart, so jump to TT179 to \ check the vertical distance CMP #230 \ If the horizontal distance in A < -26, then the BCC TT180 \ crosshairs are too far from the current system to \ appear in the Short-range Chart, so jump to TT180 to \ return from the subroutine (as TT180 contains an RTS) .TT179 ASL A \ Set QQ19 = 104 + A * 4 ASL A \ CLC \ 104 is the x-coordinate of the centre of the chart, ADC #104 \ so this sets QQ19 to the screen pixel x-coordinate STA QQ19 \ of the crosshairs LDA QQ10 \ Set A = QQ10 - QQ1, the vertical distance between the SEC \ crosshairs (QQ10) and the current system (QQ1) SBC QQ1 CMP #38 \ If the vertical distance in A is < 38, then the BCC P%+6 \ crosshairs are close enough to the current system to \ appear in the Short-range Chart, so skip the next two \ instructions CMP #220 \ If the horizontal distance in A is < -36, then the BCC TT180 \ crosshairs are too far from the current system to \ appear in the Short-range Chart, so jump to TT180 to \ return from the subroutine (as TT180 contains an RTS) ASL A \ Set QQ19+1 = 90 + A * 2 CLC \ ADC #90 \ 90 is the y-coordinate of the centre of the chart, STA QQ19+1 \ so this sets QQ19+1 to the screen pixel x-coordinate \ of the crosshairs LDA #8 \ Set QQ19+2 to 8 denote crosshairs of size 8 STA QQ19+2 JMP TT15 \ Jump to TT15 to draw crosshairs of size 8 at the \ crosshairs coordinates, returning from the subroutine \ using a tail call
Name: TT23 Type: Subroutine Category: Charts Summary: Show the Short-range Chart (red key f5)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT23 * TT114 calls TT23
Name: TT81 Type: Subroutine Category: Universe Summary: Set the selected system's seeds to those of system 0
Context: See this subroutine on its own page References: This subroutine is called as follows: * HME2 calls TT81 * TT111 calls TT81 * TT22 calls TT81 * TT23 calls TT81 * cour_buy calls TT81

Copy the three 16-bit seeds for the current galaxy's system 0 (QQ21) into the seeds for the selected system (QQ15) - in other words, set the selected system's seeds to those of system 0.
.TT81 LDX #5 \ Set up a counter in X to copy six bytes (for three \ 16-bit numbers) LDA QQ21,X \ Copy the X-th byte in QQ21 to the X-th byte in QQ15 STA QQ15,X DEX \ Decrement the counter BPL TT81+2 \ Loop back up to the LDA instruction if we still have \ more bytes to copy RTS \ Return from the subroutine
Name: TT111 Type: Subroutine Category: Universe Summary: Set the current system to the nearest system to a point
Context: See this subroutine on its own page References: This subroutine is called as follows: * ESCAPE calls TT111 * Ghy calls TT111 * HME2 calls TT111 * STATUS calls TT111 * TT102 calls TT111 * TT110 calls TT111 * hm calls TT111 * hyp calls TT111 * hyp1 calls TT111 * TT23 calls entry point TT111-1

Given a set of galactic coordinates in (QQ9, QQ10), find the nearest system to this point in the galaxy, and set this as the currently selected system. Arguments: QQ9 The x-coordinate near which we want to find a system QQ10 The y-coordinate near which we want to find a system Returns: QQ8(1 0) The distance from the current system to the nearest system to the original coordinates QQ9 The x-coordinate of the nearest system to the original coordinates QQ10 The y-coordinate of the nearest system to the original coordinates QQ15 to QQ15+5 The three 16-bit seeds of the nearest system to the original coordinates ZZ The system number of the nearest system Other entry points: TT111-1 Contains an RTS
Name: jmp Type: Subroutine Category: Universe Summary: Set the current system to the selected system
Context: See this subroutine on its own page References: This subroutine is called as follows: * ESCAPE calls jmp * Ghy calls jmp * hyp1 calls jmp * hyp1_FLIGHT calls jmp

Returns: (QQ0, QQ1) The galactic coordinates of the new system Other entry points: hy5 Contains an RTS
.jmp LDA QQ9 \ Set the current system's galactic x-coordinate to the STA QQ0 \ x-coordinate of the selected system LDA QQ10 \ Set the current system's galactic y-coordinate to the STA QQ1 \ y-coordinate of the selected system .hy5 RTS \ Return from the subroutine
Name: pr6 Type: Subroutine Category: Text Summary: Print 16-bit number, left-padded to 5 digits, no point
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT25 calls pr6 * ee3 calls pr6

Print the 16-bit number in (Y X) to 5 digits, left-padding with spaces for numbers with fewer than 3 digits (so numbers < 10000 are right-aligned), with no decimal point. Arguments: X The low byte of the number to print Y The high byte of the number to print
.pr6 CLC \ Do not display a decimal point when printing \ Fall through into pr5 to print X to 5 digits
Name: pr5 Type: Subroutine Category: Text Summary: Print a 16-bit number, left-padded to 5 digits, and optional point
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT146 calls pr5 * TT151 calls pr5 * TT25 calls pr5

Print the 16-bit number in (Y X) to 5 digits, left-padding with spaces for numbers with fewer than 3 digits (so numbers < 10000 are right-aligned). Optionally include a decimal point. Arguments: X The low byte of the number to print Y The high byte of the number to print C flag If set, include a decimal point
.pr5 LDA #5 \ Set the number of digits to print to 5 JMP TT11 \ Call TT11 to print (Y X) to 5 digits and return from \ the subroutine using a tail call
Name: prq Type: Subroutine Category: Text Summary: Print a text token followed by a question mark
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls prq * NWDAV4 calls prq * TT147 calls prq * TT219 calls prq * cour_buy calls prq * eq calls prq * n_buyship calls prq * qv calls prq

Arguments: A The text token to be printed
.prq JSR TT27 \ Print the text token in A LDA #'?' \ Print a question mark and return from the JMP TT27 \ subroutine using a tail call
Name: TT151 Type: Subroutine Category: Market Summary: Print the name, price and availability of a market item Deep dive: Market item prices and availability Galaxy and system seeds
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT167 calls TT151 * TT210 calls TT151 * TT219 calls TT151

Arguments: A The number of the market item to print, 0-16 (see QQ23 for details of item numbers) Returns: QQ19+1 Byte #1 from the market prices table for this item QQ24 The item's price / 4 QQ25 The item's availability
Name: TT152 Type: Subroutine Category: Market Summary: Print the unit ("t", "kg" or "g") for a market item
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT151 calls TT152 * TT210 calls TT152 * TT219 calls TT152

Print the unit ("t", "kg" or "g") for the market item whose byte #1 from the market prices table is in QQ19+1, right-padded with spaces to a width of two characters (so that's "t ", "kg" or "g ").
.TT152 LDA QQ19+1 \ Fetch the economic_factor from QQ19+1 AND #96 \ If bits 5 and 6 are both clear, jump to TT160 to BEQ TT160 \ print "t" for tonne, followed by a space, and return \ from the subroutine using a tail call CMP #32 \ If bit 5 is set, jump to TT161 to print "kg" for BEQ TT161 \ kilograms, and return from the subroutine using a tail \ call JSR TT16a \ Otherwise call TT16a to print "g" for grams, and fall \ through into TT162 to print a space and return from \ the subroutine
Name: TT162 Type: Subroutine Category: Text Summary: Print a space Other entry points: TT162+2 Jump to TT27 to print the text token in A
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls TT162 * TT160 calls TT162 * TT219 calls TT162 * TT25 calls TT162 * TTX66 calls TT162 * cour_count calls TT162 * dn calls TT162 * menu calls TT162 * n_buyship calls TT162 * spc calls TT162 * TT151 calls entry point TT162+2 * TT163 calls entry point TT162+2
.TT162 LDA #' ' \ Load a space character into A JMP TT27 \ Print the text token in A and return from the \ subroutine using a tail call
Name: TT160 Type: Subroutine Category: Market Summary: Print "t" (for tonne) and a space
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT152 calls TT160 * TT213 calls TT160
.TT160 LDA #'t' \ Load a "t" character into A JSR TT26 \ Print the character, using TT216 so that it doesn't \ change the character case BCC TT162 \ Jump to TT162 to print a space and return from the \ subroutine using a tail call (this BCC is effectively \ a JMP as the C flag is cleared by TT26)
Name: TT161 Type: Subroutine Category: Market Summary: Print "kg" (for kilograms)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT152 calls TT161
.TT161 LDA #'k' \ Load a "k" character into A JSR TT26 \ Print the character, using TT216 so that it doesn't \ change the character case, and fall through into \ TT16a to print a "g" character
Name: TT16a Type: Subroutine Category: Market Summary: Print "g" (for grams)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT152 calls TT16a
.TT16a LDA #'g' \ Load a "g" character into A JMP TT26 \ Print the character, using TT216 so that it doesn't \ change the character case, and return from the \ subroutine using a tail call
Name: TT163 Type: Subroutine Category: Market Summary: Print the headers for the table of market prices
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT167 calls TT163 * TT219 calls TT163

Print the column headers for the prices table in the Buy Cargo and Market Price screens.
.TT163 LDA #17 \ Move the text cursor in XC to column 17 STA XC LDA #255 \ Print recursive token 95 token ("UNIT QUANTITY BNE TT162+2 \ {crlf} PRODUCT UNIT PRICE FOR SALE{crlf}{lf}") by \ jumping to TT162+2, which contains JMP TT27 (this BNE \ is effectively a JMP as A will never be zero), and \ return from the subroutine using a tail call
Name: TT167 Type: Subroutine Category: Market Summary: Show the Market Price screen (red key f7)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls TT167
.TT167 LDA #16 \ Clear the top part of the screen, draw a white border, JSR TT66 \ and set the current view type in QQ11 to 16 (Market \ Price screen) LDA #5 \ Move the text cursor to column 4 STA XC LDA #167 \ Print recursive token 7 ("{current system name} MARKET JSR NLIN3 \ PRICES") and draw a horizontal line at pixel row 19 \ to box in the title LDA #3 \ Move the text cursor to row 3 STA YC JSR TT163 \ Print the column headers for the prices table LDA #0 \ We're going to loop through all the available market STA QQ29 \ items, so we set up a counter in QQ29 to denote the \ current item and start it at 0 .TT168 LDX #%10000000 \ Set bit 7 of QQ17 to switch to Sentence Case, with the STX QQ17 \ next letter in capitals JSR TT151 \ Call TT151 to print the item name, market price and \ availability of the current item, and set QQ24 to the \ item's price / 4, QQ25 to the quantity available and \ QQ19+1 to byte #1 from the market prices table for \ this item INC YC \ Move the text cursor down one row INC QQ29 \ Increment QQ29 to point to the next item LDA QQ29 \ If QQ29 >= 17 then jump to TT168 as we have done the CMP #17 \ last item BCC TT168 RTS \ Return from the subroutine
Name: var Type: Subroutine Category: Market Summary: Calculate QQ19+3 = economy * |economic_factor|
Context: See this subroutine on its own page References: This subroutine is called as follows: * GVL calls var * TT151 calls var

Set QQ19+3 = economy * |economic_factor|, given byte #1 of the market prices table for an item. Also sets the availability of alien items to 0. This routine forms part of the calculations for market item prices (TT151) and availability (GVL). Arguments: QQ19+1 Byte #1 of the market prices table for this market item (which contains the economic_factor in bits 0-5, and the sign of the economic_factor in bit 7)
.var LDA QQ19+1 \ Extract bits 0-5 from QQ19+1 into A, to get the AND #31 \ economic_factor without its sign, in other words: \ \ A = |economic_factor| LDY QQ28 \ Set Y to the economy byte of the current system STA QQ19+2 \ Store A in QQ19+2 CLC \ Clear the C flag so we can do additions below LDA #0 \ Set AVL+16 (availability of alien items) to 0, STA AVL+16 \ setting A to 0 in the process .TT153 \ We now do the multiplication by doing a series of \ additions in a loop, building the result in A. Each \ loop adds QQ19+2 (|economic_factor|) to A, and it \ loops the number of times given by the economy byte; \ in other words, because A starts at 0, this sets: \ \ A = economy * |economic_factor| DEY \ Decrement the economy in Y, exiting the loop when it BMI TT154 \ becomes negative ADC QQ19+2 \ Add QQ19+2 to A JMP TT153 \ Loop back to TT153 to do another addition .TT154 STA QQ19+3 \ Store the result in QQ19+3 RTS \ Return from the subroutine
Name: hyp1 Type: Subroutine Category: Universe Summary: Process a jump to the system closest to (QQ9, QQ10)
Context: See this subroutine on its own page References: This subroutine is called as follows: * BR1 (Part 2 of 2) calls hyp1

Do a hyperspace jump to the system closest to galactic coordinates (QQ9, QQ10), and set up the current system's state to those of the new system. Returns: (QQ0, QQ1) The galactic coordinates of the new system QQ2 to QQ2+6 The seeds of the new system EV Set to 0 QQ28 The new system's economy tek The new system's tech level gov The new system's government Other entry points: hyp1+3 Jump 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
.hyp1 JSR TT111 \ Select the system closest to galactic coordinates \ (QQ9, QQ10) JSR jmp \ Set the current system to the selected system LDX #5 \ We now want to copy the seeds for the selected system \ in QQ15 into QQ2, where we store the seeds for the \ current system, so set up a counter in X for copying \ 6 bytes (for three 16-bit seeds) .TT112 LDA QQ15,X \ Copy the X-th byte in QQ15 to the X-th byte in QQ2, to STA QQ2,X \ update the selected system to the new one. Note that \ this approach has a minor bug associated with it: if \ your hyperspace counter hits 0 just as you're docking, \ then you will magically appear in the station in your \ hyperspace destination, without having to go to the \ effort of actually flying there. This bug was fixed in \ later versions by saving the destination seeds in a \ separate location called safehouse, and using those \ instead... but that isn't the case in this version DEX \ Decrement the counter BPL TT112 \ Loop back to TT112 if we still have more bytes to \ copy INX \ Set X = 0 (as we ended the above loop with X = &FF) STX EV \ Set EV, the extra vessels spawning counter, to 0, as \ we are entering a new system with no extra vessels \ spawned LDA QQ3 \ Set the current system's economy in QQ28 to the STA QQ28 \ selected system's economy from QQ3 LDA QQ5 \ Set the current system's tech level in tek to the STA tek \ selected system's economy from QQ5 LDA QQ4 \ Set the current system's government in gov to the STA gov \ selected system's government from QQ4 RTS \ Return from the subroutine
Name: LCASH Type: Subroutine Category: Maths (Arithmetic) Summary: Subtract an amount of cash from the cash pot
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT219 calls LCASH * cour_buy calls LCASH * eq calls LCASH * stay_here calls LCASH

Subtract (Y X) cash from the cash pot in CASH, but only if there is enough cash in the pot. As CASH is a four-byte number, this calculates: CASH(0 1 2 3) = CASH(0 1 2 3) - (0 0 Y X) Returns: C flag If set, there was enough cash to do the subtraction If clear, there was not enough cash to do the subtraction
.LCASH STX T1 \ Subtract the least significant bytes: LDA CASH+3 \ SEC \ CASH+3 = CASH+3 - X SBC T1 STA CASH+3 STY T1 \ Then the second most significant bytes: LDA CASH+2 \ SBC T1 \ CASH+2 = CASH+2 - Y STA CASH+2 LDA CASH+1 \ Then the third most significant bytes (which are 0): SBC #0 \ STA CASH+1 \ CASH+1 = CASH+1 - 0 LDA CASH \ And finally the most significant bytes (which are 0): SBC #0 \ STA CASH \ CASH = CASH - 0 BCS TT113 \ If the C flag is set then the subtraction didn't \ underflow, so the value in CASH is correct and we can \ jump to TT113 to return from the subroutine with the \ C flag set to indicate success (as TT113 contains an \ RTS) \ Otherwise we didn't have enough cash in CASH to \ subtract (Y X) from it, so fall through into \ MCASH to reverse the sum and restore the original \ value in CASH, and returning with the C flag clear
Name: MCASH Type: Subroutine Category: Maths (Arithmetic) Summary: Add an amount of cash to the cash pot
Context: See this subroutine on its own page References: This subroutine is called as follows: * DEBRIEF calls MCASH * EQSHP calls MCASH * TT210 calls MCASH * cour_dock calls MCASH * status_equip calls MCASH * LCASH calls entry point TT113

Add (Y X) cash to the cash pot in CASH. As CASH is a four-byte number, this calculates: CASH(0 1 2 3) = CASH(0 1 2 3) + (Y X) Other entry points: TT113 Contains an RTS
.MCASH TXA \ Add the least significant bytes: CLC \ ADC CASH+3 \ CASH+3 = CASH+3 + X STA CASH+3 TYA \ Then the second most significant bytes: ADC CASH+2 \ STA CASH+2 \ CASH+2 = CASH+2 + Y LDA CASH+1 \ Then the third most significant bytes (which are 0): ADC #0 \ STA CASH+1 \ CASH+1 = CASH+1 + 0 LDA CASH \ And finally the most significant bytes (which are 0): ADC #0 \ STA CASH \ CASH = CASH + 0 CLC \ Clear the C flag, so if the above was done following \ a failed LCASH call, the C flag correctly indicates \ failure .TT113 RTS \ Return from the subroutine
Name: GCASH Type: Subroutine Category: Maths (Arithmetic) Summary: Calculate (Y X) = P * Q * 4
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT219 calls GCASH

Calculate the following multiplication of unsigned 8-bit numbers: (Y X) = P * Q * 4
.GCASH JSR MULTU \ Call MULTU to calculate (A P) = P * Q
Name: GC2 Type: Subroutine Category: Maths (Arithmetic) Summary: Calculate (Y X) = (A P) * 4
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT151 calls GC2 * TT210 calls entry point price_xy

Calculate the following multiplication of unsigned 16-bit numbers: (Y X) = (A P) * 4 Other entry points: price_xy Set (Y X) = (A P)
.GC2 ASL P \ Set (A P) = (A P) * 4 ROL A ASL P ROL A .price_xy TAY \ Set (Y X) = (A P) LDX P RTS \ Return from the subroutine
Name: update_pod Type: Subroutine Category: Dashboard Summary: Ensure the correct palette is shown for the dashboard/hyperspace tunnel, by sending a write_pod command to the I/O processor
Context: See this subroutine on its own page References: This subroutine is called as follows: * DFAULT calls update_pod * EQSHP calls update_pod * ESCAPE calls update_pod * LL164 calls update_pod * n_buyship calls update_pod * status_equip calls update_pod
.update_pod LDA #&8F \ Send command &8F to the I/O processor: JSR tube_write \ \ write_pod(escp, hfx) \ \ which will update the values of ESCP and HFX in the \ I/O processor, so the palette gets set correctly for \ the dashboard (ESCP) and hyperspace tunnel (HFX) LDA ESCP \ Send the first parameter to the I/O processor: JSR tube_write \ \ * escp = ESCP LDA HFX \ Send the second parameter to the I/O processor: JMP tube_write \ \ * hfx = HFX \ \ and return from the subroutine using a tail call
Name: EQSHP Type: Subroutine Category: Equipment Summary: Show the Equip Ship screen (red key f3) or Buy Ship screen (CTRL-f3)
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls EQSHP * eq calls entry point err

Other entry points: err Beep, pause and go to the docking bay (i.e. show the Status Mode screen) pres Given 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) pres+3 Show the error to say that an item is already present, and process a refund, but do not free up a space in the hold
Name: dn Type: Subroutine Category: Text Summary: Print the amount of cash and beep
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls dn * TT219 calls dn

Print the amount of money in the cash pot, then make a short, high beep and delay for 1 second.
.dn JSR TT162 \ Print a space LDA #119 \ Print recursive token 119 ("CASH:{cash} CR{crlf}") JSR spc \ followed by a space \ Fall through into dn2 to make a beep and delay for \ 1 second before returning from the subroutine
Name: dn2 Type: Subroutine Category: Text Summary: Make a short, high beep and delay for 1 second
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls dn2 * NWDAV4 calls dn2 * TT210 calls dn2 * TT219 calls dn2 * encyclopedia calls dn2 * n_buyship calls dn2
.dn2 JSR BEEP \ Call the BEEP subroutine to make a short, high beep LDY #50 \ Delay for 50 vertical syncs (50/50 = 1 second) and JMP DELAY \ return from the subroutine using a tail call
Name: eq Type: Subroutine Category: Equipment Summary: Subtract the price of equipment from the cash pot
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls eq * EQSHP calls entry point query_beep

If we have enough cash, subtract the price of a specified piece of equipment from our cash pot and return from the subroutine. If we don't have enough cash, exit to the docking bay (i.e. show the Status Mode screen). Arguments: A The item number of the piece of equipment (0-11) as shown in the table at PRXS Other entry points: query_beep Print the recursive token given in A followed by a question mark, then make a beep, pause and go to the docking bay (i.e. show the Status Mode screen)
.eq JSR prx \ Call prx to set (Y X) to the price of equipment item \ number A JSR LCASH \ Subtract (Y X) cash from the cash pot, but only if \ we have enough cash BCS c \ If the C flag is set then we did have enough cash for \ the transaction, so jump to c to return from the \ subroutine (as c contains an RTS) LDA #197 \ Otherwise we don't have enough cash to buy this piece \ of equipment, so set A to the value for recursive \ token 37 ("CASH") .query_beep JSR prq \ Print the recursive token in A followed by a question \ mark JMP err \ Jump to err to beep, pause and go to the docking bay \ (i.e. show the Status Mode screen)
Name: prx Type: Subroutine Category: Equipment Summary: Return the price of a piece of equipment
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls prx * eq calls prx * EQSHP calls entry point prx-3 * status_equip calls entry point prx-3 * eq calls entry point c

This routine returns the price of equipment as listed in the table at PRXS. Arguments: A The item number of the piece of equipment (0-13) as shown in the table at PRXS Returns: (Y X) The item price in Cr * 10 (Y = high byte, X = low byte) (A X) Contains the same as (Y X) Other entry points: prx-3 Return the price of the item with number A - 1 c Contains an RTS
SEC \ Decrement A (for when this routine is called via SBC #1 \ prx-3) .prx ASL A \ Set A = A * 2, so it can act as an index into the \ PRXS table, which has two bytes per entry BEQ n_fcost \ If A = 0, skip the following, as we are fetching the \ price of fuel, and fuel is always the same price, \ regardless of ship type ADC new_costs \ In Elite-A the PRXS table has multiple sections, for \ the different types of ship we can buy, and the offset \ to the price table for our current ship is held in \ new_costs, so this points the index in A to the \ correct section of the PRXS table for our current ship .n_fcost TAY \ Copy A into Y, so it can be used as an index LDX PRXS,Y \ Fetch the low byte of the price into X LDA PRXS+1,Y \ Fetch the high byte of the price into A and transfer TAY \ it to X, so the price is now in (Y X) .c RTS \ Return from the subroutine
Name: qv Type: Subroutine Category: Equipment Summary: Print a menu of the four space views, for buying lasers
Context: See this subroutine on its own page References: This subroutine is called as follows: * EQSHP calls qv

Print a menu in the bottom-middle of the screen, at row 16, column 12, that lists the four available space views, like this: 0 Front 1 Rear 2 Left 3 Right Also print a "View ?" prompt and ask for a view number. The menu is shown when we choose to buy a new laser in the Equip Ship screen. Returns: X The chosen view number (0-3)
.qv LDA tek \ If the current system's tech level is less than 8, CMP #8 \ skip the next two instructions, otherwise we clear the BCC P%+7 \ screen to prevent the view menu from clashing with the \ longer equipment menu available in higher tech systems LDA #32 \ Clear the top part of the screen, draw a white border, JSR TT66 \ and set the current view type in QQ11 to 32 (Equip \ Ship screen) LDY #16 \ Move the text cursor to row 16, and at the same time STY YC \ set YC to a counter going from 16 to 19 in the loop \ below .qv1 LDX #12 \ Move the text cursor to column 12 STX XC LDA YC \ Fetch the counter value from YC into A CLC \ Print ASCII character "0" - 16 + A, so as A goes from ADC #'0'-16 \ 16 to 19, this prints "0" through "3" followed by a JSR spc \ space LDA YC \ Print recursive text token 80 + YC, so as YC goes from CLC \ 16 to 19, this prints "FRONT", "REAR", "LEFT" and ADC #80 \ "RIGHT" JSR TT27 INC YC \ Move the text cursor down a row, and increment the \ counter in YC at the same time LDA new_mounts \ Set A = new_mounts + 16, so A now contains a value of ORA #16 \ 17, 18 or 20, depending on the number of laser mounts \ that our current ship supports (in other words, it's \ one more than the corresponding value in the YC \ counter, which is going from 16 to 19, not 17 to 20) CMP YC \ If the loop counter in YC hasn't yet reached the BNE qv1 \ value in A, then loop back up to qv1 to print the next \ view in the menu, so this loops us back until we have \ printed all of the laser mounts defined by the value \ of new_mounts JSR CLYNS \ Clear the bottom three text rows of the upper screen, \ and move the text cursor to column 1 on row 21, i.e. \ the start of the top row of the three bottom rows .qv2 LDA #175 \ Print recursive text token 15 ("VIEW ") followed by JSR prq \ a question mark JSR TT217 \ Scan the keyboard until a key is pressed, and return \ the key's ASCII code in A (and X) SEC \ Subtract ASCII "0" from the key pressed, to leave the SBC #'0' \ numeric value of the key in A (if it was a number key) CMP new_mounts \ If A < new_mounts, then our current ship supports this BCC qv3 \ view number, so jump down to qv3 as we are done JSR CLYNS \ Otherwise we didn't get a valid view number, so clear \ the bottom three text rows of the upper screen, and \ move the text cursor to column 1 on row 21 JMP qv2 \ Jump back to qv2 to try again .qv3 TAX \ We have a valid view number, so transfer it to X RTS \ Return from the subroutine
Name: hm Type: Subroutine Category: Charts Summary: Select the closest system and redraw the chart crosshairs
Context: See this subroutine on its own page References: This subroutine is called as follows: * TT102 calls hm * hyp calls hm

Set the system closest to galactic coordinates (QQ9, QQ10) as the selected system, redraw the crosshairs on the chart accordingly (if they are being shown), and, if this is not a space view, clear the bottom three text rows of the screen.
.hm JSR TT103 \ Draw small crosshairs at coordinates (QQ9, QQ10), \ which will erase the crosshairs currently there JSR TT111 \ Select the system closest to galactic coordinates \ (QQ9, QQ10) JSR TT103 \ Draw small crosshairs at coordinates (QQ9, QQ10), \ which will draw the crosshairs at our current home \ system JMP CLYNS \ Clear the bottom three text rows of the upper screen, \ and move the text cursor to column 1 on row 21, i.e. \ the start of the top row of the three bottom rows \ Return from the subroutine using a tail call
Save ELTD.bin
PRINT "ELITE D" PRINT "Assembled at ", ~CODE_D% PRINT "Ends at ", ~P% PRINT "Code size is ", ~(P% - CODE_D%) PRINT "Execute at ", ~LOAD% PRINT "Reload at ", ~LOAD_D% PRINT "S.2.ELTD ", ~CODE_D%, " ", ~P%, " ", ~LOAD%, " ", ~LOAD_D% SAVE "3-assembled-output/2.ELTD.bin", CODE_D%, P%, LOAD%