.ShowUpsideDownBar LDA zRotationHi \ If bit 7 of zRotationHi is clear, skip the following BPL upsi1 \ instruction EOR #%11000000 \ Flip bits 6 and 7 of A, making bit 7 clear and bit 6 \ flipped .upsi1 \ When we get here, we know bit 7 of A is clear AND #%11000000 \ Extract bits 6 and 7 of A BEQ upsi2 \ If bit 6 of A is clear (we already know bit 7 is \ clear), then the plane is the correct way up, so skip \ the following instruction \ We get here if one of the following is true: \ \ * Bit 7 of zRotationHi is clear and bit 6 is set \ * Bit 7 of zRotationHi is set and bit 6 is clear \ \ either of which means the plane is upside down LDA #%00001110 \ Bit 6 is set, so set A to a three-pixel horizontal \ line to show in the indicator .upsi2 STA row25_block13_1 \ Set the line at the bottom of the artificial horizon \ indicator to the pixel pattern in A (0 if the plane is \ the right way up, %00001110 if it is upside down) RTS \ Return from the subroutineName: ShowUpsideDownBar [Show more] Type: Subroutine Category: Dashboard Summary: Show or hide the upside down bar in the artificial horizon indicatorContext: See this subroutine in context in the source code References: This subroutine is called as follows: * ApplyFlightModel (Part 6 of 7) calls ShowUpsideDownBar
This routine shows the upside down bar in the artificial horizon if bit 6 and bit 7 of zRotationHi are different. This is how it works. The value of zRotationHi contains the following: * 0 to 63 (bit 6 clear, bit 7 clear) * 64 to 127 (bit 6 set, bit 7 clear) * 128 to 191 (bit 6 clear, bit 7 set) * 192 to 255 (bit 6 set, bit 7 set) The zRotation angle determines how the plane is rotated around the z-axis. The z-axis points into the screen, so rotating the plane around this axis is the same as rolling the plane. A zRotation of 0 is a horizontal plane, and as the angle increases, the plane rolls to the right. If we consider the plane doing a full 360-degree roll, then for the first quarter the plane is still upright, for the second and third quarters it is upside down, and then for the final quarter it is upright again. You will notice that bits 6 and 7 differ in the second and third quarters in the list above, so if bits 6 and 7 of zRotationHi are different, then the plane is upside down, and we should show a bar at the bottom of the artificial horizon indicator.
Configuration variable: row25_block13_1 = &77A9
Bottom middle block of artificial horizon
Label upsi1 is local to this routine
Label upsi2 is local to this routine