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 |