Prev: $0C31 Up: Map Next: $0D67
$0C3F: Make a character track down ERIC
The address of this interruptible subcommand routine is placed into a character's buffer by the routines at $0B3B and $2A99.
$0C3F LDA $3F Set bit 6 of the flags byte at $3F: the character is running.
$0C41 ORA #$40
$0C43 STA $3F
$0C45 JSR $1EC2 Get ERIC's coordinates.
$0C48 STX $08 Save ERIC's coordinates at $08 and $09.
$0C4A STY $09
$0C4C JSR $1C8E Is the character on a staircase?
$0C4F BCS $0C94 Branch if so.
$0C51 LDA $FB Pick up the character's y-coordinate from $FB.
$0C53 CMP $09 Is ERIC's y-coordinate less than the character's?
$0C55 BCS $0C63 Branch if so.
$0C57 LDA $09 Pick up ERIC's y-coordinate from $09.
$0C59 SEC Subtract the character's y-coordinate from ERIC's y-coordinate.
$0C5A SBC $FB
$0C5C CMP #$04 Is ERIC within 4 y-coordinates of the character?
$0C5E BCS $0C94 Branch if not.
$0C60 JMP $0C6A Jump forward.
$0C63 SEC Subtract ERIC's y-coordinate from the character's y-coordinate.
$0C64 SBC $09
$0C66 CMP #$04 Is ERIC within 4 y-coordinates of the character?
$0C68 BCS $0C94 Branch if not.
ERIC and the character looking for him are less than 4 y-coordinates away from each other.
$0C6A LDA $26 Pick up the character's animatory state from $26.
$0C6C ASL A Is he facing right?
$0C6D BCS $0C81 Branch if so.
$0C6F LDA $FC Pick up the character's x-coordinate from $FC.
$0C71 CMP $08 Is ERIC's x-coordinate greater than the character's?
$0C73 BCC $0C94 Branch if so (ERIC is behind the character).
$0C75 LDA $08 Pick up ERIC's x-coordinate from $08.
$0C77 CLC Add 3 to ERIC's x-coordinate.
$0C78 ADC #$03
$0C7A CMP $FC Is ERIC within 3 x-coordinates in front of the character?
$0C7C BCC $0C94 Branch if not.
$0C7E JMP $0C90 Jump forward.
$0C81 LDA $FC Pick up the character's x-coordinate from $FC.
$0C83 CMP $08 Is ERIC's x-coordinate greater than the character's?
$0C85 BCS $0C94 Branch if not (ERIC is behind the character).
$0C87 LDA $08 Pick up ERIC's x-coordinate from $08.
$0C89 SEC Subtract 4 from ERIC's x-coordinate.
$0C8A SBC #$04
$0C8C CMP $FC Is ERIC within 4 x-coordinates in front of the character?
$0C8E BCS $0C94 Branch if not.
The character has found ERIC and is facing him.
$0C90 SEC Set the carry flag to indicate that the lesson clock can be restarted.
$0C91 JMP ($00AE) Jump to $0C31 (with the carry flag set) or $2745.
ERIC and the character looking for him are 4 or more y-coordinates away from each other.
$0C94 LDA #$14 Store ERIC's character number ($14) at $4D for the following subroutine call.
$0C96 STA $4D
$0C98 JSR $1B2E Determine the next move of the character in his search for ERIC and store its identifier at $77.
$0C9B STA $77
$0C9D JSR $322E Update the SRB for the character's current animatory state and location.
$0CA0 LDA $77 Pick up the next move identifier from $77.
$0CA2 BNE $0CA7 Branch if there is a move to be made.
$0CA4 JMP $0D66 Otherwise return.
$0CA7 CMP #$03 Should the character go left?
$0CA9 BNE $0CDE Branch if not.
The character looking for ERIC should go left.
$0CAB LDA $26 Pick up the character's animatory state from $26.
$0CAD ASL A Is the character facing left?
$0CAE BCC $0CC4 Branch if so.
$0CB0 LDA $26 Flip bit 7 of the character's animatory state, thus turning him round.
$0CB2 EOR #$80
$0CB4 STA $26
$0CB6 JSR $322E Update the SRB for the character's current animatory state and location.
$0CB9 JSR $1C8E Is the character on a staircase?
$0CBC BCC $0CC1 Branch if not.
$0CBE JMP $0D66 Otherwise return.
$0CC1 JMP ($00AE) Jump to $0C31 (with the carry flag clear) or $2745.
$0CC4 LDA $FC Pick up the character's x-coordinate from $FC, subtract 1 from it and store the result at $AC.
$0CC6 STA $AC
$0CC8 DEC $AC
$0CCA LDA $FB Pick up the character's y-coordinate from $FB and store it at $AD.
$0CCC STA $AD
$0CCE INC $26 Increment the character's animatory state.
$0CD0 LDA #$0D Replace the address of this interruptible subcommand routine in the character's buffer with that of $0D40 (below).
$0CD2 STA $AB
$0CD4 LDA #$40
$0CD6 STA $AA
$0CD8 JSR $322E Update the SRB for the character's new animatory state.
$0CDB JMP $0D66 Return.
$0CDE CMP #$04 Should the character go right?
$0CE0 BNE $0CF0 Branch if not.
The character looking for ERIC should go right.
$0CE2 LDA $26 Pick up the character's animatory state from $26.
$0CE4 ASL A Is the character facing left?
$0CE5 BCC $0CB0 Branch if so to turn him round.
$0CE7 LDA $FC Pick up the character's x-coordinate from $FC, add 1 to it and store the result at $AC.
$0CE9 STA $AC
$0CEB INC $AC
$0CED JMP $0CCA Jump back to move the character midstride.
$0CF0 CMP #$01 Should the character start or continue going upstairs?
$0CF2 BNE $0D22 Branch if not.
The character looking for ERIC should start or continue going upstairs.
$0CF4 LDA $FC Pick up the character's x-coordinate from $FC.
$0CF6 CMP #$30 Is it 48 or more (on the right-hand side of the skool)?
$0CF8 BCS $0D03 Branch if so.
$0CFA LDA $26 Reset bit 7 of the character's animatory state at $26, thus making him face left.
$0CFC AND #$7F
$0CFE STA $26
$0D00 JMP $0D09 Jump forward.
$0D03 LDA $26 Set bit 7 of the character's animatory state at $26, thus making him face right.
$0D05 ORA #$80
$0D07 STA $26
$0D09 DEC $FB Decrement the character's y-coordinate at $FB.
$0D0B LDA $FB Pick up this new y-coordinate and store it at $AD.
$0D0D STA $AD
$0D0F LDA $FC Pick up the character's x-coordinate from $FC and store it at $AC.
$0D11 STA $AC
$0D13 LDA $26 Pick up the character's animatory state from $26.
$0D15 ASL A Is the character facing left?
$0D16 BCC $0D1D Branch if so.
$0D18 INC $AC Increment the x-coordinate at $AC.
$0D1A JMP $0CCE Jump back.
$0D1D DEC $AC Decrement the x-coordinate at $AC.
$0D1F JMP $0CCE Jump back to move the character midstride.
The character looking for ERIC should start or continue going downstairs.
$0D22 LDA $FC Pick up the character's x-coordinate from $FC.
$0D24 CMP #$30 Is it 48 or more (on the right-hand side of the skool)?
$0D26 BCS $0D31 Branch if so.
$0D28 LDA $26 Set bit 7 of the character's animatory state at $26, thus making him face right.
$0D2A ORA #$80
$0D2C STA $26
$0D2E JMP $0D37 Jump forward.
$0D31 LDA $26 Reset bit 7 of the character's animatory state at $26, thus making him face left.
$0D33 AND #$7F
$0D35 STA $26
$0D37 INC $FB Increment the character's y-coordinate at $FB.
$0D39 LDA $FB Pick up this new y-coordinate and store it at $AD.
$0D3B STA $AD
$0D3D JMP $0D0F Jump back to compute the character's next x-coordinate.
The address of this entry point is placed into the character's buffer at $0CD0 above. It takes care of moving the character looking for ERIC from the midstride position.
$0D40 LDA #$0C Replace the address of this entry point in the character's buffer with that of the main entry point at $0C3F.
$0D42 STA $AB
$0D44 LDA #$3F
$0D46 STA $AA
$0D48 JSR $322E Update the SRB for the character's current animatory state and location.
$0D4B LDA $AC Pick up the character's next x-coordinate from $AC.
$0D4D STA $FC Update the character's x-coordinate at $FC.
$0D4F LDA $AD Pick up the character's next y-coordinate from $AD.
$0D51 STA $FB Update the character's y-coordinate at $FB.
$0D53 LDA $26 Pick up the character's animatory state from $26, clear bits 0-2, and store the result at $57.
$0D55 AND #$F8
$0D57 STA $57
$0D59 LDA $FC Pick up the character's new x-coordinate from $FC.
$0D5B AND #$01 Adjust the character's animatory state depending on whether the new x-coordinate is even or odd.
$0D5D ASL A
$0D5E CLC
$0D5F ADC $57
$0D61 STA $26
$0D63 JMP $0CB6 Jump back.
$0D66 RTS
Prev: $0C31 Up: Map Next: $0D67