Skip to navigation

Elite on the BBC Micro

Start and end: DEATH [Elite-A, Parasite]

Name: DEATH [Show more] Type: Subroutine Category: Start and end Summary: Display the death screen
Context: See this subroutine in context in the source code References: This subroutine is called as follows: * Main flight loop (Part 15 of 16) calls DEATH * OOPS calls DEATH

We have been killed, so display the chaos of our destruction above a "GAME OVER" sign, and clean up the mess ready for the next attempt.
.DEATH JSR EXNO3 \ Make the sound of us dying JSR RES2 \ Reset a number of flight variables and workspaces ASL DELTA \ Divide our speed in DELTA by 4 ASL DELTA LDX #24 \ Set the screen to only show 24 text rows, which hides JSR DET1 \ the dashboard, setting A to 6 in the process JSR TT66 \ Clear the top part of the screen, draw a white border, \ and set the current view type in QQ11 to 6 (death \ screen) JSR BOX \ Call BOX to redraw the same white border (BOX is part \ of TT66), which removes the border as it is drawn \ using EOR logic JSR nWq \ Create a cloud of stardust containing the correct \ number of dust particles (i.e. NOSTM of them) LDA #12 \ Move the text cursor to column 12 on row 12 STA YC STA XC LDA #146 \ Print recursive token 146 ("{all caps}GAME OVER") JSR ex .D1 JSR Ze \ Call Ze to initialise INWK to a potentially hostile \ ship, and set A and X to random values LSR A \ Set A = A / 4, so A is now between 0 and 63, and LSR A \ store in byte #0 (x_lo) STA INWK LDY #0 \ Set the following to 0: the current view in QQ11 STY QQ11 \ (space view), x_hi, y_hi, z_hi and the AI flag (no AI STY INWK+1 \ or E.C.M. and not hostile) STY INWK+4 STY INWK+7 STY INWK+32 DEY \ Set Y = 255 STY MCNT \ Reset the main loop counter to 255, so all timer-based \ calls will be stopped EOR #%00101010 \ Flip bits 1, 3 and 5 in A (x_lo) to get another number STA INWK+3 \ between 48 and 63, and store in byte #3 (y_lo) ORA #%01010000 \ Set bits 4 and 6 of A to bump it up to between 112 and STA INWK+6 \ 127, and store in byte #6 (z_lo) TYA \ Tell the I/O processor to set its copy of LASCT to JSR write_0346 \ 255, to act as a counter in the D2 loop below, so this \ setting determines how long the death animation lasts \ (it's 5.1 seconds, as LASCT is decremented every \ vertical sync, or 50 times a second, and \ 255 / 50 = 5.1) TXA \ Set A to the random number in X and keep bits 0-3 and AND #%10001111 \ the bit 7 to get a number between -15 and +15, and STA INWK+29 \ store in byte #29 (roll counter) to give our ship a \ gentle roll with damping ROR A \ The C flag is randomly set from the above call to Ze, AND #%10000111 \ so this sets A to a number between -7 and +7, which STA INWK+30 \ we store in byte #30 (the pitch counter) to give our \ ship a very gentle pitch with damping LDX #OIL \ Set X to #OIL, the ship type for a cargo canister BCC D3 \ If the C flag is clear, which will be random following \ the above call to Ze, jump to D3 to skip the following \ instruction DEX \ Decrement X, which sets it to #PLT, the ship type for \ an alloy plate .D3 JSR fq1 \ Call fq1 with X set to #OIL or #PLT, which adds a new \ cargo canister or alloy plate to our local bubble of \ universe and points it away from us with double DELTA \ speed (i.e. 6, as DELTA was set to 3 by the call to \ RES2 above). INF is set to point to the new arrival's \ ship data block in K% JSR DORND \ Set A and X to random numbers and extract bit 7 from A AND #%10000000 LDY #31 \ Store this in byte #31 of the ship's data block, so it STA (INF),Y \ has a 50% chance of marking our new arrival as being \ killed (so it will explode) LDA FRIN+4 \ The call we made to RES2 before we entered the loop at BEQ D1 \ D1 will have reset all the ship slots at FRIN, so this \ checks to see if the fifth slot is empty, and if it \ is we loop back to D1 to add another canister, until \ we have added five of them JSR U% \ Clear the key logger, which also sets A = 0 STA DELTA \ Set our speed in DELTA to 0, as we aren't going \ anywhere any more .D2 JSR M% \ Call the M% routine to do the main flight loop once, \ which will display our exploding canister scene and \ move everything about JSR read_0346 \ Get the value of the I/O processor's copy of LASCT BNE D2 \ Loop back to D2 to run the main flight loop until \ LASCT reaches zero (which will take 5.1 seconds, as \ explained above) LDX #31 \ Set the screen to show all 31 text rows, which shows JSR DET1 \ the dashboard JMP DEATH2 \ Jump to DEATH2 to reset and restart the game