mlu.s 658 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. .define .mlu
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. ! entry : d0 multiplicand
  7. ! d1 multiplier
  8. ! exit : d0 high order result
  9. ! d1 low order result
  10. .sect .text
  11. .mlu:
  12. movem.l d3/d4/d6,-(sp)
  13. move.l 16(sp),d1
  14. move.l 20(sp),d0
  15. cmp.l #32768,d0
  16. bgt 1f
  17. cmp.l #32768,d1
  18. bls 2f
  19. 1:
  20. move.l d1,d3
  21. move.l d1,d2
  22. swap d2
  23. move.l d2,d4
  24. mulu d0,d1
  25. mulu d0,d2
  26. swap d0
  27. mulu d0,d3
  28. mulu d4,d0
  29. clr.l d6
  30. swap d1
  31. add d2,d1
  32. addx.l d6,d0
  33. add d3,d1
  34. addx.l d6,d0
  35. swap d1
  36. clr d2
  37. clr d3
  38. swap d2
  39. swap d3
  40. add.l d2,d0
  41. add.l d3,a0
  42. bra 3f
  43. 2: mulu d0,d1
  44. clr d0
  45. 3:
  46. movem.l (sp)+,d3/d4/d6
  47. move.l (sp)+,a0
  48. add #8,sp
  49. jmp (a0)
  50. .align 2