![]() |
Routines |
Prev: 34436 | Up: Map |
The routine at 34436 continues here.
The first thing to do is check whether there are any remaining lives to draw at the bottom of the screen.
|
||||||||
34574 | LD A,(33879) | Pick up the number of lives remaining from 33879 | ||||||
34577 | LD HL,20640 | Set HL to the display file address at which to draw the first Willy sprite | ||||||
34580 | OR A | Are there any lives remaining? | ||||||
34581 | JR Z,34608 | Jump if not | ||||||
34583 | LD B,A | Initialise B to the number of lives remaining | ||||||
The following loop draws the remaining lives at the bottom of the screen.
|
||||||||
34584 | LD C,0 | C=0; this tells the sprite-drawing routine at 36852 to overwrite any existing graphics | ||||||
34586 | PUSH HL | Save HL and BC briefly | ||||||
34587 | PUSH BC | |||||||
34588 | LD A,(33883) | Pick up the in-game music note index from 33883; this will determine the animation frame for the Willy sprites | ||||||
34591 | RLCA | Now A=0 (frame 0), 32 (frame 1), 64 (frame 2) or 96 (frame 3) | ||||||
34592 | RLCA | |||||||
34593 | RLCA | |||||||
34594 | AND 96 | |||||||
34596 | LD E,A | Point DE at the corresponding Willy sprite (at 33280+A) | ||||||
34597 | LD D,130 | |||||||
34599 | CALL 36852 | Draw the Willy sprite on the screen | ||||||
34602 | POP BC | Restore HL and BC | ||||||
34603 | POP HL | |||||||
34604 | INC HL | Move HL along to the location at which to draw the next Willy sprite | ||||||
34605 | INC HL | |||||||
34606 | DJNZ 34584 | Jump back to draw any remaining sprites | ||||||
Now draw a boot if cheat mode has been activated.
|
||||||||
34608 | LD A,(33885) | Pick up the 6031769 key counter from 33885 | ||||||
34611 | CP 7 | Has 6031769 been keyed in yet? | ||||||
34613 | JR NZ,34623 | Jump if not | ||||||
34615 | LD DE,47840 | Point DE at the graphic data for the boot (at 47840) | ||||||
34618 | LD C,0 | C=0 (overwrite mode) | ||||||
34620 | CALL 36852 | 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.
|
||||||||
34623 | LD HL,24064 | Copy the contents of the attribute buffer at 24064 (the attributes for the empty cavern) into the attribute buffer at 23552 | ||||||
34626 | LD DE,23552 | |||||||
34629 | LD BC,512 | |||||||
34632 | LDIR | |||||||
34634 | LD HL,28672 | Copy the contents of the screen buffer at 28672 (the tiles for the empty cavern) into the screen buffer at 24576 | ||||||
34637 | LD DE,24576 | |||||||
34640 | LD BC,4096 | |||||||
34643 | LDIR | |||||||
34645 | CALL 36111 | Move the horizontal guardians in the current cavern | ||||||
34648 | LD A,(33882) | Pick up the game mode indicator from 33882 | ||||||
34651 | OR A | Are we in demo mode? | ||||||
34652 | CALL Z,35515 | If not, move Willy | ||||||
34655 | LD A,(33882) | Pick up the game mode indicator from 33882 | ||||||
34658 | OR A | Are we in demo mode? | ||||||
34659 | CALL Z,37434 | If not, check and set the attribute bytes for Willy's sprite in the buffer at 23552, and draw Willy to the screen buffer at 24576 | ||||||
34662 | CALL 36266 | Draw the horizontal guardians in the current cavern | ||||||
34665 | CALL 37125 | Move the conveyor in the current cavern | ||||||
34668 | CALL 36707 | Draw the items in the current cavern and collect any that Willy is touching | ||||||
34671 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34674 | CP 4 | Are we in Eugene's Lair? | ||||||
34676 | CALL Z,36344 | If so, move and draw Eugene | ||||||
34679 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34682 | CP 13 | Are we in Skylab Landing Bay? | ||||||
34684 | JP Z,36469 | If so, move and draw the Skylabs | ||||||
34687 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34690 | CP 8 | Are we in Wacky Amoebatrons or beyond? | ||||||
34692 | CALL NC,36593 | If so, move and draw the vertical guardians | ||||||
34695 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34698 | CP 7 | Are we in Miner Willy meets the Kong Beast? | ||||||
34700 | CALL Z,37173 | If so, move and draw the Kong Beast | ||||||
34703 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34706 | CP 11 | Are we in Return of the Alien Kong Beast? | ||||||
34708 | CALL Z,37173 | If so, move and draw the Kong Beast | ||||||
34711 | LD A,(33799) | Pick up the number of the current cavern from 33799 | ||||||
34714 | CP 18 | Are we in Solar Power Generator? | ||||||
34716 | CALL Z,36211 | If so, move and draw the light beam | ||||||
This entry point is used by the routine at 36469.
|
||||||||
34719 | CALL 36805 | Draw the portal, or move to the next cavern if Willy has entered it | ||||||
This entry point is used by the routine at 36101.
|
||||||||
34722 | LD HL,24576 | Copy the contents of the screen buffer at 24576 to the display file | ||||||
34725 | LD DE,16384 | |||||||
34728 | LD BC,4096 | |||||||
34731 | LDIR | |||||||
34733 | LD A,(33880) | Pick up the screen flash counter from 33880 | ||||||
34736 | OR A | Is it zero? | ||||||
34737 | JR Z,34760 | Jump if so | ||||||
34739 | DEC A | Decrement the screen flash counter at 33880 | ||||||
34740 | LD (33880),A | |||||||
34743 | RLCA | Move bits 0-2 into bits 3-5 and clear all the other bits | ||||||
34744 | RLCA | |||||||
34745 | RLCA | |||||||
34746 | AND 56 | |||||||
34748 | LD HL,23552 | Set every attribute byte in the buffer at 23552 to this value | ||||||
34751 | LD DE,23553 | |||||||
34754 | LD BC,511 | |||||||
34757 | LD (HL),A | |||||||
34758 | LDIR | |||||||
34760 | LD HL,23552 | Copy the contents of the attribute buffer at 23552 to the attribute file | ||||||
34763 | LD DE,22528 | |||||||
34766 | LD BC,512 | |||||||
34769 | LDIR | |||||||
34771 | LD IX,33833 | Print the score (see 33833) at (19,26) | ||||||
34775 | LD DE,20602 | |||||||
34778 | LD C,6 | |||||||
34780 | CALL 37562 | |||||||
34783 | LD IX,33823 | Print the high score (see 33823) at (19,11) | ||||||
34787 | LD DE,20587 | |||||||
34790 | LD C,6 | |||||||
34792 | CALL 37562 | |||||||
34795 | CALL 35388 | Decrease the air remaining in the current cavern | ||||||
34798 | JP Z,35071 | Jump if there's no air left | ||||||
Now check whether SHIFT and SPACE are being pressed.
|
||||||||
34801 | LD BC,65278 | Read keys SHIFT-Z-X-C-V | ||||||
34804 | IN A,(C) | |||||||
34806 | LD E,A | Save the result in E | ||||||
34807 | LD B,127 | Read keys B-N-M-SS-SPACE | ||||||
34809 | IN A,(C) | |||||||
34811 | OR E | Combine the results | ||||||
34812 | AND 1 | Are SHIFT and SPACE being pressed? | ||||||
34814 | JP Z,34252 | If so, quit the game | ||||||
Now read the keys A, S, D, F and G (which pause the game).
|
||||||||
34817 | LD B,253 | Read keys A-S-D-F-G | ||||||
34819 | IN A,(C) | |||||||
34821 | AND 31 | Are any of these keys being pressed? | ||||||
34823 | CP 31 | |||||||
34825 | JR Z,34837 | Jump if not | ||||||
34827 | LD B,2 | Read every half-row of keys except A-S-D-F-G | ||||||
34829 | IN A,(C) | |||||||
34831 | AND 31 | Are any of these keys being pressed? | ||||||
34833 | CP 31 | |||||||
34835 | JR Z,34827 | Jump back if not (the game is still paused) | ||||||
Here we check whether Willy has had a fatal accident.
|
||||||||
34837 | LD A,(32875) | Pick up the airborne status indicator from 32875 | ||||||
34840 | CP 255 | Has Willy landed after falling from too great a height, or collided with a nasty or a guardian? | ||||||
34842 | JP Z,35071 | Jump if so | ||||||
Now read the keys H, J, K, L and ENTER (which toggle the in-game music).
|
||||||||
34845 | LD B,191 | Prepare B for reading keys H-J-K-L-ENTER | ||||||
34847 | LD HL,33884 | Point HL at the music flags at 33884 | ||||||
34850 | IN A,(C) | Read keys H-J-K-L-ENTER | ||||||
34852 | AND 31 | Are any of these keys being pressed? | ||||||
34854 | CP 31 | |||||||
34856 | JR Z,34868 | Jump if not | ||||||
34858 | BIT 0,(HL) | Were any of these keys being pressed the last time we checked? | ||||||
34860 | JR NZ,34870 | Jump if so | ||||||
34862 | LD A,(HL) | Set bit 0 (the keypress flag) and flip bit 1 (the in-game music flag) at 33884 | ||||||
34863 | XOR 3 | |||||||
34865 | LD (HL),A | |||||||
34866 | JR 34870 | |||||||
34868 | RES 0,(HL) | Reset bit 0 (the keypress flag) at 33884 | ||||||
34870 | BIT 1,(HL) | Has the in-game music been switched off? | ||||||
34872 | JR NZ,34911 | Jump if so | ||||||
The next section of code plays a note of the in-game music.
|
||||||||
34874 | LD A,(33883) | Increment the in-game music note index at 33883 | ||||||
34877 | INC A | |||||||
34878 | LD (33883),A | |||||||
34881 | AND 126 | Point HL at the appropriate entry in the tune data table at 34188 | ||||||
34883 | RRCA | |||||||
34884 | LD E,A | |||||||
34885 | LD D,0 | |||||||
34887 | LD HL,34188 | |||||||
34890 | ADD HL,DE | |||||||
34891 | LD A,(32883) | Pick up the border colour for the current cavern from 32883 | ||||||
34894 | LD E,(HL) | Initialise the pitch delay counter in E | ||||||
34895 | LD BC,3 | Initialise the duration delay counters in B (0) and C (3) | ||||||
34898 | OUT (254),A | Produce a note of the in-game music | ||||||
34900 | DEC E | |||||||
34901 | JR NZ,34906 | |||||||
34903 | LD E,(HL) | |||||||
34904 | XOR 24 | |||||||
34906 | DJNZ 34898 | |||||||
34908 | DEC C | |||||||
34909 | JR NZ,34898 | |||||||
If we're in demo mode, check the keyboard and joystick and return to the title screen if there's any input.
|
||||||||
34911 | LD A,(33882) | Pick up the game mode indicator from 33882 | ||||||
34914 | OR A | Are we in demo mode? | ||||||
34915 | JR Z,34948 | Jump if not | ||||||
34917 | DEC A | We're in demo mode; is it time to show the next cavern? | ||||||
34918 | JP Z,35071 | Jump if so | ||||||
34921 | LD (33882),A | Update the game mode indicator at 33882 | ||||||
34924 | LD BC,254 | Read every row of keys on the keyboard | ||||||
34927 | IN A,(C) | |||||||
34929 | AND 31 | Are any keys being pressed? | ||||||
34931 | CP 31 | |||||||
34933 | JP NZ,34252 | If so, return to the title screen | ||||||
34936 | LD A,(33881) | Pick up the Kempston joystick indicator from 33881 | ||||||
34939 | OR A | Is there a joystick connected? | ||||||
34940 | JR Z,34948 | Jump if not | ||||||
34942 | IN A,(31) | Collect input from the joystick | ||||||
34944 | OR A | Is the joystick being moved or the fire button being pressed? | ||||||
34945 | JP NZ,34252 | If so, return to the title screen | ||||||
Here we check the teleport keys.
|
||||||||
34948 | LD BC,61438 | Read keys 6-7-8-9-0 | ||||||
34951 | IN A,(C) | |||||||
34953 | BIT 4,A | Is '6' (the activator key) being pressed? | ||||||
34955 | JP NZ,34984 | Jump if not | ||||||
34958 | LD A,(33885) | Pick up the 6031769 key counter from 33885 | ||||||
34961 | CP 7 | Has 6031769 been keyed in yet? | ||||||
34963 | JP NZ,34984 | Jump if not | ||||||
34966 | LD B,247 | Read keys 1-2-3-4-5 | ||||||
34968 | IN A,(C) | |||||||
34970 | CPL | Keep only bits 0-4 and flip them | ||||||
34971 | AND 31 | |||||||
34973 | CP 20 | Is the result 20 or greater? | ||||||
34975 | JP NC,34984 | Jump if so (this is not a cavern number) | ||||||
34978 | LD (33799),A | Store the cavern number at 33799 | ||||||
34981 | JP 34449 | Teleport into the cavern | ||||||
Now check the 6031769 keys.
|
||||||||
34984 | LD A,(33885) | Pick up the 6031769 key counter from 33885 | ||||||
34987 | CP 7 | Has 6031769 been keyed in yet? | ||||||
34989 | JP Z,34574 | If so, jump back to the start of the main loop | ||||||
34992 | RLCA | Point IX at the corresponding entry in the 6031769 table at 33888 | ||||||
34993 | LD E,A | |||||||
34994 | LD D,0 | |||||||
34996 | LD IX,33888 | |||||||
35000 | ADD IX,DE | |||||||
35002 | LD BC,63486 | Read keys 1-2-3-4-5 | ||||||
35005 | IN A,(C) | |||||||
35007 | AND 31 | Keep only bits 0-4 | ||||||
35009 | CP (IX+0) | Does this match the first byte of the entry in the 6031769 table? | ||||||
35012 | JR Z,35032 | Jump if so | ||||||
35014 | CP 31 | Are any of the keys 1-2-3-4-5 being pressed? | ||||||
35016 | JP Z,34574 | If not, jump back to the start of the main loop | ||||||
35019 | CP (IX-2) | Does the keyboard reading match the first byte of the previous entry in the 6031769 table? | ||||||
35022 | JP Z,34574 | If so, jump back to the start of the main loop | ||||||
35025 | XOR A | Reset the 6031769 key counter at 33885 to 0 (an incorrect key is being pressed) | ||||||
35026 | LD (33885),A | |||||||
35029 | JP 34574 | Jump back to the start of the main loop | ||||||
35032 | LD B,239 | Read keys 6-7-8-9-0 | ||||||
35034 | IN A,(C) | |||||||
35036 | AND 31 | Keep only bits 0-4 | ||||||
35038 | CP (IX+1) | Does this match the second byte of the entry in the 6031769 table? | ||||||
35041 | JR Z,35061 | If so, jump to increment the 6031769 key counter | ||||||
35043 | CP 31 | Are any of the keys 6-7-8-9-0 being pressed? | ||||||
35045 | JP Z,34574 | If not, jump back to the start of the main loop | ||||||
35048 | CP (IX-1) | Does the keyboard reading match the second byte of the previous entry in the 6031769 table? | ||||||
35051 | JP Z,34574 | If so, jump back to the start of the main loop | ||||||
35054 | XOR A | Reset the 6031769 key counter at 33885 to 0 (an incorrect key is being pressed) | ||||||
35055 | LD (33885),A | |||||||
35058 | JP 34574 | Jump back to the start of the main loop | ||||||
35061 | LD A,(33885) | Increment the 6031769 key counter at 33885 (the next key in the sequence is being pressed) | ||||||
35064 | INC A | |||||||
35065 | LD (33885),A | |||||||
35068 | JP 34574 | 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.
|
||||||||
35071 | LD A,(33882) | Pick up the game mode indicator from 33882 | ||||||
35074 | OR A | Is it demo mode? | ||||||
35075 | JP NZ,36904 | If so, move to the next cavern | ||||||
35078 | LD A,71 | A=71 (INK 7: PAPER 0: BRIGHT 1) | ||||||
The following loop fills the top two thirds of the attribute file with a single value (71, 70, 69, 68, 67, 66, 65 or 64) and makes a sound effect.
|
||||||||
35080 | LD HL,22528 | Fill the top two thirds of the attribute file with the value in A | ||||||
35083 | LD DE,22529 | |||||||
35086 | LD BC,511 | |||||||
35089 | LD (HL),A | |||||||
35090 | LDIR | |||||||
35092 | LD E,A | Save the attribute byte (64-71) in E for later retrieval | ||||||
35093 | CPL | D=63-8*(E AND 7); this value determines the pitch of the short note that will be played | ||||||
35094 | AND 7 | |||||||
35096 | RLCA | |||||||
35097 | RLCA | |||||||
35098 | RLCA | |||||||
35099 | OR 7 | |||||||
35101 | LD D,A | |||||||
35102 | LD C,E | C=8+32*(E AND 7); this value determines the duration of the short note that will be played | ||||||
35103 | RRC C | |||||||
35105 | RRC C | |||||||
35107 | RRC C | |||||||
35109 | OR 16 | Set bit 4 of A (for no apparent reason) | ||||||
35111 | XOR A | Set A=0 (this will make the border black) | ||||||
35112 | OUT (254),A | Produce a short note whose pitch is determined by D and whose duration is determined by C | ||||||
35114 | XOR 24 | |||||||
35116 | LD B,D | |||||||
35117 | DJNZ 35117 | |||||||
35119 | DEC C | |||||||
35120 | JR NZ,35112 | |||||||
35122 | LD A,E | Restore the attribute byte (originally 71) to A | ||||||
35123 | DEC A | Decrement it (effectively decrementing the INK colour) | ||||||
35124 | CP 63 | Have we used attribute value 64 (INK 0) yet? | ||||||
35126 | JR NZ,35080 | 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.
|
||||||||
35128 | LD HL,33879 | Pick up the number of lives remaining from 33879 | ||||||
35131 | LD A,(HL) | |||||||
35132 | OR A | Are there any lives remaining? | ||||||
35133 | JP Z,35140 | If not, display the game over sequence | ||||||
35136 | DEC (HL) | Decrease the number of lives remaining by one | ||||||
35137 | JP 34449 | Jump back to reinitialise the current cavern |
Prev: 34436 | Up: Map |