dvi2.s 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. .define .dvi2
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! 16 bits signed and unsigned integer divide and remainder routine
  8. ! Bit 0 of a-reg is set iff quotient has to be delivered
  9. ! Bit 7 of a-reg is set iff the operands are signed, so:
  10. ! Expects in a-reg: 0 if called by rmu 2
  11. ! 1 if called by dvu 2
  12. ! 128 if called by rmi 2
  13. ! 129 if called by dvi 2
  14. ! Expects on stack: divisor
  15. ! dividend
  16. ! Yields in de-reg: quotient or remainder
  17. .dvi2: pop h
  18. shld .retadr
  19. mov h,b
  20. mov l,c
  21. shld .bcreg
  22. sta .areg
  23. pop b ! bc = divisor
  24. mov a,b ! trap if divisor = 0
  25. ora c
  26. cz eidivz
  27. pop d ! de = dividend
  28. mvi h,0
  29. lda .areg
  30. ral
  31. jnc 0f ! jump if unsigned
  32. mov a,d
  33. ral
  34. jnc 1f ! jump if dividend >= 0
  35. mvi h,129 ! indicate dividend is negative
  36. xra a ! negate dividend
  37. sub e
  38. mov e,a
  39. mvi a,0
  40. sbb d
  41. mov d,a
  42. ! de is positive now
  43. 1: mov a,b
  44. ral
  45. jc 2f ! jump if divisor < 0
  46. 0: inr h ! indicate negation
  47. xra a ! negate divisor
  48. sub c
  49. mov c,a
  50. mvi a,0
  51. sbb b
  52. mov b,a
  53. ! bc is negative now
  54. 2: push h ! save h-reg
  55. lxi h,0 ! initial value of remainder
  56. mvi a,16 ! initialize loop counter
  57. 3: push psw ! save loop counter
  58. dad h ! shift left: hl <- de <- 0
  59. xchg
  60. dad h
  61. xchg
  62. jnc 4f
  63. inx h
  64. 4: push h ! save remainder
  65. dad b ! subtract divisor (add negative)
  66. jnc 5f
  67. xthl
  68. inx d
  69. 5: pop h
  70. pop psw ! restore loop counter
  71. dcr a
  72. jnz 3b
  73. pop b ! b-reg becomes what once was h-reg
  74. lda .areg
  75. rar ! what has to be delivered: quotient or remainder?
  76. jnc 6f
  77. ! for dvi 2 and dvu 2 only:
  78. mov a,b
  79. rar
  80. jc 8f ! jump if divisor and dividend had same sign
  81. xra a ! negate quotient
  82. sub e
  83. mov e,a
  84. mvi a,0
  85. sbb d
  86. mov d,a
  87. jmp 8f
  88. ! for rmi 2 and rmu 2 only:
  89. 6: mov a,b
  90. ral
  91. jnc 7f ! negate remainder if dividend was negative
  92. xra a
  93. sub l
  94. mov l,a
  95. mvi a,0
  96. sbb h
  97. mov h,a
  98. 7: mov d,h ! return remainder
  99. mov e,l
  100. 8: lhld .bcreg
  101. mov b,h
  102. mov c,l
  103. lhld .retadr
  104. pchl