| Routines

77D3: Deal with Sam when he's on the phone

Used by the routine at 74D8 when bit 4 at 7FFC is set (by the routine at 76FA), indicating that Sam is on the phone.
77D3 | LD HL,$7F9B | The telephone call status flags are stored at 7F9B
77D6 | BIT 6,(HL) | Has someone asked Sam 'WHO'S THERE?'
77D8 | JP NZ,$776F | Jump if so
77DB | BIT 1,(HL) | Is the telephone call still in progress?
77DD | JR Z,$77E3 | Jump if so
77DF | CALL $F1E3 | Hang up if 'h' was pressed
77E2 | RET |
The telephone call is still in progress.
77E3 | BIT 7,(HL) | Has Sam picked up a telephone that was ringing?
77E5 | JR Z,$77F3 | Jump if not
77E7 | CALL $F1E3 | Hang up if 'h' was pressed
77EA | LD A,($7FD3) | A=ID of the telephone that Sam is holding
77ED | LD HL,$6B4B | The ringing phone location table is at 6B4B
77F0 | JP $77A3 | Check whether there is a message for Sam
77F3 | BIT 5,(HL) | Is the destination telephone ringing?
77F5 | JR Z,$7806 | Jump if not
77F7 | CALL $F1E3 | Hang up if 'h' was pressed
77FA | CALL $772F | Is the telephone that Sam is calling either off-screen or close enough to a character that can pick it up?
77FD | RET NC | Return if not
77FE | LD A,($7F9A) | A=ID of the telephone that Sam is calling
7801 | LD HL,$6B72 | The phone message table is at 6B72
7804 | JR $77F0 | Check whether Sam has called someone who has a message for him
Sam is still dialling the telephone number.
7806 | BIT 4,(HL) | Are we currently making the sound effect of a digit being dialled?
7808 | JR NZ,$7830 | Jump if so
780A | CALL $F1E3 | Check for keypresses and hang up if 'h' was pressed
780D | RET Z | Return if no key with an ASCII code in the range 0x30-0x7F was pressed
780E | CP $3A | Was the ASCII code of the keypress greater than 0x39 ('9')?
7810 | RET NC | Return if so
7811 | CP $30 | Was the ASCII code less than 0x30 ('0')?
7813 | RET C | Return if so
7814 | LD HL,$7F91 | Store the ASCII code of the digit in the first available space at 7F92
7817 | INC L
7818 | BIT 5,(HL)
781A | JR NZ,$7817
781C | LD (HL),A
781D | SUB $30 | A=digit that was dialled (0-9)
781F | JR NZ,$7823 | Jump unless '0' was dialled
7821 | LD A,$0A | The digit '0' will give 10 clicks
7823 | INC A | A=1-11
7824 | LD ($E614),A | Store this in byte 0x14 of Sam's buffer
7827 | LD L,$9B | HL=7F9B (telephone call status flags)
7829 | LD (HL),$10 | Set bit 4
782B | LD A,$2A | Message 0x2A: 'I DIALLED {number}'
782D | JP $75CA | Queue this message urgently
The sound effect of a digit being dialled is currently in progress.
7830 | LD HL,$E608 | Set Sam's main action timer (in byte 0x08 of his buffer) to 3
7833 | LD (HL),$03
7835 | LD L,$14 | Point HL at byte 0x14 of Sam's buffer
7837 | DEC (HL) | Are there any more clicks to make?
7838 | JP NZ,$EC69 | Make a click if so
Sam has finished dialling a digit of the telephone number. Check whether the number dialled so far is valid.
783B | LD HL,$7F9B | Clear all the telephone call status flags at 7F9B
783E | LD (HL),$00
7840 | LD L,$92 | Collect the ASCII code of the first digit that was dialled from 7F92
7842 | LD A,(HL)
7843 | CP $30 | Was it '0'?
7845 | JR Z,$7861 | Jump if so (no telephone numbers start with 0)
7847 | INC L | Add the ASCII codes of the second and third digits to the first
7848 | ADD A,(HL)
7849 | INC L
784A | ADD A,(HL)
784B | INC L | Point HL at the fourth digit
784C | CP $AB | Set the zero flag if '999' was dialled
784E | LD A,$70 | 0x70 is the ID of the telephone in the police station
7850 | JR Z,$785A | Jump if Sam has dialled the police
7852 | BIT 5,(HL) | Has Sam dialled four digits yet?
7854 | RET Z | Return if not
7855 | CALL $7A17 | Has Sam dialled a valid telephone number?
7858 | JR NZ,$7861 | Jump if not
785A | LD HL,$7FD3 | 7FD3 holds the ID of the telephone Sam is holding
785D | CP (HL) | Does it match the ID of the telephone Sam is calling?
785E | JP NZ,$7A0C | Jump if not to place the call
7861 | LD A,$2F | Message 0x2F: ' THE NUMBER WAS UNOBTAINABLE'
7863 | JP $7799 | Disconnect the call and queue this message urgently