mli4.s 962 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. .define .mli4
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! 32 bits signed and unsigned integer multiply routine
  8. ! Expects operands on stack
  9. ! Yields product on stack
  10. .mli4: pop h
  11. shld .retadr
  12. mov h,b
  13. mov l,c
  14. shld .bcreg
  15. pop h ! store multiplier
  16. shld block1
  17. pop h
  18. shld block1+2
  19. pop h ! store multiplicand
  20. shld block2
  21. pop h
  22. shld block2+2
  23. lxi h,0
  24. shld block3 ! product = 0
  25. shld block3+2
  26. lxi b,0
  27. lp1: lxi h,block1
  28. dad b
  29. mov a,m ! get next byte of multiplier
  30. mvi b,8
  31. lp2: rar
  32. jnc 2f
  33. lhld block2 ! add multiplicand to product
  34. xchg
  35. lhld block3
  36. dad d
  37. shld block3
  38. lhld block2+2
  39. jnc 1f
  40. inx h
  41. 1: xchg
  42. lhld block3+2
  43. dad d
  44. shld block3+2
  45. 2: lhld block2 ! shift multiplicand left
  46. dad h
  47. shld block2
  48. lhld block2+2
  49. jnc 3f
  50. dad h
  51. inx h
  52. jmp 4f
  53. 3: dad h
  54. 4: shld block2+2
  55. dcr b
  56. jnz lp2
  57. inr c
  58. mov a,c
  59. cpi 4
  60. jnz lp1
  61. lhld block3+2
  62. push h
  63. lhld block3
  64. push h
  65. lhld .bcreg
  66. mov b,h
  67. mov c,l
  68. lhld .retadr
  69. pchl