![]() |
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 |