| Routines

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:
Address | Description
--- | ---
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:
Address | Description
--- | ---
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:
Address | Description
--- | ---
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)
62078 | PUSH BC | Make an indirect jump to the routine
62079 | RET