ncr.z80 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. nCrToken:
  2. push bc
  3. call ParseFullArg
  4. pop hl
  5. ld d,b \ ld e,c
  6. call ncr_HL_DE
  7. ld b,h
  8. ld c,l
  9. ret
  10. #include "math/ncr_HL_DE.z80"
  11. ; ;===============================================================
  12. ; nCrAlgorithm:
  13. ; ;===============================================================
  14. ; ;Inputs:
  15. ; ; hl is "n"
  16. ; ; de is "r"
  17. ; ;Outputs:
  18. ; ; interrupts off
  19. ; ; a is 0
  20. ; ; bc is the result
  21. ; ; de is "n"
  22. ; ; hl is the result
  23. ; ; a' is not changed
  24. ; ; bc' is "r"+1
  25. ; ; de' is an intermediate calculation
  26. ; ; hl' is "r" or the compliment, whichever is smaller
  27. ; ;===============================================================
  28. ; or a ;reset carry flag
  29. ; sbc hl,de
  30. ; ret c ;r should not be bigger than n
  31. ; di
  32. ; sbc hl,de \ add hl,de
  33. ; jr nc,$+3
  34. ; ex de,hl ;hl is R
  35. ;
  36. ; push de
  37. ; ld bc,1 ;A
  38. ; exx
  39. ; pop de ;N
  40. ; ld bc,1 ;C
  41. ; ld h,b \ ld l,c ;D
  42. ; nCrLoop:
  43. ; push de
  44. ; push hl
  45. ; call DE_Times_BC
  46. ; push hl \ exx \ pop de
  47. ; push hl
  48. ; call DE_Div_BC
  49. ; pop de
  50. ; push hl \ ex de,hl \ exx \ pop hl
  51. ; ld b,h \ ld c,l
  52. ; pop de \ add hl,de
  53. ; pop de \ inc de
  54. ; exx
  55. ; inc bc
  56. ; or a \ sbc hl,bc \ add hl,bc
  57. ; exx
  58. ; jr nc,nCrLoop
  59. ; ld b,h \ ld c,l
  60. ; ret