rmi2.s 552 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. .define .rmi2
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! 16-bit signed remainder
  8. ! parameters:
  9. ! bc: divisor
  10. ! de: dividend
  11. ! de: result (out)
  12. ! no check on overflow
  13. .rmi2:
  14. xor a
  15. ld h,a
  16. ld l,a
  17. sbc hl,bc
  18. jp m,1f
  19. ld b,h
  20. ld c,l
  21. 1:
  22. or a
  23. ld hl,0
  24. sbc hl,de
  25. jp m,1f
  26. ex de,hl
  27. cpl
  28. 1:
  29. push af
  30. ld hl,0
  31. ld a,16
  32. 0:
  33. add hl,hl
  34. ex de,hl
  35. add hl,hl
  36. ex de,hl
  37. jr nc,1f
  38. inc hl
  39. or a
  40. 1:
  41. sbc hl,bc
  42. inc de
  43. jp p,2f
  44. add hl,bc
  45. dec de
  46. 2:
  47. dec a
  48. jr nz,0b
  49. ex de,hl
  50. pop af
  51. or a
  52. jr z,1f
  53. ld hl,0
  54. sbc hl,de
  55. ex de,hl
  56. 1:
  57. ret