Routines
 Prev: 61923 Up: Map Next: 62080
61948: Move the characters
Called from the main loop at 61483.
61948 LD HL,32674 The blown fuse delay counters are stored at 32674
61951 LD B,5 Set A to a non-zero value if any of the fuses are currently blown
61953 LD A,(HL)
61954 INC L
61955 OR (HL)
61956 DJNZ 61954
61958 LD (32692),A Store this value at 32692
61961 CALL 61967 Move one character
61964 CALL 61967 Move the next character
61967 LD HL,32763 32763 holds the number of the character just moved
61970 INC (HL) Increment this
61971 LD A,(HL) A=number of the character to move next
61972 CP 230 Is it Sam?
61974 JR NZ,61979 Jump if not
61976 LD A,215 Rewind to character 215 (we don't want to move Sam)
61978 LD (HL),A Store the number of the character to be moved next
61979 LD H,A H=number of the character to move next (215-229)
First check whether the character is immobilised by a blown fuse.
61980 LD A,(32692) Collect the blown fuse indicator from 32692
61983 AND A Are any fuses currently blown?
61984 CALL NZ,29004 If so, check to see whether the character is immobilised by a blown fuse
61987 RET C Return if the character is immobilised
Now to determine whether to move the character this time round. The answer will be yes if bit 7 of byte 3 of the character's buffer is set (indicating that he is running), or if bit 6 of byte 3 (which is flipped on each pass through this routine) is set.
61988 LD L,3 Point HL at byte 3 of the character's buffer
61990 BIT 7,(HL) Is the character running?
61992 JR NZ,62001 Jump if so
61994 LD A,(HL) Flip bit 6 of byte 3 of the character's buffer
61995 XOR 64
61997 LD (HL),A
61998 AND 64 Is bit 6 set now?
62000 RET Z Return if not
The character will be moved. From this point, the following steps are taken:
Step Action
1 If there is an uninterruptible subcommand routine address in bytes 18 and 19 of the character's buffer, jump to it
2 If there is a continual subcommand routine address in bytes 27 and 28 of the character's buffer - which there never is - call it (and then return to step 3)
3 If there is an interruptible subcommand routine address in bytes 14 and 15 of the character's buffer, jump to it
4 Restart the command list if bit 4 of byte 3 of the character's buffer is set (and carry on to step 5)
5 If there is a primary command routine address in bytes 8 and 9 of the character's buffer, jump to it
6 Remove any continual subcommand routine address from bytes 27 and 28 of the character's buffer
7 Collect the next primary command routine address from the command list, place it into bytes 8 and 9 of the character's buffer, and jump to it
The address of one of the following uninterruptible subcommand routines (or an entry point thereof) may be present in bytes 18 and 19 of the character's buffer:
31670 Control the hook while it's flying
64005 Deal with a character who has been knocked over
64131 Deal with a character who has nearly recovered from being knocked over
64331 Control a character who has stepped off the roof of a building
The address of one of the following interruptible subcommand routines (or an entry point thereof) may be present in bytes 14 and 15 of the character's buffer:
25118 Control the sniper while active
31319 Make a gangster walk up or down until Sam arrives
62278 Control a character who is knocking on or opening a door (1)
62297 Control a character who has knocked on a door and is waiting for an answer
62339 Control a character who is knocking on or opening a door (3)
62892 Guide a character up or down staircases
62926 Guide a character across a floor to his destination
62971 Guide a character from one spot on the sidewalk or road to another
63209 Make a character walk up or down
63558 Make a cat run up or down
The address of one of the following primary command routines (or an entry point thereof) may be present in bytes 8 and 9 of the character's buffer:
24925 Reset a gangster's location and restart the command list
25081 Make the gangster at no. 15 lie in wait for Sam
25307 Control the sniper
25385 Make a gangster chase Sam
25420 Control a banknote
29354 Control a policeman (1)
29361 Control a policeman (2)
31338 Make a gangster walk up and down while watching for Sam
31594 Let Sam out of jail if necessary
59147 Do nothing
62976 Make a character go to a location
63198 Restart the command list
63281 Make a character drop Sam
63304 Make a character walk up and down until somebody knocks on a door
63423 Make a character open a door that has been knocked on
63520 Make a character walk up and down for a while
63530 Control a cat
62001 LD L,19 Is there an uninterruptible subcommand routine address in bytes 18 and 19 of the character's buffer?
62003 LD A,(HL)
62004 AND A
62005 JR NZ,62075 Jump if so
62007 LD A,H A=number of the character being moved (215-229)
62008 CP 222 Does the character belong to one of the character groups 215-221?
62010 JR C,62029 Jump if so
We're dealing with one of the primary characters (222-229). Here we check whether there is a continual subcommand routine address in bytes 27 and 28 of the character's buffer. The answer is always no.
62012 LD L,28 Byte 28 is unused and always holds 0
62014 LD A,(HL)
62015 AND A
62016 JR Z,62029 This jump is always made
62018 PUSH HL Save the character number
62019 LD BC,62028 We will return to 62028 (below) after calling the subcommand routine
62022 PUSH BC
62023 LD B,A Collect the continual subcommand routine address into BC
62024 DEC L
62025 LD C,(HL)
62026 PUSH BC Push it onto the stack
62027 RET Call the continual subcommand routine and then return to 62028 (below)
62028 POP HL Restore the character number to H
This entry point is used by the routine at 62080.
62029 LD L,15 Is there an interruptible subcommand routine address in bytes 14 and 15 of the character's buffer?
62031 LD A,(HL)
62032 AND A
62033 JR NZ,62075 Jump if so
Bit 4 of byte 3 of the character's buffer is never set, but if it were, it would mean that the character's command list should be restarted. Check bit 4 of byte 3 now.
62035 LD L,3 Bit 4 of byte 3 is unused and always reset
62037 BIT 4,(HL)
62039 JR Z,62055 This jump is always made
62041 RES 4,(HL) Reset bit 4 of byte 3
62043 LD L,26 Copy the command list address from bytes 25 and 26 of the character's buffer into bytes 23 and 24
62045 LD D,H
62046 LD E,24
62048 LDD
62050 LDD
62052 LD (DE),A Set byte 22 of the character's buffer (which holds the offset reached in the command list) to 0
62053 JR 62061
Now we look for a primary command routine address.
62055 LD L,9 Is there a primary command routine address in bytes 8 and 9 of the character's buffer?
62057 LD A,(HL)
62058 AND A
62059 JR NZ,62075 Jump if so
62061 LD A,H A=number of the character being moved (215-229)
62062 CP 222 Does the character belong to one of the character groups 215-221?
62064 JR C,62070 Jump if so
62066 LD L,28 Remove any continual subcommand routine address from bytes 27 and 28 of the character's buffer
62068 LD (HL),0
62070 LD L,8 Copy the next primary command routine address from the command list into bytes 8 and 9 of the character's buffer
62072 CALL 61809
62075 LD B,(HL) Copy the address of the primary command or subcommand routine into BC
62076 DEC L
62077 LD C,(HL)