Skip to navigation

Elite on the BBC Micro and NES

# Dashboard: DIALS (Part 3 of 4)

## [Acorn Electron version]

```       Name: DIALS (Part 3 of 4)                                     [Show more]
Type: Subroutine
Category: Dashboard
Summary: Update the dashboard: four energy banks
Deep dive: The dashboard indicators
Context: See this subroutine in context in the source code
Variations: See code variations for this subroutine in the different versions
References: No direct references to this subroutine in this source file

This and the next section only run once every four iterations of the main
loop, so while the speed, pitch and roll indicators update every iteration,
the other indicators update less often.

LDA MCNT               \ Fetch the main loop counter and calculate MCNT mod 4,
AND #3                 \ jumping to rT9 if it is non-zero. rT9 contains an RTS,
BNE rT9                \ so the following code only runs every 4 iterations of
\ the main loop, otherwise we return from the subroutine

LDY #0                 \ Set Y = 0, for use in various places below

LDX #3                 \ Set up a counter in X so we can zero the four bytes at
\ XX12, so we can then calculate each of the four energy
\ banks' values before drawing them later

.DLL23

STY XX12,X             \ Set the X-th byte of XX12 to 0

DEX                    \ Decrement the counter

BPL DLL23              \ Loop back for the next byte until the four bytes at
\ XX12 are all zeroed

LDX #3                 \ Set up a counter in X to loop through the 4 energy
\ bank indicators, so we can calculate each of the four
\ energy banks' values and store them in XX12

LDA ENERGY             \ Set A = Q = ENERGY / 2, so they are both now in the
LSR A                  \ range 0-127 (so that's a maximum of 32 in each of the
\ banks, and a maximum of 31 in the top bank)

STA Q                  \ Set Q to A, so we can use Q to hold the remaining
\ energy as we work our way through each bank, from the
\ full ones at the bottom to the empty ones at the top

.DLL24

SEC                    \ Set A = A - 32 to reduce the energy count by a full
SBC #32                \ bank

BCC DLL26              \ If the C flag is clear then A < 16, so this bank is
\ not full to the brim, and is therefore the last one
\ with any energy in it, so jump to DLL26

STA Q                  \ This bank is full, so update Q with the energy of the
\ remaining banks

LDA #32                \ Store this bank's level in XX12 as 32, as it is full,
STA XX12,X             \ with XX12+3 for the bottom bank and XX12+0 for the top

LDA Q                  \ Set A to the remaining energy level again

DEX                    \ Decrement X to point to the next bank, i.e. the one
\ above the bank we just processed

BPL DLL24              \ Loop back to DLL24 until we have either processed all
\ four banks, or jumped out early to DLL26 if the top
\ banks have no charge

BMI DLL9               \ Jump to DLL9 as we have processed all four banks (this
\ BMI is effectively a JMP as A will never be positive)

.DLL26

LDA Q                  \ If we get here then the bank we just checked is not
STA XX12,X             \ fully charged, so store its value in XX12 (using Q,
\ which contains the energy of the remaining banks -
\ i.e. this one)

\ Now that we have the four energy bank values in XX12,
\ we can draw them, starting with the top bank in XX12
\ and looping down to the bottom bank in XX12+3, using Y
\ as a loop counter, which was set to 0 above

.DLL9

LDA XX12,Y             \ Fetch the value of the Y-th indicator, starting from
\ the top

STY P                  \ Store the indicator number in P for retrieval later

JSR DIL                \ Draw the energy bank using a range of 0-15, and
\ increment SC to point to the next indicator (the
\ next energy bank down)

LDY P                  \ Restore the indicator number into Y

INY                    \ Increment the indicator number

CPY #4                 \ Check to see if we have drawn the last energy bank

BNE DLL9               \ Loop back to DLL9 if we have more banks to draw,
\ otherwise we are done
```