Skip to navigation

Elite on the BBC Micro and NES

Drawing lines: TT15

[NES version, Bank 0]

Name: TT15 [Show more] Type: Subroutine Category: Drawing lines Summary: Draw a set of crosshairs
Context: See this subroutine in context in the source code References: This subroutine is called as follows: * 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, CPX #$9C ; which is view type $9C, then jump to TT178 to skip the BNE TT178 ; 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 .TT178 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 STA XX15+3 ; Set XX15+3 (Y2) = crosshairs y-coordinate + indent JSR LOIN ; Draw a line from (X1, Y1) to (X2, Y2), where Y1 = Y2, ; 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 type CPX #$9C ; If this is the Short-range Chart then the y-coordinate BEQ TT87 ; 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 LOIN ; 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