Skip to navigation


Start and end: DEATH

[Commodore 64 version]

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 9 of 16) calls DEATH * 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 border box, ; and set the current view type in QQ11 to 6 (death ; screen) JSR BOX ; Call BOX to redraw the same border box (BOX is part ; of TT66), which removes the border as it is drawn ; using EOR logic LDA #0 ; The BOX routine sets these addresses in the screen STA SCBASE+$1F1F ; bitmap to $FF and 1 respectively, but it doesn't use STA SCBASE+$118 ; EOR logic to do this, so we need to manually set them ; to 0 to remove the corresponding pixels from the ; screen, as the call we just made to BOX won't do this 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 JSR DOYC JSR DOXC ;LDA #YELLOW ; These instructions are commented out in the original ;JSR DOCOL ; source 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) TXA ; Set A to the random number in X and keep bits 0-3 and AND #%10001111 ; the sign in bit 7 to get a number between -15 and +15, STA INWK+29 ; and store in byte #29 (roll counter) to give our ship ; a gentle roll with damping LDY #64 ; Set the laser count to 64 to act as a counter in the STY LASCT ; D2 loop below, so this setting determines how long the ; death animation lasts (it's 64 * 2 iterations of the ; main flight loop) SEC ; Set the C flag ROR A ; This sets A to a number between 0 and +7, which we AND #%10000111 ; store in byte #30 (the pitch counter) to give our ship STA INWK+30 ; a very gentle downwards pitch with damping LDX #OIL ; Set X to #OIL, the ship type for a cargo canister LDA XX21-1+2*PLT ; Fetch the byte from location XX21 - 1 + 2 * PLT, which ; equates to XX21 + 7 (the high byte of the address of ; SHIP_PLATE), which seems a bit odd. It might make more ; sense to do LDA (XX21-2+2*PLT) as this would fetch the ; first byte of the alloy plate's blueprint (which ; determines what happens when alloys are destroyed), ; but there aren't any brackets, so instead this always ; returns $D0, which is never zero, so the following ; BEQ is never true. (If the brackets were there, then ; we could stop plates from spawning on death by setting ; byte #0 of the blueprint to 0... but then scooping ; plates wouldn't give us alloys, so who knows what this ; is all about?) BEQ D3 ; If A = 0, jump to D3 to skip the following instruction 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 JSR M% ; Call the M% routine to do the main flight loop once, ; which will display our exploding canister scene and ; move everything about, as well as decrementing the ; value in LASCT JSR NOSPRITES ; Call NOSPRITES to disable all sprites and remove them ; from the screen .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, as well as decrementing the ; value in LASCT DEC LASCT ; Decrement the counter in LASCT, which we set above, ; so for each loop around D2, we decrement LASCT by 5 ; (the main loop decrements it by 4, and this one makes ; it 5) BNE D2 ; Loop back to call the main flight loop again, until we ; have called it 127 times 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