Skip to navigation


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 STA X1 ; Set 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 X2 ; Set X2 = A (the x-coordinate of the right edge of the ; crosshairs) LDA QQ19+1 ; Set Y1 = crosshairs y-coordinate + indent to get the CLC ; y-coordinate of the centre of the crosshairs ADC QQ19+5 STA Y1 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 Y1 = A + indent to get the y-coordinate of the top ADC QQ19+5 ; edge of the indented crosshairs STA Y1 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 Y2 ; Set Y2 = A (the y-coordinate of the bottom edge of the ; crosshairs) LDA QQ19 ; Set X1 = the x-coordinate of the centre of the STA X1 ; crosshairs STA X2 ; Set 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