12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- nCrToken:
- push bc
- call ParseFullArg
- pop hl
- ld d,b \ ld e,c
- call ncr_HL_DE
- ld b,h
- ld c,l
- ret
- #include "math/ncr_HL_DE.z80"
- ; ;===============================================================
- ; nCrAlgorithm:
- ; ;===============================================================
- ; ;Inputs:
- ; ; hl is "n"
- ; ; de is "r"
- ; ;Outputs:
- ; ; interrupts off
- ; ; a is 0
- ; ; bc is the result
- ; ; de is "n"
- ; ; hl is the result
- ; ; a' is not changed
- ; ; bc' is "r"+1
- ; ; de' is an intermediate calculation
- ; ; hl' is "r" or the compliment, whichever is smaller
- ; ;===============================================================
- ; or a ;reset carry flag
- ; sbc hl,de
- ; ret c ;r should not be bigger than n
- ; di
- ; sbc hl,de \ add hl,de
- ; jr nc,$+3
- ; ex de,hl ;hl is R
- ;
- ; push de
- ; ld bc,1 ;A
- ; exx
- ; pop de ;N
- ; ld bc,1 ;C
- ; ld h,b \ ld l,c ;D
- ; nCrLoop:
- ; push de
- ; push hl
- ; call DE_Times_BC
- ; push hl \ exx \ pop de
- ; push hl
- ; call DE_Div_BC
- ; pop de
- ; push hl \ ex de,hl \ exx \ pop hl
- ; ld b,h \ ld c,l
- ; pop de \ add hl,de
- ; pop de \ inc de
- ; exx
- ; inc bc
- ; or a \ sbc hl,bc \ add hl,bc
- ; exx
- ; jr nc,nCrLoop
- ; ld b,h \ ld c,l
- ; ret
|