| Routines

62483: Collect a keypress during the game (or simulate one in demo mode)

Called from the main loop at 63210. Returns with A holding the offset from the keypress table corresponding to the last (actual or simulated) keypress, or 0 if there was no (actual or simulated) keypress.
62483 | LD A,(32734) | A=255 if we're in demo mode, 0 otherwise
62486 | INC A | Are we in demo mode?
62487 | JP NZ,29178 | Read the keyboard if not
We're in demo mode.
62490 | LD HL,0 | Set the score (held at 32741) and the number of lines (held at 32743) to 0
62493 | LD (32741),HL
62496 | LD (32743),HL
62499 | CALL 29118 | Check for keypresses
62502 | JP NZ,63189 | Start a new game if there was one
No keys have been pressed, so figure out ERIC's next move by seeing what little boy no. 10 is doing.
62505 | LD DE,(50945) | Pick up the coordinates of little boy no. 10 in DE
62509 | LD H,210 | 210=ERIC
62511 | CALL 25843 | Compare the coordinates of ERIC and little boy no. 10
62514 | AND A | Are they the same?
62515 | JR Z,62533 | Jump if so
62517 | DEC A | Now A=0 (ERIC is on a staircase facing up), 1 (on a staircase facing down), 2 (to the right of little boy no. 10), or 3 (to his left)
62518 | LD HL,23672 | Point HL at the LSB of the system variable FRAMES
62521 | XOR 2 | Flip bit 1 of A
Now A holds a value that will be translated into a simulated keypress depending on ERIC's location:
A | ERIC's location | Keypress
--- | --- | ---
0 | To the right of little boy no. 10 | Left
1 | To the left of little boy no. 10 | Right
2 | On a staircase, facing up | Up
3 | On a staircase, facing down | Down
62523 | BIT 7,(HL) | Is the LSB of FRAMES < 128?
62525 | JR Z,62529 | Jump if so: this will be an upper case (fast) keypress
62527 | ADD A,4 | 4<=A<=7: force a lower case (slow) keypress
62529 | ADD A,A | A=80+2n where 0<=n<=7 (simulated keypress for LEFT, RIGHT, UP, DOWN or left, right, up, down)
62530 | ADD A,80
62532 | RET |
ERIC's coordinates match those of little boy no. 10 exactly.
62533 | LD A,(50944) | A=animatory state of little boy no. 10
62536 | CP 68 | 68: little boy sitting in a chair
62538 | LD HL,53760 | Point HL at byte 0 of ERIC's buffer
62541 | JR Z,62549 | Jump if little boy no. 10 is sitting in a chair
62543 | CP 197 | 197: Is little boy no. 10 sitting on the floor facing right (as in assembly)?
62545 | JR Z,62549 | Jump if so
62547 | XOR A | No simulated keypress (ERIC stays still)
62548 | RET |
Little boy no. 10 is sitting in a chair or sitting on the floor facing right (as in assembly), and ERIC is standing. Make ERIC face the same way and sit too (in the same spot as little boy no. 10).
62549 | XOR (HL) | Set the carry flag if ERIC and little boy no. 10 are facing in opposite directions
62550 | RLCA
62551 | LD A,98 | 98=keypress code for 'S' (sit)
62553 | RET NC | Return if ERIC and little boy no. 10 are facing the same way
62554 | LD A,(HL) | A=ERIC's animatory state
62555 | RLCA | Set A to 1 if ERIC is facing left (leading to a simulated keypress code of 82, or RIGHT), 0 if he's facing right (leading to a simulated keypress code of 80, or LEFT); that is, make ERIC turn round
62556 | SBC A,A
62557 | INC A
62558 | JR 62529