dvi4.s 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. .define .dvi4
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! 4-byte divide routine for z80
  8. ! parameters:
  9. ! stack: divisor
  10. ! dividend
  11. ! stack: quotient (out)
  12. ! bc de: remainder (out) (high part in bc)
  13. .dvi4:
  14. pop hl
  15. ld (retaddr),hl
  16. xor a
  17. ld (.flag1),a
  18. ld (.flag2),a
  19. ld ix,0
  20. add ix,sp
  21. ld b,(ix+7) ! dividend
  22. bit 7,b
  23. jr z,1f
  24. ld c,(ix+6)
  25. ld d,(ix+5)
  26. ld e,(ix+4)
  27. call .negbd
  28. ld (ix+7),b
  29. ld (ix+6),c
  30. ld (ix+5),d
  31. ld (ix+4),e
  32. ld a,1
  33. ld (.flag1),a
  34. 1:
  35. ld b,(ix+3)
  36. bit 7,b
  37. jr z,2f
  38. call .negst
  39. ld a,1
  40. ld (.flag2),a
  41. 2:
  42. call .dvu4
  43. ld a,(.flag1)
  44. or a
  45. jr z,3f
  46. call .negbd
  47. 3:
  48. ld (.savebc),bc
  49. ld (.savede),de
  50. ld a,(.flag2)
  51. ld b,a
  52. ld a,(.flag1)
  53. xor b
  54. jr z,4f
  55. call .negst
  56. 4:
  57. ld bc,(.savebc)
  58. ld de,(.savede)
  59. ld hl,(retaddr)
  60. jp (hl)
  61. .negbd:
  62. xor a
  63. ld h,a
  64. ld l,a
  65. sbc hl,de
  66. ex de,hl
  67. ld h,a
  68. ld l,a
  69. sbc hl,bc
  70. ld b,h
  71. ld c,l
  72. ret
  73. .negst:
  74. pop ix
  75. pop de
  76. pop bc
  77. call .negbd
  78. push bc
  79. push de
  80. jp (ix)
  81. .sect .data
  82. .flag1: .data1 0
  83. .flag2: .data1 0
  84. retaddr:.data2 0
  85. .savebc: .data2 0
  86. .savede: .data2 0