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 |