![]() |
Routines |
| Prev: 8684 | Up: Map | Next: 8944 |
|
The routine at 8684 continues here.
The first thing to do is check whether there are any remaining lives to draw at the bottom of the screen.
|
||||
| 870E | LD A,($8457) | Pick up the number of lives remaining from 8457 | ||
| 8711 | LD HL,$50A0 | Set HL to the display file address at which to draw the first Willy sprite | ||
| 8714 | OR A | Are there any lives remaining? | ||
| 8715 | JR Z,$8730 | Jump if not | ||
| 8717 | LD B,A | Initialise B to the number of lives remaining | ||
|
The following loop draws the remaining lives at the bottom of the screen.
|
||||
| 8718 | LD C,$00 | C=0; this tells the sprite-drawing routine at 8FF4 to overwrite any existing graphics | ||
| 871A | PUSH HL | Save HL and BC briefly | ||
| 871B | PUSH BC | |||
| 871C | LD A,($845B) | Pick up the in-game music note index from 845B; this will determine the animation frame for the Willy sprites | ||
| 871F | RLCA | Now A=0x00 (frame 0), 0x20 (frame 1), 0x40 (frame 2) or 0x60 (frame 3) | ||
| 8720 | RLCA | |||
| 8721 | RLCA | |||
| 8722 | AND $60 | |||
| 8724 | LD E,A | Point DE at the corresponding Willy sprite (at 8200+A) | ||
| 8725 | LD D,$82 | |||
| 8727 | CALL $8FF4 | Draw the Willy sprite on the screen | ||
| 872A | POP BC | Restore HL and BC | ||
| 872B | POP HL | |||
| 872C | INC HL | Move HL along to the location at which to draw the next Willy sprite | ||
| 872D | INC HL | |||
| 872E | DJNZ $8718 | Jump back to draw any remaining sprites | ||
|
Now draw a boot if cheat mode has been activated.
|
||||
| 8730 | LD A,($845D) | Pick up the 6031769 key counter from 845D | ||
| 8733 | CP $07 | Has 6031769 been keyed in yet? | ||
| 8735 | JR NZ,$873F | Jump if not | ||
| 8737 | LD DE,$BAE0 | Point DE at the graphic data for the boot (at BAE0) | ||
| 873A | LD C,$00 | C=0 (overwrite mode) | ||
| 873C | CALL $8FF4 | Draw the boot at the bottom of the screen next to the remaining lives | ||
|
Next, prepare the screen and attribute buffers for drawing to the screen.
|
||||
| 873F | LD HL,$5E00 | Copy the contents of the attribute buffer at 5E00 (the attributes for the empty cavern) into the attribute buffer at 5C00 | ||
| 8742 | LD DE,$5C00 | |||
| 8745 | LD BC,$0200 | |||
| 8748 | LDIR | |||
| 874A | LD HL,$7000 | Copy the contents of the screen buffer at 7000 (the tiles for the empty cavern) into the screen buffer at 6000 | ||
| 874D | LD DE,$6000 | |||
| 8750 | LD BC,$1000 | |||
| 8753 | LDIR | |||
| 8755 | CALL $8D0F | Move the horizontal guardians in the current cavern | ||
| 8758 | LD A,($845A) | Pick up the game mode indicator from 845A | ||
| 875B | OR A | Are we in demo mode? | ||
| 875C | CALL Z,$8ABB | If not, move Willy | ||
| 875F | LD A,($845A) | Pick up the game mode indicator from 845A | ||
| 8762 | OR A | Are we in demo mode? | ||
| 8763 | CALL Z,$923A | If not, check and set the attribute bytes for Willy's sprite in the buffer at 5C00, and draw Willy to the screen buffer at 6000 | ||
| 8766 | CALL $8DAA | Draw the horizontal guardians in the current cavern | ||
| 8769 | CALL $9105 | Move the conveyor in the current cavern | ||
| 876C | CALL $8F63 | Draw the items in the current cavern and collect any that Willy is touching | ||
| 876F | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 8772 | CP $04 | Are we in Eugene's Lair? | ||
| 8774 | CALL Z,$8DF8 | If so, move and draw Eugene | ||
| 8777 | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 877A | CP $0D | Are we in Skylab Landing Bay? | ||
| 877C | JP Z,$8E75 | If so, move and draw the Skylabs | ||
| 877F | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 8782 | CP $08 | Are we in Wacky Amoebatrons or beyond? | ||
| 8784 | CALL NC,$8EF1 | If so, move and draw the vertical guardians | ||
| 8787 | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 878A | CP $07 | Are we in Miner Willy meets the Kong Beast? | ||
| 878C | CALL Z,$9135 | If so, move and draw the Kong Beast | ||
| 878F | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 8792 | CP $0B | Are we in Return of the Alien Kong Beast? | ||
| 8794 | CALL Z,$9135 | If so, move and draw the Kong Beast | ||
| 8797 | LD A,($8407) | Pick up the number of the current cavern from 8407 | ||
| 879A | CP $12 | Are we in Solar Power Generator? | ||
| 879C | CALL Z,$8D73 | If so, move and draw the light beam | ||
|
This entry point is used by the routine at 8E75.
|
||||
| 879F | CALL $8FC5 | Draw the portal, or move to the next cavern if Willy has entered it | ||
|
This entry point is used by the routine at 8D05.
|
||||
| 87A2 | LD HL,$6000 | Copy the contents of the screen buffer at 6000 to the display file | ||
| 87A5 | LD DE,$4000 | |||
| 87A8 | LD BC,$1000 | |||
| 87AB | LDIR | |||
| 87AD | LD A,($8458) | Pick up the screen flash counter from 8458 | ||
| 87B0 | OR A | Is it zero? | ||
| 87B1 | JR Z,$87C8 | Jump if so | ||
| 87B3 | DEC A | Decrement the screen flash counter at 8458 | ||
| 87B4 | LD ($8458),A | |||
| 87B7 | RLCA | Move bits 0-2 into bits 3-5 and clear all the other bits | ||
| 87B8 | RLCA | |||
| 87B9 | RLCA | |||
| 87BA | AND $38 | |||
| 87BC | LD HL,$5C00 | Set every attribute byte in the buffer at 5C00 to this value | ||
| 87BF | LD DE,$5C01 | |||
| 87C2 | LD BC,$01FF | |||
| 87C5 | LD (HL),A | |||
| 87C6 | LDIR | |||
| 87C8 | LD HL,$5C00 | Copy the contents of the attribute buffer at 5C00 to the attribute file | ||
| 87CB | LD DE,$5800 | |||
| 87CE | LD BC,$0200 | |||
| 87D1 | LDIR | |||
| 87D3 | LD IX,$8429 | Print the score (see 8429) at (19,26) | ||
| 87D7 | LD DE,$507A | |||
| 87DA | LD C,$06 | |||
| 87DC | CALL $92BA | |||
| 87DF | LD IX,$841F | Print the high score (see 841F) at (19,11) | ||
| 87E3 | LD DE,$506B | |||
| 87E6 | LD C,$06 | |||
| 87E8 | CALL $92BA | |||
| 87EB | CALL $8A3C | Decrease the air remaining in the current cavern | ||
| 87EE | JP Z,$88FF | Jump if there's no air left | ||
|
Now check whether SHIFT and SPACE are being pressed.
|
||||
| 87F1 | LD BC,$FEFE | Read keys SHIFT-Z-X-C-V | ||
| 87F4 | IN A,(C) | |||
| 87F6 | LD E,A | Save the result in E | ||
| 87F7 | LD B,$7F | Read keys B-N-M-SS-SPACE | ||
| 87F9 | IN A,(C) | |||
| 87FB | OR E | Combine the results | ||
| 87FC | AND $01 | Are SHIFT and SPACE being pressed? | ||
| 87FE | JP Z,$85CC | If so, quit the game | ||
|
Now read the keys A, S, D, F and G (which pause the game).
|
||||
| 8801 | LD B,$FD | Read keys A-S-D-F-G | ||
| 8803 | IN A,(C) | |||
| 8805 | AND $1F | Are any of these keys being pressed? | ||
| 8807 | CP $1F | |||
| 8809 | JR Z,$8815 | Jump if not | ||
| 880B | LD B,$02 | Read every half-row of keys except A-S-D-F-G | ||
| 880D | IN A,(C) | |||
| 880F | AND $1F | Are any of these keys being pressed? | ||
| 8811 | CP $1F | |||
| 8813 | JR Z,$880B | Jump back if not (the game is still paused) | ||
|
Here we check whether Willy has had a fatal accident.
|
||||
| 8815 | LD A,($806B) | Pick up the airborne status indicator from 806B | ||
| 8818 | CP $FF | Has Willy landed after falling from too great a height, or collided with a nasty or a guardian? | ||
| 881A | JP Z,$88FF | Jump if so | ||
|
Now read the keys H, J, K, L and ENTER (which toggle the in-game music).
|
||||
| 881D | LD B,$BF | Prepare B for reading keys H-J-K-L-ENTER | ||
| 881F | LD HL,$845C | Point HL at the music flags at 845C | ||
| 8822 | IN A,(C) | Read keys H-J-K-L-ENTER | ||
| 8824 | AND $1F | Are any of these keys being pressed? | ||
| 8826 | CP $1F | |||
| 8828 | JR Z,$8834 | Jump if not | ||
| 882A | BIT 0,(HL) | Were any of these keys being pressed the last time we checked? | ||
| 882C | JR NZ,$8836 | Jump if so | ||
| 882E | LD A,(HL) | Set bit 0 (the keypress flag) and flip bit 1 (the in-game music flag) at 845C | ||
| 882F | XOR $03 | |||
| 8831 | LD (HL),A | |||
| 8832 | JR $8836 | |||
| 8834 | RES 0,(HL) | Reset bit 0 (the keypress flag) at 845C | ||
| 8836 | BIT 1,(HL) | Has the in-game music been switched off? | ||
| 8838 | JR NZ,$885F | Jump if so | ||
|
The next section of code plays a note of the in-game music.
|
||||
| 883A | LD A,($845B) | Increment the in-game music note index at 845B | ||
| 883D | INC A | |||
| 883E | LD ($845B),A | |||
| 8841 | AND $7E | Point HL at the appropriate entry in the tune data table at 858C | ||
| 8843 | RRCA | |||
| 8844 | LD E,A | |||
| 8845 | LD D,$00 | |||
| 8847 | LD HL,$858C | |||
| 884A | ADD HL,DE | |||
| 884B | LD A,($8073) | Pick up the border colour for the current cavern from 8073 | ||
| 884E | LD E,(HL) | Initialise the pitch delay counter in E | ||
| 884F | LD BC,$0003 | Initialise the duration delay counters in B (0) and C (3) | ||
| 8852 | OUT ($FE),A | Produce a note of the in-game music | ||
| 8854 | DEC E | |||
| 8855 | JR NZ,$885A | |||
| 8857 | LD E,(HL) | |||
| 8858 | XOR $18 | |||
| 885A | DJNZ $8852 | |||
| 885C | DEC C | |||
| 885D | JR NZ,$8852 | |||
|
If we're in demo mode, check the keyboard and joystick and return to the title screen if there's any input.
|
||||
| 885F | LD A,($845A) | Pick up the game mode indicator from 845A | ||
| 8862 | OR A | Are we in demo mode? | ||
| 8863 | JR Z,$8884 | Jump if not | ||
| 8865 | DEC A | We're in demo mode; is it time to show the next cavern? | ||
| 8866 | JP Z,$88FF | Jump if so | ||
| 8869 | LD ($845A),A | Update the game mode indicator at 845A | ||
| 886C | LD BC,$00FE | Read every row of keys on the keyboard | ||
| 886F | IN A,(C) | |||
| 8871 | AND $1F | Are any keys being pressed? | ||
| 8873 | CP $1F | |||
| 8875 | JP NZ,$85CC | If so, return to the title screen | ||
| 8878 | LD A,($8459) | Pick up the Kempston joystick indicator from 8459 | ||
| 887B | OR A | Is there a joystick connected? | ||
| 887C | JR Z,$8884 | Jump if not | ||
| 887E | IN A,($1F) | Collect input from the joystick | ||
| 8880 | OR A | Is the joystick being moved or the fire button being pressed? | ||
| 8881 | JP NZ,$85CC | If so, return to the title screen | ||
|
Here we check the teleport keys.
|
||||
| 8884 | LD BC,$EFFE | Read keys 6-7-8-9-0 | ||
| 8887 | IN A,(C) | |||
| 8889 | BIT 4,A | Is '6' (the activator key) being pressed? | ||
| 888B | JP NZ,$88A8 | Jump if not | ||
| 888E | LD A,($845D) | Pick up the 6031769 key counter from 845D | ||
| 8891 | CP $07 | Has 6031769 been keyed in yet? | ||
| 8893 | JP NZ,$88A8 | Jump if not | ||
| 8896 | LD B,$F7 | Read keys 1-2-3-4-5 | ||
| 8898 | IN A,(C) | |||
| 889A | CPL | Keep only bits 0-4 and flip them | ||
| 889B | AND $1F | |||
| 889D | CP $14 | Is the result 0x14 or greater? | ||
| 889F | JP NC,$88A8 | Jump if so (this is not a cavern number) | ||
| 88A2 | LD ($8407),A | Store the cavern number at 8407 | ||
| 88A5 | JP $8691 | Teleport into the cavern | ||
|
Now check the 6031769 keys.
|
||||
| 88A8 | LD A,($845D) | Pick up the 6031769 key counter from 845D | ||
| 88AB | CP $07 | Has 6031769 been keyed in yet? | ||
| 88AD | JP Z,$870E | If so, jump back to the start of the main loop | ||
| 88B0 | RLCA | Point IX at the corresponding entry in the 6031769 table at 8460 | ||
| 88B1 | LD E,A | |||
| 88B2 | LD D,$00 | |||
| 88B4 | LD IX,$8460 | |||
| 88B8 | ADD IX,DE | |||
| 88BA | LD BC,$F7FE | Read keys 1-2-3-4-5 | ||
| 88BD | IN A,(C) | |||
| 88BF | AND $1F | Keep only bits 0-4 | ||
| 88C1 | CP (IX+$00) | Does this match the first byte of the entry in the 6031769 table? | ||
| 88C4 | JR Z,$88D8 | Jump if so | ||
| 88C6 | CP $1F | Are any of the keys 1-2-3-4-5 being pressed? | ||
| 88C8 | JP Z,$870E | If not, jump back to the start of the main loop | ||
| 88CB | CP (IX-$02) | Does the keyboard reading match the first byte of the previous entry in the 6031769 table? | ||
| 88CE | JP Z,$870E | If so, jump back to the start of the main loop | ||
| 88D1 | XOR A | Reset the 6031769 key counter at 845D to 0 (an incorrect key is being pressed) | ||
| 88D2 | LD ($845D),A | |||
| 88D5 | JP $870E | Jump back to the start of the main loop | ||
| 88D8 | LD B,$EF | Read keys 6-7-8-9-0 | ||
| 88DA | IN A,(C) | |||
| 88DC | AND $1F | Keep only bits 0-4 | ||
| 88DE | CP (IX+$01) | Does this match the second byte of the entry in the 6031769 table? | ||
| 88E1 | JR Z,$88F5 | If so, jump to increment the 6031769 key counter | ||
| 88E3 | CP $1F | Are any of the keys 6-7-8-9-0 being pressed? | ||
| 88E5 | JP Z,$870E | If not, jump back to the start of the main loop | ||
| 88E8 | CP (IX-$01) | Does the keyboard reading match the second byte of the previous entry in the 6031769 table? | ||
| 88EB | JP Z,$870E | If so, jump back to the start of the main loop | ||
| 88EE | XOR A | Reset the 6031769 key counter at 845D to 0 (an incorrect key is being pressed) | ||
| 88EF | LD ($845D),A | |||
| 88F2 | JP $870E | Jump back to the start of the main loop | ||
| 88F5 | LD A,($845D) | Increment the 6031769 key counter at 845D (the next key in the sequence is being pressed) | ||
| 88F8 | INC A | |||
| 88F9 | LD ($845D),A | |||
| 88FC | JP $870E | Jump back to the start of the main loop | ||
|
The air in the cavern has run out, or Willy has had a fatal accident, or it's demo mode and it's time to show the next cavern.
|
||||
| 88FF | LD A,($845A) | Pick up the game mode indicator from 845A | ||
| 8902 | OR A | Is it demo mode? | ||
| 8903 | JP NZ,$9028 | If so, move to the next cavern | ||
| 8906 | LD A,$47 | A=0x47 (INK 7: PAPER 0: BRIGHT 1) | ||
|
The following loop fills the top two thirds of the attribute file with a single value (0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41 or 0x40) and makes a sound effect.
|
||||
| 8908 | LD HL,$5800 | Fill the top two thirds of the attribute file with the value in A | ||
| 890B | LD DE,$5801 | |||
| 890E | LD BC,$01FF | |||
| 8911 | LD (HL),A | |||
| 8912 | LDIR | |||
| 8914 | LD E,A | Save the attribute byte (0x40-0x47) in E for later retrieval | ||
| 8915 | CPL | D=63-8*(E AND 7); this value determines the pitch of the short note that will be played | ||
| 8916 | AND $07 | |||
| 8918 | RLCA | |||
| 8919 | RLCA | |||
| 891A | RLCA | |||
| 891B | OR $07 | |||
| 891D | LD D,A | |||
| 891E | LD C,E | C=8+32*(E AND 7); this value determines the duration of the short note that will be played | ||
| 891F | RRC C | |||
| 8921 | RRC C | |||
| 8923 | RRC C | |||
| 8925 | OR $10 | Set bit 4 of A (for no apparent reason) | ||
| 8927 | XOR A | Set A=0 (this will make the border black) | ||
| 8928 | OUT ($FE),A | Produce a short note whose pitch is determined by D and whose duration is determined by C | ||
| 892A | XOR $18 | |||
| 892C | LD B,D | |||
| 892D | DJNZ $892D | |||
| 892F | DEC C | |||
| 8930 | JR NZ,$8928 | |||
| 8932 | LD A,E | Restore the attribute byte (originally 0x47) to A | ||
| 8933 | DEC A | Decrement it (effectively decrementing the INK colour) | ||
| 8934 | CP $3F | Have we used attribute value 0x40 (INK 0) yet? | ||
| 8936 | JR NZ,$8908 | If not, jump back to update the INK colour in the top two thirds of the screen and make another sound effect | ||
|
Finally, check whether any lives remain.
|
||||
| 8938 | LD HL,$8457 | Pick up the number of lives remaining from 8457 | ||
| 893B | LD A,(HL) | |||
| 893C | OR A | Are there any lives remaining? | ||
| 893D | JP Z,$8944 | If not, display the game over sequence | ||
| 8940 | DEC (HL) | Decrease the number of lives remaining by one | ||
| 8941 | JP $8691 | Jump back to reinitialise the current cavern | ||
| Prev: 8684 | Up: Map | Next: 8944 |