Routines |
Prev: 8AEB | Up: Map | Next: 8C01 |
Used by the routine at 89AD. The main entry point is used when resuming the game after it has been paused.
|
||||
8B07 | LD HL,$9A00 | Copy the attribute bytes from 9A00 to the bottom third of the screen | ||
8B0A | LD DE,$5A00 | |||
8B0D | LD BC,$0100 | |||
8B10 | LDIR | |||
8B12 | LD A,($80DE) | Pick up the border colour for the current room from 80DE | ||
8B15 | OUT ($FE),A | Restore the border colour | ||
This entry point is used by the routine at 89AD.
|
||||
8B17 | LD A,($85D1) | Pick up the airborne status indicator from 85D1 | ||
8B1A | CP $FF | Has Willy landed after falling from too great a height, or collided with a nasty, an arrow, a guardian, or Maria? | ||
8B1C | JP Z,$8C01 | If so, lose a life | ||
Now read the keys H, J, K, L and ENTER (which toggle the in-game music).
|
||||
8B1F | LD B,$BF | Prepare B for reading keys H-J-K-L-ENTER | ||
8B21 | LD HL,$85E2 | Point HL at the music flags at 85E2 | ||
8B24 | IN A,(C) | Read keys H-J-K-L-ENTER; note that if the game has just resumed after being paused, C holds 0x00 instead of 0xFE, which is a bug | ||
8B26 | AND $1F | Are any of these keys being pressed? | ||
8B28 | CP $1F | |||
8B2A | JR Z,$8B36 | Jump if not | ||
8B2C | BIT 0,(HL) | Were any of these keys being pressed the last time we checked? | ||
8B2E | JR NZ,$8B38 | Jump if so | ||
8B30 | LD A,(HL) | Set bit 0 (the keypress flag) and flip bit 1 (the in-game music flag) at 85E2 | ||
8B31 | XOR $03 | |||
8B33 | LD (HL),A | |||
8B34 | JR $8B38 | |||
8B36 | RES 0,(HL) | Reset bit 0 (the keypress flag) at 85E2 | ||
8B38 | BIT 1,(HL) | Has the in-game music been switched off? | ||
8B3A | JR NZ,$8B70 | Jump if so | ||
The next section of code plays a note of the in-game music.
|
||||
8B3C | XOR A | Reset the inactivity timer at 85E0 (the game does not automatically pause after a period of inactivity if the in-game music is playing) | ||
8B3D | LD ($85E0),A | |||
8B40 | LD A,($85E1) | Increment the in-game music note index at 85E1 | ||
8B43 | INC A | |||
8B44 | LD ($85E1),A | |||
8B47 | AND $7E | Point HL at the appropriate entry in the tune data table at 865F | ||
8B49 | RRCA | |||
8B4A | LD E,A | |||
8B4B | LD D,$00 | |||
8B4D | LD HL,$865F | |||
8B50 | ADD HL,DE | |||
8B51 | LD A,($85CC) | Pick up the number of lives remaining (0-7) from 85CC | ||
8B54 | RLCA | A=28-4A; this value adjusts the pitch of the note that is played depending on how many lives are remaining (the more lives remaining, the higher the pitch) | ||
8B55 | RLCA | |||
8B56 | SUB $1C | |||
8B58 | NEG | |||
8B5A | ADD A,(HL) | Add the entry from the tune data table for the current note | ||
8B5B | LD D,A | Copy this value to D (which determines the pitch of the note) | ||
8B5C | LD A,($80DE) | Pick up the border colour for the current room from 80DE | ||
8B5F | LD E,D | Initialise the pitch delay counter in E | ||
8B60 | LD BC,$0003 | Initialise the duration delay counters in B (0) and C (3) | ||
8B63 | OUT ($FE),A | Produce a note of the in-game music | ||
8B65 | DEC E | |||
8B66 | JR NZ,$8B6B | |||
8B68 | LD E,D | |||
8B69 | XOR $18 | |||
8B6B | DJNZ $8B63 | |||
8B6D | DEC C | |||
8B6E | JR NZ,$8B63 | |||
Here we check the teleport keys.
|
||||
8B70 | LD BC,$EFFE | Read keys 6-7-8-9-0 | ||
8B73 | IN A,(C) | |||
8B75 | BIT 1,A | Is '9' (the activator key) being pressed? | ||
8B77 | JP NZ,$8B97 | Jump if not | ||
8B7A | AND $10 | Keep only bit 4 (corresponding to the '6' key), flip it, and move it into bit 5 | ||
8B7C | XOR $10 | |||
8B7E | RLCA | |||
8B7F | LD D,A | Now bit 5 of D is set if '6' is being pressed | ||
8B80 | LD A,($85E3) | Pick up the WRITETYPER key counter from 85E3 | ||
8B83 | CP $0A | Has WRITETYPER been keyed in yet? | ||
8B85 | JP NZ,$8B97 | Jump if not | ||
8B88 | LD BC,$F7FE | Read keys 1-2-3-4-5 | ||
8B8B | IN A,(C) | |||
8B8D | CPL | Keep only bits 0-4 and flip them | ||
8B8E | AND $1F | |||
8B90 | OR D | Copy bit 5 of D into A; now A holds the number of the room to teleport to | ||
8B91 | LD ($8420),A | Store the room number at 8420 | ||
8B94 | JP $8912 | Teleport into the room | ||
Finally, check the WRITETYPER keys.
|
||||
8B97 | LD A,($85E3) | Pick up the WRITETYPER key counter from 85E3 | ||
8B9A | CP $0A | Has WRITETYPER been keyed in yet? | ||
8B9C | JP Z,$89AD | If so, jump back to the start of the main loop | ||
8B9F | LD A,($8420) | Pick up the current room number from 8420 | ||
8BA2 | CP $1C | Are we in First Landing? | ||
8BA4 | JP NZ,$89AD | If not, jump back to the start of the main loop | ||
8BA7 | LD A,($85CF) | Pick up Willy's y-coordinate from 85CF | ||
8BAA | CP $D0 | Is Willy on the floor at the bottom of the staircase? | ||
8BAC | JP NZ,$89AD | If not, jump back to the start of the main loop | ||
8BAF | LD A,($85E3) | Pick up the WRITETYPER key counter (0-9) from 85E3 | ||
8BB2 | RLCA | Point IX at the corresponding entry in the WRITETYPER table at 85E7 | ||
8BB3 | LD E,A | |||
8BB4 | LD D,$00 | |||
8BB6 | LD IX,$85E7 | |||
8BBA | ADD IX,DE | |||
8BBC | LD BC,$FBFE | Read keys Q-W-E-R-T | ||
8BBF | IN A,(C) | |||
8BC1 | AND $1F | Keep only bits 0-4 | ||
8BC3 | CP (IX+$00) | Does this match the first byte of the entry in the WRITETYPER table? | ||
8BC6 | JR Z,$8BDA | Jump if so | ||
8BC8 | CP $1F | Are any of the keys Q-W-E-R-T being pressed? | ||
8BCA | JP Z,$89AD | If not, jump back to the start of the main loop | ||
8BCD | CP (IX-$02) | Does the keyboard reading match the first byte of the previous entry in the WRITETYPER table? | ||
8BD0 | JP Z,$89AD | If so, jump back to the start of the main loop | ||
8BD3 | XOR A | Reset the WRITETYPER key counter at 85E3 to 0 (an incorrect key was pressed) | ||
8BD4 | LD ($85E3),A | |||
8BD7 | JP $89AD | Jump back to the start of the main loop | ||
8BDA | LD B,$DF | Read keys Y-U-I-O-P | ||
8BDC | IN A,(C) | |||
8BDE | AND $1F | Keep only bits 0-4 | ||
8BE0 | CP (IX+$01) | Does this match the second byte of the entry in the WRITETYPER table? | ||
8BE3 | JR Z,$8BF7 | If so, jump to increment the WRITETYPER key counter | ||
8BE5 | CP $1F | Are any of the keys Y-U-I-O-P being pressed? | ||
8BE7 | JP Z,$89AD | If not, jump back to the start of the main loop | ||
8BEA | CP (IX-$01) | Does the keyboard reading match the second byte of the previous entry in the WRITETYPER table? | ||
8BED | JP Z,$89AD | If so, jump back to the start of the main loop | ||
8BF0 | XOR A | Reset the WRITETYPER key counter at 85E3 to 0 (an incorrect key was pressed) | ||
8BF1 | LD ($85E3),A | |||
8BF4 | JP $89AD | Jump back to the start of the main loop | ||
8BF7 | LD A,($85E3) | Increment the WRITETYPER key counter at 85E3 | ||
8BFA | INC A | |||
8BFB | LD ($85E3),A | |||
8BFE | JP $89AD | Jump back to the start of the main loop |
Prev: 8AEB | Up: Map | Next: 8C01 |