Routines
 Prev: 8DC0 Up: Map Next: 8ED4
8DD3: Move Willy (1)
Used by the routine at 89AD. This routine deals with Willy if he's jumping or falling.
Input
Output
8DD3 LD A,(\$85D6) Pick up the rope status indicator from 85D6
8DD6 DEC A Is Willy on a rope?
8DD7 BIT 7,A
8DD9 JP Z,\$8ED4 Jump if so
8DDC LD A,(\$85D1) Pick up the airborne status indicator from 85D1
8DDF CP \$01 Is Willy jumping?
8DE1 JR NZ,\$8E36 Jump if not
Willy is currently jumping.
8DE3 LD A,(\$85D5) Pick up the jumping animation counter (0-17) from 85D5
8DE6 AND \$FE Discard bit 0
8DE8 SUB \$08 Now -8<=A<=8 (and A is even)
8DEA LD HL,\$85CF Adjust Willy's pixel y-coordinate at 85CF depending on where Willy is in the jump
8DEE LD (HL),A
8DEF CP \$F0 Is the new value negative (above the top of the screen)?
8DF1 JP NC,\$94B0 If so, move Willy into the room above
8DF4 CALL \$8E9C Adjust Willy's attribute buffer location at 85D3 depending on his pixel y-coordinate
8DF7 LD A,(\$80B2) Pick up the attribute byte of the wall tile for the current room from 80B2
8DFA CP (HL) Is the top-left cell of Willy's sprite overlapping a wall tile?
8DFB JP Z,\$8EBC Jump if so
8DFE INC HL Point HL at the top-right cell occupied by Willy's sprite
8DFF CP (HL) Is the top-right cell of Willy's sprite overlapping a wall tile?
8E00 JP Z,\$8EBC Jump if so
8E03 LD A,(\$85D5) Increment the jumping animation counter at 85D5
8E06 INC A
8E07 LD (\$85D5),A
8E0A SUB \$08 A=J-8, where J (1-18) is the new value of the jumping animation counter
8E0C JP P,\$8E11 Jump if J>=8
8E0F NEG A=8-J (1<=J<=7, 1<=A<=7)
8E11 INC A A=1+ABS(J-8)
8E12 RLCA D=8*(1+ABS(J-8)); this value determines the pitch of the jumping sound effect (rising as Willy rises, falling as Willy falls)
8E13 RLCA
8E14 RLCA
8E15 LD D,A
8E16 LD C,\$20 This value determines the duration of the jumping sound effect
8E18 LD A,(\$80DE) Pick up the border colour for the current room from 80DE
8E1B OUT (\$FE),A Make a jumping sound effect
8E1D XOR \$18
8E1F LD B,D
8E20 DJNZ \$8E20
8E22 DEC C
8E23 JR NZ,\$8E1B
8E25 LD A,(\$85D5) Pick up the jumping animation counter (1-18) from 85D5
8E28 CP \$12 Has Willy reached the end of the jump?
8E2A JP Z,\$8EB0 Jump if so
8E2D CP \$10 Is the jumping animation counter now 16?
8E2F JR Z,\$8E36 Jump if so
8E31 CP \$0D Is the jumping animation counter now 13?
8E33 JP NZ,\$8FBC Jump if not
If we get here, then Willy is standing on the floor or a ramp, or he's falling, or his jumping animation counter is 13 (at which point Willy is on his way down and is exactly two cell-heights above where he started the jump) or 16 (at which point Willy is on his way down and is exactly one cell-height above where he started the jump).
8E36 LD A,(\$85CF) Pick up Willy's pixel y-coordinate from 85CF
8E39 AND \$0E Is Willy either on a ramp, or occupying only four cells?
8E3B JR NZ,\$8E62 Jump if not
8E3D LD HL,(\$85D3) Pick up Willy's attribute buffer coordinates from 85D3
8E40 LD DE,\$0040 Point HL at the left-hand cell below Willy's sprite
8E44 BIT 1,H Is this location below the floor of the current room?
8E46 JP NZ,\$94D2 If so, move Willy into the room below
8E49 LD A,(\$80BB) Pick up the attribute byte of the nasty tile for the current room from 80BB
8E4C CP (HL) Does the left-hand cell below Willy's sprite contain a nasty?
8E4D JR Z,\$8E62 Jump if so
8E4F INC HL Point HL at the right-hand cell below Willy's sprite
8E50 LD A,(\$80BB) Pick up the attribute byte of the nasty tile for the current room from 80BB (again, redundantly)
8E53 CP (HL) Does the right-hand cell below Willy's sprite contain a nasty?
8E54 JR Z,\$8E62 Jump if so
8E56 LD A,(\$80A0) Pick up the attribute byte of the background tile for the current room from 80A0
8E59 CP (HL) Set the zero flag if the right-hand cell below Willy's sprite is empty
8E5A DEC HL Point HL at the left-hand cell below Willy's sprite
8E5B JP NZ,\$8ED4 Jump if the right-hand cell below Willy's sprite is not empty
8E5E CP (HL) Is the left-hand cell below Willy's sprite empty?
8E5F JP NZ,\$8ED4 Jump if not
8E62 LD A,(\$85D1) Pick up the airborne status indicator from 85D1
8E65 CP \$01 Is Willy jumping?
8E67 JP Z,\$8FBC Jump if so
If we get here, then Willy is either in the process of falling or just about to start falling.
8E6A LD HL,\$85D0 Reset bit 1 at 85D0: Willy is not moving left or right
8E6D RES 1,(HL)
8E6F LD A,(\$85D1) Pick up the airborne status indicator from 85D1
8E72 OR A Is Willy already falling?
8E73 JP Z,\$8EB6 Jump if not
8E76 INC A Increment the airborne status indicator
8E77 CP \$10 Is it 16 now?
8E79 JR NZ,\$8E7D Jump if not
8E7B LD A,\$0C Decrease the airborne status indicator from 0x10 to 0x0C
8E7D LD (\$85D1),A Update the airborne status indicator at 85D1
8E80 RLCA D=16*A; this value determines the pitch of the falling sound effect
8E81 RLCA
8E82 RLCA
8E83 RLCA
8E84 LD D,A
8E85 LD C,\$20 This value determines the duration of the falling sound effect
8E87 LD A,(\$80DE) Pick up the border colour for the current room from 80DE
8E8A OUT (\$FE),A Make a falling sound effect
8E8C XOR \$18
8E8E LD B,D
8E8F DJNZ \$8E8F
8E91 DEC C
8E92 JR NZ,\$8E8A
8E94 LD A,(\$85CF) Add 8 to Willy's pixel y-coordinate at 85CF; this moves Willy downwards by 4 pixels
8E99 LD (\$85CF),A
This entry point is used by the routine at 91BE to update Willy's attribute buffer location when he's on a rope.
8E9C AND \$F0 L=16*Y, where Y is Willy's screen y-coordinate (0-14)
8E9E LD L,A
8E9F XOR A Clear A and the carry flag
8EA0 RL L Now L=32*(Y-8*INT(Y/8)), and the carry flag is set if Willy is in the lower half of the room (Y>=8)
8EA2 ADC A,\$5C H=0x5C or 0x5D (MSB of the address of Willy's location in the attribute buffer)
8EA4 LD H,A
8EA5 LD A,(\$85D3) Pick up Willy's screen x-coordinate (0-30) from bits 0-4 at 85D3
8EA8 AND \$1F
8EAA OR L Now L holds the LSB of Willy's attribute buffer address
8EAB LD L,A
8EAC LD (\$85D3),HL Store Willy's updated attribute buffer location at 85D3
8EAF RET
Willy has just finished a jump.
8EB0 LD A,\$06 Set the airborne status indicator at 85D1 to 0x06: Willy will continue to fall unless he's landed on a wall or floor block
8EB2 LD (\$85D1),A
8EB5 RET
Willy has just started falling.
8EB6 LD A,\$02 Set the airborne status indicator at 85D1 to 0x02
8EB8 LD (\$85D1),A
8EBB RET
The top-left or top-right cell of Willy's sprite is overlapping a wall tile.
8EBC LD A,(\$85CF) Adjust Willy's pixel y-coordinate at 85CF so that the top row of cells of his sprite is just below the wall tile