123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- .define .mlu2
- .sect .text
- .sect .rom
- .sect .data
- .sect .bss
- .sect .text
- ! 16 bits unsigned multiply routine
- ! Expects operands on stack
- ! Yields result in de-registers
- ! This routine could also be used for signed integers, but it won't
- ! because there is a more clever one just for signed integers.
- .mlu2:
- pop h
- shld .retadr
- mov h,b
- mov l,c
- shld .bcreg
- pop b ! bc = multiplier
- pop d ! de = multiplicand
- lxi h,0 ! hl = product
- 1: mov a,b ! if multiplier = 0 then finished
- ora c
- jz 3f
- xra a ! reset carry
- mov a,b ! shift multiplier right
- rar
- mov b,a
- mov a,c
- rar
- mov c,a
- jnc 2f !if carry set: add multiplicand to product
- dad d
- 2: xchg ! shift multiplicand left
- dad h
- xchg
- jmp 1b ! keep looping
- 3: xchg ! de becomes product
- lhld .bcreg
- mov b,h
- mov c,l
- lhld .retadr
- pchl
|