| Routines

30A9: THE 'HL=HL*DE' SUBROUTINE

This subroutine is called by GET_HLxDE and by multiply to perform the 16-bit multiplication as stated. Any overflow of the 16 bits available is dealt with on return from the subroutine.
Input
DE | First number (M)
HL | Second number (N)
Output
HL | M*N
HL_HLxDE | 30A9 | PUSH BC | BC is saved.
| 30AA | LD B,$10 | It is to be a 16-bit multiplication.
| 30AC | LD A,H | A holds the high byte.
| 30AD | LD C,L | C holds the low byte.
| 30AE | LD HL,$0000 | Initialise the result to zero.
HL_LOOP | 30B1 | ADD HL,HL | Double the result.
| 30B2 | JR C,HL_END | Jump if overflow.
| 30B4 | RL C | Rotate bit 7 of C into the carry.
| 30B6 | RLA | Rotate the carry bit into bit 0 and bit 7 into the carry flag.
| 30B7 | JR NC,HL_AGAIN | Jump if the carry flag is reset.
| 30B9 | ADD HL,DE | Otherwise add DE in once.
| 30BA | JR C,HL_END | Jump if overflow.
HL_AGAIN | 30BC | DJNZ HL_LOOP | Repeat until 16 passes have been made.
HL_END | 30BE | POP BC | Restore BC.
| 30BF | RET | Finished.