Routines |
Prev: 64B8 | Up: Map | Next: 653E |
64BD | LD HL,$6494 | The animation phase table for Sam when somersaulting is at 6494 | ||
This entry point is used by the routine at 64B8 with HL=647C.
|
||||
64C0 | PUSH HL | Save the address of the animation phase table | ||
64C1 | CALL $653E | Return to the main loop if Sam cannot roll or somersault from his current location | ||
64C4 | LD A,$08 | Set bit 3 of Sam's status flags at 7FFC | ||
64C6 | LD ($7FFC),A | |||
64C9 | POP HL | Restore the address of the animation phase table to HL | ||
64CA | LD ($E60C),HL | Copy the address of the animation phase table into bytes 0x0C and 0x0D of Sam's buffer | ||
64CD | LD HL,$E608 | Reset Sam's main action timer (in byte 0x08 of his buffer) to 6 | ||
64D0 | LD (HL),$06 | |||
64D2 | CALL $E9C8 | Update the SRB for Sam's current animatory state and location | ||
64D5 | LD HL,($E60C) | Point HL at the first byte of the current entry in the animation phase table | ||
64D8 | AND $80 | Set the zero flag if Sam is facing left | ||
64DA | LD B,A | B=0x00 if Sam is facing left, 0x80 if facing right | ||
64DB | LD A,(HL) | A=first byte of the animation phase table entry | ||
64DC | INC HL | Point HL at the second byte in the entry | ||
64DD | JR Z,$64E0 | Jump if Sam is facing left | ||
64DF | LD A,(HL) | A=second byte of the animation phase table entry | ||
64E0 | ADD A,E | Add Sam's current x-coordinate | ||
64E1 | LD E,A | E=Sam's next x-coordinate | ||
64E2 | INC HL | A=third byte of the animation phase table entry | ||
64E3 | LD A,(HL) | |||
64E4 | ADD A,D | Add Sam's current y-coordinate | ||
64E5 | LD D,A | D=Sam's next y-coordinate | ||
64E6 | INC HL | A=fourth byte of the animation phase table entry | ||
64E7 | LD A,(HL) | |||
64E8 | INC HL | Point HL at the first byte of the next entry | ||
64E9 | LD ($E60C),HL | Store this address in bytes 0x0C and 0x0D of Sam's buffer | ||
64EC | RLCA | C=Sam's next base animatory state (bit 7 reset) | ||
64ED | AND A | |||
64EE | RRA | |||
64EF | LD C,A | |||
64F0 | JR NC,$6515 | Jump unless it's time to check whether Sam has landed | ||
It's time to check whether Sam has landed on his feet yet.
|
||||
64F2 | PUSH DE | Save Sam's new coordinates briefly | ||
64F3 | AND A | Is Sam's next animatory state 0x00 or 0x80 (standing upright)? | ||
64F4 | JR Z,$64FD | Jump if so | ||
64F6 | DEC E | Subtract 1 from Sam's new x-coordinate | ||
64F7 | BIT 7,B | Is Sam facing left? | ||
64F9 | JR Z,$64FD | Jump if so | ||
64FB | INC E | Add 1 to Sam's new x-coordinate | ||
64FC | INC E | |||
64FD | CALL $EAFF | Has Sam landed on the sidewalk or the road yet? | ||
6500 | JR NC,$650A | Jump if so | ||
6502 | LD A,E | A=Sam's adjusted new x-coordinate | ||
6503 | POP DE | Restore Sam's new x-coordinate to E | ||
6504 | INC D | Add 1 to Sam's new y-coordinate (move him down a level) | ||
6505 | PUSH DE | Save Sam's adjusted new coordinates briefly | ||
6506 | LD E,A | E=Sam's adjusted new x-coordinate | ||
6507 | CALL $EAFF | Set the carry flag unless Sam has landed on the sidewalk or road | ||
650A | POP DE | Restore Sam's adjusted new y-coordinate to D, and his new x-coordinate to E | ||
650B | JR C,$6514 | Jump if Sam has not landed yet | ||
650D | LD A,C | A=Sam's next base animatory state (bit 7 reset) | ||
650E | AND A | Is it 0x00 or 0x80 (standing upright)? | ||
650F | JR NZ,$6514 | Jump if not | ||
6511 | LD ($7FFC),A | Clear all of Sam's status flags at 7FFC (Sam has landed) | ||
6514 | LD A,C | A=Sam's next base animatory state (bit 7 reset) | ||
6515 | CP $09 | Is the new base animatory state < 0x09 (meaning Sam has just started or is just finishing a roll or somersault)? | ||
6517 | JR C,$6525 | Jump if so | ||
6519 | PUSH BC | Save Sam's direction indicator and next base animatory state | ||
651A | PUSH DE | Save Sam's next x- and y-coordinates | ||
651B | CP $0F | Is the new base animatory state 0x0F (meaning Sam is going to rotate 90 degrees for the first part of the roll or somersault)? | ||
651D | CALL Z,$6412 | If so, prepare sprite tiles 0xEF-0xF7 for this animatory state | ||
6520 | CALL NZ,$6448 | Otherwise, rotate sprite tiles 0xEF-0xF7 for animatory state 0x09, 0x1F or 0x0A | ||
6523 | POP DE | Restore Sam's next x- and y-coordinates to E and D | ||
6524 | POP BC | Restore Sam's direction indicator and next base animatory state to B and C | ||
6525 | LD H,$E6 | 0xE6=Sam | ||
6527 | LD A,B | A=Sam's new animatory state | ||
6528 | OR C | |||
6529 | CALL $E9D5 | Update Sam's animatory state and location and update the SRB | ||
652C | LD A,($7FFC) | Collect Sam's status flags from 7FFC | ||
652F | AND A | Has Sam landed yet? | ||
6530 | RET NZ | Return if not | ||
6531 | CALL $EC69 | Make a sound effect | ||
6534 | LD L,$0C | Point HL at byte 0x0C of Sam's buffer | ||
6536 | CALL $63C3 | Check whether Sam has somersaulted onto a banknote | ||
6539 | LD H,$E6 | 0xE6=Sam | ||
653B | JP $EC83 | Now that Sam has landed, scroll the screen left or right if necessary |
Prev: 64B8 | Up: Map | Next: 653E |