![]() |
Routines |
| Prev: 36288 | Up: Map | Next: 36564 |
|
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 |