![]() |
Routines |
| Prev: 34436 | Up: Map | Next: 35140 |
|
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 | Next: 35140 |