\ We start by calculating the following: \ \ xCoord2 = xSegmentCoordI \ + xTrackSegmentO * carRacingLine * 4 \ \ for the x-axis and z-axis only LDY vectorNumber \ Set Y to the segment vector number that we stored \ above LDA xTrackSegmentO,Y \ Set VV to the 3D x-coordinate of the outer segment STA VV \ vector for the car object LDA zTrackSegmentO,Y \ Set VV+2 to the 3D x-coordinate of the outer segment STA VV+2 \ vector for the car object \ Note that VV+1 still contains the y-coordinate for the \ inner segment vector, which we can reuse as the height \ of the track from side-to-side is always the same, \ i.e. yTrackSegmentI = yTrackSegmentO for the same \ vector which means the track is always level along the \ y-axis LDX #0 \ We are about to work our way through the three axes, \ so set X = 0 to use as an axis counter, working \ through the three axes x, y, z using X = 0, 1, 2 \ \ The comments below are for the x-axis LDA UU \ Set U = UU STA U \ = the car's current racing line .bcar5 LDA #0 \ Set (V A) = 0 STA V LDA VV,X \ Set A to the x-coordinate of the outer segment vector \ We now calculate (V A T) = A * U, making sure we get \ the signs right BPL bcar6 \ If A is positive, jump to bcar6 to multiply A and U as \ they are \ If we get here then A is negative, so we need to apply \ the correct sign to the multiplication EOR #&FF \ Negate A (so it is now positive) CLC ADC #1 JSR Multiply8x8 \ Set (A T) = A * U EOR #&FF \ Negate A again (so it is now the correct sign for the CLC \ multiplication) ADC #1 BCS bcar7 \ If the addition just overflowed, then the result is \ now positive, which means V is already the correct \ high byte for (V A T), so jump to bcar7 DEC V \ Otherwise, decrement V to &FF so it's the correct \ high byte for (V A T) BCC bcar7 \ Jump to bcar7 (this BCC is effectively a JMP as we \ just passed through a BCS) .bcar6 JSR Multiply8x8 \ Set (A T) = A * U .bcar7 \ By this point, we have the following, signed result: \ \ (V A T) = A * U \ = xTrackSegmentO * carRacingLine ASL A \ Set (V A) = (V A) * 4 ROL V \ = xTrackSegmentO * carRacingLine * 4 ASL A ROL V CLC \ Set (xCoord2Hi xCoord2Lo) = (xCoord2Hi xCoord2Lo) ADC xCoord2Lo,X \ + (V A) STA xCoord2Lo,X \ \ starting with the low bytes LDA xCoord2Hi,X \ And then the high bytes ADC V STA xCoord2Hi,X INX \ Set X = X + 2, so we skip the y-axis INX CPX #4 \ Loop back to bcar5 until we have processed the x-axis BNE bcar5 \ (for X = 0) and z-axis (for X = 2) \ Finally, we add 144 to the y-coordinate LDA yCoord2Lo \ Set (yCoord2Hi yCoord2Lo) += 144 CLC \ ADC #144 \ starting with the low bytes STA yCoord2Lo BCC bcar8 \ And then the high bytes INC yCoord2HiName: BuildCarObjects (Part 2 of 3) [Show more] Type: Subroutine Category: 3D objects Summary: Add the racing line to the 3D coordinate of the specified car Deep dive: Drawing a 3D car from 2D partsContext: See this subroutine in context in the source code References: No direct references to this subroutine in this source file
This part adds in the vector from the inside edge of the track to the car, i.e. the second part of the above: [ xCoord2 ] [ xCoord2 ] [ xTrackSegmentO ] [ yCoord2 ] = [ yCoord2 ] + [ 0 ] * carRacingLine * 4 [ zCoord2 ] [ zCoord2 ] [ zTrackSegmentO ] [ 0 ] + [ 144 ] [ 0 ]
[X]
Subroutine Multiply8x8 (category: Maths (Arithmetic))
Calculate (A T) = T * U
[X]
Label bcar5 is local to this routine
[X]
Label bcar6 is local to this routine
[X]
Label bcar7 is local to this routine
[X]
Label bcar8 in subroutine BuildCarObjects (Part 3 of 3)
[X]
Variable vectorNumber in workspace Zero page
The segment vector number when building car objects in the BuildCarObjects routine
[X]
Variable xCoord2Hi in workspace Main variable workspace
The high byte of the x-coordinate of the temporary coordinate variable (xCoord2, yCoord2, zCoord2)
[X]
Variable xCoord2Lo in workspace Main variable workspace
The low byte of the x-coordinate of the temporary coordinate variable (xCoord2, yCoord2, zCoord2)
[X]
Variable xTrackSegmentO in workspace trackData
Vector x-coordinates from the inside to the outside of the track for each segment
[X]
Variable yCoord2Hi in workspace Main variable workspace
The high byte of the y-coordinate of the temporary coordinate variable (xCoord2, yCoord2, zCoord2)
[X]
Variable yCoord2Lo in workspace Main variable workspace
The low byte of the y-coordinate of the temporary coordinate variable (xCoord2, yCoord2, zCoord2)
[X]
Variable zTrackSegmentO in workspace trackData
Vector z-coordinates from the inside to the outside of the track for each segment