I know. it doesn't change anything though.
Imagine the following code:
PUSH HL
RET
Which, effectively, jumps to HL via the stack.
Now imagine the same code, but that an interrupt occurs right between the two commands:
Before the interrupt, HL is on the top of the stack.
*interrupt occurs*
The Z80 PUSHes the return address so that becomes the top of the stack. A well behaved ISR can PUSH/POP whatever it likes and as long as the sequence is balanced it will end with the return address at the top of the stack.
Finally the ISR does a RET, popping it's return address off the stack. At this point the value of HL will once again be the value on the stack
*interrupt handling complete*
The previous code continues at the RET, which fetches HL from the stack and jumps to it.
The sequence for the interrupted code is logically the same regardless of if/when an interrupt occurs. This will always be the case as long as the following are true:
* The stack hasn't been moved to point at memory that mustn't (or can't) be written too.
* The ISR doesn't trash any registers (unless the overall system design allows it to - f.e. reserving the alternate register set for ISRs)
* There is sufficient stack space so the it doesn't clobber something else (or worse some other called code clobbers the stack)