![]() |
Routines |
Prev: 36288 | Up: Map |
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 pixel 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 pixel 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 | 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 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 pixel y-coordinate from 34255 | |||||
36409 | AND 14 | Does Willy's sprite occupy six cells at the moment? | |||||
36411 | JR NZ,36450 | Jump if so | |||||
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 | 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 pixel 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-5 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 pixel 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 pixel 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 |