Prev: 36288 Up: Map Next: 36564
36307: Move Willy (1)
Used by the routine at 35245. This routine deals with Willy if he's jumping or falling.
36307 LD A,(34262) Pick up the rope status indicator from 34262
36310 DEC A Is Willy on a rope?
36311 BIT 7,A
36313 JP Z,36564 Jump if so
36316 LD A,(34257) Pick up the airborne status indicator from 34257
36319 CP 1 Is Willy jumping?
36321 JR NZ,36406 Jump if not
Willy is currently jumping.
36323 LD A,(34261) Pick up the jumping animation counter (0-17) from 34261
36326 AND 254 Discard bit 0
36328 SUB 8 Now -8<=A<=8 (and A is even)
36330 LD HL,34255 Adjust Willy's y-coordinate at 34255 depending on where Willy is in the jump
36333 ADD A,(HL)
36334 LD (HL),A
36335 CP 240 Is the new value negative (above the top of the screen)?
36337 JP NC,38064 If so, move Willy into the room above
36340 CALL 36508 Adjust Willy's attribute buffer location at 34259 depending on his y-coordinate
36343 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
36346 CP (HL) Is the top-left cell of Willy's sprite overlapping a wall tile?
36347 JP Z,36540 Jump if so
36350 INC HL Point HL at the top-right cell occupied by Willy's sprite
36351 CP (HL) Is the top-right cell of Willy's sprite overlapping a wall tile?
36352 JP Z,36540 Jump if so
36355 LD A,(34261) Increment the jumping animation counter at 34261
36358 INC A
36359 LD (34261),A
36362 SUB 8 A=J-8, where J (1-18) is the new value of the jumping animation counter
36364 JP P,36369 Jump if J>=8
36367 NEG A=8-J (1<=J<=7, 1<=A<=7)
36369 INC A A=1+ABS(J-8)
36370 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)
36371 RLCA
36372 RLCA
36373 LD D,A
36374 LD C,32 This value determines the duration of the jumping sound effect
36376 LD A,(32990) Pick up the border colour for the current room from 32990
36379 OUT (254),A Make a jumping sound effect
36381 XOR 24
36383 LD B,D
36384 DJNZ 36384
36386 DEC C
36387 JR NZ,36379
36389 LD A,(34261) Pick up the jumping animation counter (1-18) from 34261
36392 CP 18 Has Willy reached the end of the jump?
36394 JP Z,36528 Jump if so
36397 CP 16 Is the jumping animation counter now 16?
36399 JR Z,36406 Jump if so
36401 CP 13 Is the jumping animation counter now 13?
36403 JP NZ,36796 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).
36406 LD A,(34255) Pick up Willy's y-coordinate from 34255
36409 AND 14 Is Willy either on a ramp, or occupying only four cells?
36411 JR NZ,36450 Jump if not
36413 LD HL,(34259) Pick up Willy's attribute buffer coordinates from 34259
36416 LD DE,64 Point HL at the left-hand cell below Willy's sprite
36419 ADD HL,DE
36420 BIT 1,H Is this location below the floor of the current room?
36422 JP NZ,38098 If so, move Willy into the room below
36425 LD A,(32955) Pick up the attribute byte of the nasty tile for the current room from 32955
36428 CP (HL) Does the left-hand cell below Willy's sprite contain a nasty?
36429 JR Z,36450 Jump if so
36431 INC HL Point HL at the right-hand cell below Willy's sprite
36432 LD A,(32955) Pick up the attribute byte of the nasty tile for the current room from 32955 (again, redundantly)
36435 CP (HL) Does the right-hand cell below Willy's sprite contain a nasty?
36436 JR Z,36450 Jump if so
36438 LD A,(32928) Pick up the attribute byte of the background tile for the current room from 32928
36441 CP (HL) Set the zero flag if the right-hand cell below Willy's sprite is empty
36442 DEC HL Point HL at the left-hand cell below Willy's sprite
36443 JP NZ,36564 Jump if the right-hand cell below Willy's sprite is not empty
36446 CP (HL) Is the left-hand cell below Willy's sprite empty?
36447 JP NZ,36564 Jump if not
36450 LD A,(34257) Pick up the airborne status indicator from 34257
36453 CP 1 Is Willy jumping?
36455 JP Z,36796 Jump if so
If we get here, then Willy is either in the process of falling or just about to start falling.
36458 LD HL,34256 Reset bit 1 at 34256: Willy is not moving left or right
36461 RES 1,(HL)
36463 LD A,(34257) Pick up the airborne status indicator from 34257
36466 OR A Is Willy already falling?
36467 JP Z,36534 Jump if not
36470 INC A Increment the airborne status indicator
36471 CP 16 Is it 16 now?
36473 JR NZ,36477 Jump if not
36475 LD A,12 Decrease the airborne status indicator from 16 to 12
36477 LD (34257),A Update the airborne status indicator at 34257
36480 RLCA D=16*A; this value determines the pitch of the falling sound effect
36481 RLCA
36482 RLCA
36483 RLCA
36484 LD D,A
36485 LD C,32 This value determines the duration of the falling sound effect
36487 LD A,(32990) Pick up the border colour for the current room from 32990
36490 OUT (254),A Make a falling sound effect
36492 XOR 24
36494 LD B,D
36495 DJNZ 36495
36497 DEC C
36498 JR NZ,36490
36500 LD A,(34255) Add 8 to Willy's y-coordinate at 34255; this moves Willy downwards by 4 pixels
36503 ADD A,8
36505 LD (34255),A
This entry point is used by the routine at 37310 to update Willy's attribute buffer location when he's on a rope.
36508 AND 240 L=16*Y, where Y is Willy's screen y-coordinate (0-14)
36510 LD L,A
36511 XOR A Clear A and the carry flag
36512 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)
36514 ADC A,92 H=92 or 93 (MSB of the address of Willy's location in the attribute buffer)
36516 LD H,A
36517 LD A,(34259) Pick up Willy's screen x-coordinate (0-30) from bits 0-4 at 34259
36520 AND 31
36522 OR L Now L holds the LSB of Willy's attribute buffer address
36523 LD L,A
36524 LD (34259),HL Store Willy's updated attribute buffer location at 34259
36527 RET
Willy has just finished a jump.
36528 LD A,6 Set the airborne status indicator at 34257 to 6: Willy will continue to fall unless he's landed on a wall or floor block
36530 LD (34257),A
36533 RET
Willy has just started falling.
36534 LD A,2 Set the airborne status indicator at 34257 to 2
36536 LD (34257),A
36539 RET
The top-left or top-right cell of Willy's sprite is overlapping a wall tile.
36540 LD A,(34255) Adjust Willy's y-coordinate at 34255 so that the top row of cells of his sprite is just below the wall tile
36543 ADD A,16
36545 AND 240
36547 LD (34255),A
36550 CALL 36508 Adjust Willy's attribute buffer location at 34259 to account for this new y-coordinate
36553 LD A,2 Set the airborne status indicator at 34257 to 2: Willy has started falling
36555 LD (34257),A
36558 LD HL,34256 Reset bit 1 at 34256: Willy is not moving left or right
36561 RES 1,(HL)
36563 RET
Prev: 36288 Up: Map Next: 36564