Skip to navigation

Elite on the BBC Micro and NES

Moving: MVT6, Removed

[Elite-A, Docked]

Name: MVT6, Removed [Show more] Type: Subroutine Category: Moving Summary: Calculate (A P+2 P+1) = (x_sign x_hi x_lo) + (A P+2 P+1)
Context: See this subroutine in context in the source code References: No direct references to this subroutine in this source file

Do the following calculation, for the coordinate given by X (so this is what it does for the x-coordinate): (A P+2 P+1) = (x_sign x_hi x_lo) + (A P+2 P+1) A is a sign bit and is not included in the calculation, but bits 0-6 of A are preserved. Bit 7 is set to the sign of the result.
Arguments: A The sign of P(2 1) in bit 7 P(2 1) The 16-bit value we want to add the coordinate to X The coordinate to add, as follows: * If X = 0, add to (x_sign x_hi x_lo) * If X = 3, add to (y_sign y_hi y_lo) * If X = 6, add to (z_sign z_hi z_lo)
Returns: A The sign of the result (in bit 7)
\ --- Mod: Code removed for Elite-A: ------------------> \.MVT6 \ \ TAY \ Store argument A into Y, for later use \ \ EOR INWK+2,X \ Set A = A EOR x_sign \ \ BMI MV50 \ If the sign is negative, i.e. A and x_sign have \ \ different signs, jump to MV50 \ \ \ The signs are the same, so we can add the two \ \ arguments and keep the sign to get the result \ \ LDA P+1 \ First we add the low bytes: \ CLC \ \ ADC INWK,X \ P+1 = P+1 + x_lo \ STA P+1 \ \ LDA P+2 \ And then the high bytes: \ ADC INWK+1,X \ \ STA P+2 \ P+2 = P+2 + x_hi \ \ TYA \ Restore the original A argument that we stored earlier \ \ so that we keep the original sign \ \ RTS \ Return from the subroutine \ \.MV50 \ \ LDA INWK,X \ First we subtract the low bytes: \ SEC \ \ SBC P+1 \ P+1 = x_lo - P+1 \ STA P+1 \ \ LDA INWK+1,X \ And then the high bytes: \ SBC P+2 \ \ STA P+2 \ P+2 = x_hi - P+2 \ \ BCC MV51 \ If the last subtraction underflowed, then the C flag \ \ will be clear and x_hi < P+2, so jump to MV51 to \ \ negate the result \ \ TYA \ Restore the original A argument that we stored earlier \ EOR #%10000000 \ but flip bit 7, which flips the sign. We do this \ \ because x_hi >= P+2 so we want the result to have the \ \ same sign as x_hi (as it's the dominant side in this \ \ calculation). The sign of x_hi is x_sign, and x_sign \ \ has the opposite sign to A, so we flip the sign in A \ \ to return the correct result \ \ RTS \ Return from the subroutine \ \.MV51 \ \ LDA #1 \ Our subtraction underflowed, so we negate the result \ SBC P+1 \ using two's complement, first with the low byte: \ STA P+1 \ \ \ P+1 = 1 - P+1 \ \ LDA #0 \ And then the high byte: \ SBC P+2 \ \ STA P+2 \ P+2 = 0 - P+2 \ \ TYA \ Restore the original A argument that we stored earlier \ \ as this is the correct sign for the result. This is \ \ because x_hi < P+2, so we want to return the same sign \ \ as P+2, the dominant side \ \ RTS \ Return from the subroutine \ --- End of removed code ----------------------------->