Skip to navigation


Drawing lines: TT15

[BBC Master version]

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 Variations: See code variations for this subroutine in the different versions 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 #GCYT \ Set A to GCYT, 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 TT178 \ which is the only view with bit 7 set, then jump to \ TT178 to 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 .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 BIT QQ11 \ If bit 7 of QQ11 is set, then this this is the BMI TT84 \ Short-range Chart, so jump to TT84 BCC botchfix13 \ If the above subtraction underflowed, then A is \ positive, so skip the next two instructions CMP #2 \ If A >= 2, skip the next instruction BCS TT84 .botchfix13 LDA #2 \ The subtraction underflowed or A < 2, so set A to 2 \ 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 \BIT QQ11 \ These instructions are commented out in the original \BMI TT85 \ source BCS botchfix12 \ If the above addition overflowed, skip the following \ two instructions to set A = 254 CMP #254 \ The addition didn't overflow, so if A < 254, jump to BCC TT85 \ TT85 .botchfix12 LDA #254 \ Set A = 254, so the crosshairs don't spill out of the \ right of the screen .TT85 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 JSR HLOIN3 \ Call HLOIN3 to draw a line from (X1, Y1) to (X2, Y1) 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 #GCYB \ If A < GCYB 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 BMI TT87 \ If this is the Short-range Chart then the y-coordinate \ is fine, so skip to TT87 LDA #GCYB \ Otherwise this is the Long-range Chart, so we need to \ clip the crosshairs at a maximum y-coordinate of GCYB .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 from (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, \ and returning from the subroutine using a tail call