![]() |
Routines |
| Prev: 873C | Up: Map | Next: 88FC |
| 87CA | XOR A | A=0 | ||
| 87CB | LD ($85CE),A | Initialise the Kempston joystick indicator at 85CE | ||
| 87CE | LD ($85E1),A | Initialise the in-game music note index at 85E1 | ||
| 87D1 | LD ($85CD),A | Initialise the (unused) screen flash counter at 85CD | ||
| 87D4 | LD ($85D1),A | Initialise the airborne status indicator at 85D1 | ||
| 87D7 | LD ($85CB),A | Initialise the minute counter at 85CB | ||
| 87DA | LD ($85E0),A | Initialise the inactivity timer at 85E0 | ||
| 87DD | LD ($85DF),A | Initialise the game mode indicator at 85DF | ||
| 87E0 | LD A,$07 | Initialise the number of lives remaining at 85CC | ||
| 87E2 | LD ($85CC),A | |||
| 87E5 | LD A,$D0 | Initialise Willy's y-coordinate at 85CF | ||
| 87E7 | LD ($85CF),A | |||
| 87EA | LD A,$21 | Initialise the current room number at 8420 to 0x21 (The Bathroom) | ||
| 87EC | LD ($8420),A | |||
| 87EF | LD HL,$5DB4 | Initialise Willy's coordinates at 85D3 to (13,20) | ||
| 87F2 | LD ($85D3),HL | |||
| 87F5 | LD HL,$857C | Initialise the number of items collected at 857C to "000" | ||
| 87F8 | LD (HL),$30 | |||
| 87FA | INC HL | |||
| 87FB | LD (HL),$30 | |||
| 87FD | INC HL | |||
| 87FE | LD (HL),$30 | |||
| 8800 | LD H,$A4 | Page 0xA4 holds the first byte of each entry in the item table | ||
| 8802 | LD A,($A3FF) | Pick up the index of the first item from A3FF | ||
| 8805 | LD L,A | Point HL at the entry for the first item | ||
| 8806 | LD ($85DE),A | Initialise the counter of items remaining at 85DE | ||
| 8809 | SET 6,(HL) | Set the collection flag for every item in the item table at A400 | ||
| 880B | INC L | |||
| 880C | JR NZ,$8809 | |||
| 880E | LD HL,$85E2 | Initialise the keypress flag in bit 0 at 85E2 | ||
| 8811 | SET 0,(HL) | |||
|
Next, prepare the screen.
|
||||
| 8813 | LD HL,$4000 | Clear the entire display file | ||
| 8816 | LD DE,$4001 | |||
| 8819 | LD BC,$17FF | |||
| 881C | LD (HL),$00 | |||
| 881E | LDIR | |||
| 8820 | LD HL,$9800 | Copy the attribute bytes for the title screen from 9800 and 9A00 to the attribute file | ||
| 8823 | LD BC,$0300 | |||
| 8826 | LDIR | |||
| 8828 | LD HL,$5A60 | Copy the attribute value 0x46 (INK 6: PAPER 0: BRIGHT 1) into the row of 32 cells from (19,0) to (19,31) on the screen | ||
| 882B | LD DE,$5A61 | |||
| 882E | LD BC,$001F | |||
| 8831 | LD (HL),$46 | |||
| 8833 | LDIR | |||
| 8835 | LD IX,$8454 | Print "+++++ Press ENTER to Start +++++" (see 8454) at (19,0) | ||
| 8839 | LD DE,$5060 | |||
| 883C | LD C,$20 | |||
| 883E | CALL $9680 | |||
| 8841 | LD DE,$5800 | Point DE at the first byte of the attribute file | ||
|
The following loop scans the top two-thirds of the attribute file, which contains values 0x00, 0x04, 0x05, 0x08, 0x09, 0x24, 0x25, 0x28, 0x29, 0x2C, 0x2D and 0xD3 (copied from 9800). Whenever a value other than 0x00, 0x09, 0x24, 0x2D or 0xD3 is found, a triangle UDG is drawn at the corresponding location in the display file.
|
||||
| 8844 | LD A,(DE) | Pick up a byte from the attribute file | ||
| 8845 | OR A | Is it 0x00 (INK 0: PAPER 0)? | ||
| 8846 | JR Z,$888E | If so, jump to consider the next byte in the attribute file | ||
| 8848 | CP $D3 | Is it 0xD3 (INK 3: PAPER 2: BRIGHT 1: FLASH 1)? | ||
| 884A | JR Z,$888E | If so, jump to consider the next byte in the attribute file | ||
| 884C | CP $09 | Is it 0x09 (INK 1: PAPER 1)? | ||
| 884E | JR Z,$888E | If so, jump to consider the next byte in the attribute file | ||
| 8850 | CP $2D | Is it 0x2D (INK 5: PAPER 5)? | ||
| 8852 | JR Z,$888E | If so, jump to consider the next byte in the attribute file | ||
| 8854 | CP $24 | Is it 0x24 (INK 4: PAPER 4)? | ||
| 8856 | JR Z,$888E | If so, jump to consider the next byte in the attribute file | ||
| 8858 | LD C,$00 | C=0; this will be used as an offset from the triangle UDG base address (8431) | ||
| 885A | CP $08 | Is the attribute value 0x08 (INK 0: PAPER 1)? | ||
| 885C | JR Z,$8871 | Jump if so | ||
| 885E | CP $29 | Is it 0x29 (INK 1: PAPER 5)? | ||
| 8860 | JR Z,$8871 | Jump if so | ||
| 8862 | CP $2C | Is it 0x2C (INK 4: PAPER 5)? | ||
| 8864 | JR Z,$886E | Jump if so | ||
| 8866 | CP $05 | Is it 0x05 (INK 5: PAPER 0)? | ||
| 8868 | JR Z,$8871 | Jump if so | ||
| 886A | LD C,$10 | Set the triangle UDG offset to 0x10 | ||
| 886C | JR $8871 | |||
| 886E | LD A,$25 | Change the attribute byte here from 0x2C (INK 4: PAPER 5) to 0x25 (INK 5: PAPER 4) | ||
| 8870 | LD (DE),A | |||
| 8871 | LD A,E | Point HL at the triangle UDG to draw (8431, 8439, 8441 or 8449) | ||
| 8872 | AND $01 | |||
| 8874 | RLCA | |||
| 8875 | RLCA | |||
| 8876 | RLCA | |||
| 8877 | OR C | |||
| 8878 | LD C,A | |||
| 8879 | LD B,$00 | |||
| 887B | LD HL,$8431 | |||
| 887E | ADD HL,BC | |||
| 887F | PUSH DE | Save the attribute file address briefly | ||
| 8880 | BIT 0,D | Set the zero flag if we're still in the top third of the attribute file | ||
| 8882 | LD D,$40 | Point DE at the top third of the display file | ||
| 8884 | JR Z,$8888 | Jump if we're still in the top third of the attribute file | ||
| 8886 | LD D,$48 | Point DE at the middle third of the display file | ||
| 8888 | LD B,$08 | There are eight pixel rows in a triangle UDG | ||
| 888A | CALL $969B | Draw a triangle UDG on the screen | ||
| 888D | POP DE | Restore the attribute file address to DE | ||
| 888E | INC DE | Point DE at the next byte in the attribute file | ||
| 888F | LD A,D | Have we finished scanning the top two-thirds of the attribute file yet? | ||
| 8890 | CP $5A | |||
| 8892 | JP NZ,$8844 | If not, jump back to examine the next byte | ||
|
Now check whether there is a joystick connected.
|
||||
| 8895 | LD BC,$001F | This is the joystick port | ||
| 8898 | DI | Disable interrupts (which are already disabled) | ||
| 8899 | XOR A | A=0 | ||
| 889A | IN E,(C) | Combine 256 readings of the joystick port in A; if no joystick is connected, some of these readings will have bit 5 set | ||
| 889C | OR E | |||
| 889D | DJNZ $889A | |||
| 889F | AND $20 | Is a joystick connected (bit 5 reset)? | ||
| 88A1 | JR NZ,$88A8 | Jump if not | ||
| 88A3 | LD A,$01 | Set the Kempston joystick indicator at 85CE to 1 | ||
| 88A5 | LD ($85CE),A | |||
|
And finally, play the theme tune and check for keypresses.
|
||||
| 88A8 | LD HL,$85FB | Point HL at the theme tune data at 85FB | ||
| 88AB | CALL $96A2 | Play the theme tune | ||
| 88AE | JP NZ,$88FC | Start the game if ENTER, 0 or the fire button was pressed | ||
|
No key was pressed while the theme tune was playing, so scroll a message across the screen while repeatedly producing a screeching sound effect.
|
||||
| 88B1 | XOR A | Initialise the temporary game status buffer variable at 85E4 to 0; this will be used as an index for the message scrolled across the screen (see 8454) | ||
| 88B2 | LD ($85E4),A | |||
| 88B5 | CALL $8AEB | Cycle the INK and PAPER colours | ||
| 88B8 | LD HL,$5A60 | Copy the attribute value 0x4F (INK 7: PAPER 1: BRIGHT 1) into the row of 32 cells from (19,0) to (19,31) on the screen | ||
| 88BB | LD DE,$5A61 | |||
| 88BE | LD BC,$001F | |||
| 88C1 | LD (HL),$4F | |||
| 88C3 | LDIR | |||
| 88C5 | LD A,($85E4) | Pick up the message index from 85E4 | ||
| 88C8 | LD IX,$8454 | Point IX at the corresponding location in the message at 8454 | ||
| 88CC | LD E,A | |||
| 88CD | LD D,$00 | |||
| 88CF | ADD IX,DE | |||
| 88D1 | LD DE,$5060 | Print 32 characters of the message at (19,0) | ||
| 88D4 | LD C,$20 | |||
| 88D6 | CALL $9680 | |||
| 88D9 | LD A,($85E4) | Prepare a value between 0x32 and 0x51 in A (for the routine at 96DE) | ||
| 88DC | AND $1F | |||
| 88DE | ADD A,$32 | |||
| 88E0 | CALL $96DE | Make a sound effect | ||
| 88E3 | LD BC,$AFFE | Read keys H-J-K-L-ENTER and 6-7-8-9-0 | ||
| 88E6 | IN A,(C) | |||
| 88E8 | AND $01 | Keep only bit 0 of the result (ENTER, 0) | ||
| 88EA | CP $01 | Was ENTER or 0 pressed? | ||
| 88EC | JR NZ,$88FC | Jump if so to start the game | ||
| 88EE | LD A,($85E4) | Pick up the message index from 85E4 | ||
| 88F1 | INC A | Increment it | ||
| 88F2 | CP $E0 | Set the zero flag if we've reached the end of the message | ||
| 88F4 | LD ($85E4),A | Store the new message index at 85E4 | ||
| 88F7 | JR NZ,$88B5 | Jump back unless we've finished scrolling the message across the screen | ||
| 88F9 | JP $8813 | Jump back to prepare the screen and play the theme tune again | ||
| Prev: 873C | Up: Map | Next: 88FC |