![]() |
Routines |
| Prev: FB4B | Up: Map | Next: FC00 |
|
Used by the routine at EBBB. On entry, B holds the value of the third byte of the character's location descriptor (see EB13), which indicates the set of locations the character's current location belongs to:
|
|||||||||||||||||||||||||||
| FB52 | CALL $FC00 | Deal with the case where B=2 and the character is standing on the edge of the roof of no. 17 or the apartment building next to no. 19 | |||||||||||||||||||||||||
|
This entry point is used by the routine at 7AF4 with H=0xE6 (Sam) and B=1.
|
|||||||||||||||||||||||||||
| FB55 | LD L,$0D | Initialise byte 0x0D of the character's buffer to 0 on the assumption that he will land safely | |||||||||||||||||||||||||
| FB57 | LD (HL),$00 | ||||||||||||||||||||||||||
| FB59 | BIT 0,B | Does B=2, 4 or 6 (in which case the character will definitely land safely)? | |||||||||||||||||||||||||
| FB5B | JR Z,$FB62 | Jump if so | |||||||||||||||||||||||||
| FB5D | LD A,H | A=character number | |||||||||||||||||||||||||
| FB5E | CP $E6 | Are we dealing with Sam? | |||||||||||||||||||||||||
| FB60 | RET NZ | Return if not (characters other than Sam don't attempt dangerous leaps from the roofs of tall buildings) | |||||||||||||||||||||||||
| FB61 | INC (HL) | Set byte 0x0D of Sam's buffer to 1 to indicate that he's stepping off or being dropped off the roof of a building from a great enough height that he could be knocked out when he lands (B=1, 3 or 5) | |||||||||||||||||||||||||
| FB62 | DEC B | Are we dealing with Sam being dropped off the roof of a building? | |||||||||||||||||||||||||
| FB63 | JR Z,$FB70 | Jump if so | |||||||||||||||||||||||||
| FB65 | LD A,B | Point DE at the appropriate landing y-coordinate in the data table at FB46 | |||||||||||||||||||||||||
| FB66 | ADD A,$45 | ||||||||||||||||||||||||||
| FB68 | LD E,A | ||||||||||||||||||||||||||
| FB69 | LD D,$FB | ||||||||||||||||||||||||||
| FB6B | LD A,(DE) | Collect the landing y-coordinate in A | |||||||||||||||||||||||||
| FB6C | LD B,$07 | Prepare to initialise byte 0x14 of the character's buffer to 7 | |||||||||||||||||||||||||
| FB6E | JR $FB79 | ||||||||||||||||||||||||||
|
We are dealing with Sam being dropped off the roof of a building.
|
|||||||||||||||||||||||||||
| FB70 | LD L,$01 | A=Sam's x-coordinate | |||||||||||||||||||||||||
| FB72 | LD A,(HL) | ||||||||||||||||||||||||||
| FB73 | CALL $EB05 | Set the carry flag if there is no sidewalk beneath Sam | |||||||||||||||||||||||||
| FB76 | LD A,$22 | A=34 if Sam is above the sidewalk, 35 if he's above the road | |||||||||||||||||||||||||
| FB78 | ADC A,B | ||||||||||||||||||||||||||
|
At this point A holds the character's landing y-coordinate, and B holds 0 (if the character is Sam and he's been dropped from the roof of a building) or 7 (if the character is voluntarily stepping off the roof).
|
|||||||||||||||||||||||||||
| FB79 | LD L,$14 | Set byte 0x14 of the character's buffer to 0 or 7 | |||||||||||||||||||||||||
| FB7B | LD (HL),B | ||||||||||||||||||||||||||
| FB7C | INC L | Store the character's landing y-coordinate in byte 0x15 of his buffer | |||||||||||||||||||||||||
| FB7D | LD (HL),A | ||||||||||||||||||||||||||
| FB7E | LD A,H | A=character number | |||||||||||||||||||||||||
| FB7F | CP $E6 | Are we dealing with Sam? | |||||||||||||||||||||||||
| FB81 | JR Z,$FB8E | Jump if so | |||||||||||||||||||||||||
| FB83 | LD L,$0F | Remove the address of any interruptible subcommand routine from bytes 0x0E and 0x0F of the character's buffer | |||||||||||||||||||||||||
| FB85 | LD (HL),$00 | ||||||||||||||||||||||||||
| FB87 | LD BC,$FB4B | Set the character's uninterruptible subcommand routine to FB4B and jump to it now | |||||||||||||||||||||||||
| FB8A | PUSH BC | ||||||||||||||||||||||||||
| FB8B | JP $F9ED | ||||||||||||||||||||||||||
|
The remainder of this routine deals with Sam's descent from the roof of the building (either to the ground or to the roof of the neighbouring building).
|
|||||||||||||||||||||||||||
| FB8E | LD A,$80 | Set bit 7 of Sam's status flags at 7FFC, indicating that he's falling from the roof of a building | |||||||||||||||||||||||||
| FB90 | LD ($7FFC),A | ||||||||||||||||||||||||||
| FB93 | CALL $EC69 | Make a sound effect | |||||||||||||||||||||||||
| FB96 | LD L,$14 | Collect byte 0x14 of Sam's buffer | |||||||||||||||||||||||||
| FB98 | LD A,(HL) | ||||||||||||||||||||||||||
| FB99 | AND A | Is Sam falling straight downwards now? | |||||||||||||||||||||||||
| FB9A | JR NZ,$FB9D | Jump if not | |||||||||||||||||||||||||
| FB9C | INC A | A=1 | |||||||||||||||||||||||||
| FB9D | LD L,$08 | Set Sam's main action timer (in byte 0x08 of his buffer) to 1 if he's falling straight downwards now, or to the value of byte 0x14 of his buffer (1-7) if he's still moving left or right at the beginning of his descent | |||||||||||||||||||||||||
| FB9F | LD (HL),A | ||||||||||||||||||||||||||
| FBA0 | CALL $FAE3 | Move Sam to the next point in his descent | |||||||||||||||||||||||||
| FBA3 | JP C,$EC83 | Scroll the screen if necessary if Sam is still falling | |||||||||||||||||||||||||
| FBA6 | LD HL,$0000 | Set Sam's post-midstride y-coordinate (in byte 0x07 of his buffer) to 0 to indicate that he is neither midstride nor mid-action, and his main action timer (in byte 0x08) to 0 to indicate to the routine at 74D8 that Sam has finished falling | |||||||||||||||||||||||||
| FBA9 | LD ($E607),HL | ||||||||||||||||||||||||||
| FBAC | RET Z | Return if Sam landed safely (without being knocked out) | |||||||||||||||||||||||||
|
Sam has landed, and been knocked out by the fall.
|
|||||||||||||||||||||||||||
| FBAD | CALL $EA80 | Update the display | |||||||||||||||||||||||||
| FBB0 | CALL $FC6A | Scroll the screen up and down a row 7 times (with accompanying sound effects) | |||||||||||||||||||||||||
| FBB3 | LD H,$E6 | 0xE6=Sam | |||||||||||||||||||||||||
| FBB5 | CALL $EB8C | Make Sam stand up | |||||||||||||||||||||||||
| FBB8 | CALL $FC57 | Hide the play area and clear the SRB | |||||||||||||||||||||||||
| FBBB | CALL $F17F | Get a random number between 0x32 and 0x39 (ASCII codes for the digits 2-9) in A | |||||||||||||||||||||||||
| FBBE | AND $07 | ||||||||||||||||||||||||||
| FBC0 | ADD A,$32 | ||||||||||||||||||||||||||
| FBC2 | LD ($7FD0),A | Store this at 7FD0 | |||||||||||||||||||||||||
| FBC5 | SUB $30 | A=N/10 (where N is the number of bucks Sam lost) | |||||||||||||||||||||||||
| FBC7 | CALL $6E87 | Adjust Sam's cash supply and print the new amount | |||||||||||||||||||||||||
| FBCA | LD A,$23 | Message 0x23: ' WHEN I CAME TO MY WALLET WAS GONE...' | |||||||||||||||||||||||||
| FBCC | JP Z,$7AD5 | Queue this message and show the ending cutscene if Sam has run out of money | |||||||||||||||||||||||||
| FBCF | INC A | A=0x24: ' WHEN I CAME TO SOMEONE HAD TAKEN ${tens digit}0' | |||||||||||||||||||||||||
| FBD0 | CALL $6EC5 | Queue this message | |||||||||||||||||||||||||
| FBD3 | CALL $7CD8 | Take the hook and budgie from Sam (if he has them) | |||||||||||||||||||||||||
|
Now we reveal the play area one row of tiles at a time from the bottom up, with accompanying sound effects.
|
|||||||||||||||||||||||||||
| FBD6 | LD HL,$7F60 | Point HL at one byte past the end of the screen refresh buffer (SRB), which is currently clear | |||||||||||||||||||||||||
| FBD9 | LD C,$14 | There are 20 rows of the screen to reveal | |||||||||||||||||||||||||
| FBDB | LD B,$04 | Set every bit in a group of 4 bytes of the SRB, corresponding to one row of the screen | |||||||||||||||||||||||||
| FBDD | DEC L | ||||||||||||||||||||||||||
| FBDE | LD (HL),$FF | ||||||||||||||||||||||||||
| FBE0 | DJNZ $FBDD | ||||||||||||||||||||||||||
| FBE2 | PUSH BC | Save the screen row counter (in C) | |||||||||||||||||||||||||
| FBE3 | PUSH HL | Save the SRB pointer | |||||||||||||||||||||||||
| FBE4 | LD A,$64 | E=0x64-L (where L is the LSB of the SRB address); this value determines the pitch of the sound effect | |||||||||||||||||||||||||
| FBE6 | SUB L | ||||||||||||||||||||||||||
| FBE7 | LD E,A | ||||||||||||||||||||||||||
| FBE8 | LD A,C | Multiply C (the screen row counter) by 8; this value determines the duration of the sound effect, and the border colour (0=black) | |||||||||||||||||||||||||
| FBE9 | ADD A,A | ||||||||||||||||||||||||||
| FBEA | ADD A,A | ||||||||||||||||||||||||||
| FBEB | ADD A,A | ||||||||||||||||||||||||||
| FBEC | LD C,A | ||||||||||||||||||||||||||
| FBED | XOR $10 | Make a sound effect with pitch and duration determined by the row of the screen that is being revealed | |||||||||||||||||||||||||
| FBEF | OUT ($FE),A | ||||||||||||||||||||||||||
| FBF1 | LD B,E | ||||||||||||||||||||||||||
| FBF2 | DJNZ $FBF2 | ||||||||||||||||||||||||||
| FBF4 | DEC C | ||||||||||||||||||||||||||
| FBF5 | JR NZ,$FBED | ||||||||||||||||||||||||||
| FBF7 | CALL $EA80 | Reveal a row of the play area | |||||||||||||||||||||||||
| FBFA | POP HL | Restore the SRB pointer to HL | |||||||||||||||||||||||||
| FBFB | POP BC | Restore the screen row counter to C | |||||||||||||||||||||||||
| FBFC | DEC C | Have we revealed all 20 rows yet? | |||||||||||||||||||||||||
| FBFD | JR NZ,$FBDB | Jump back to reveal the next row if not | |||||||||||||||||||||||||
| FBFF | RET | ||||||||||||||||||||||||||
| Prev: FB4B | Up: Map | Next: FC00 |